Compare commits

...

1418 Commits

Author SHA1 Message Date
Arik Fraimovich
869c060f5a Merge pull request #1017 from getredash/fix/ds_cli
Add data source to default group when creating with CLI
2016-04-29 16:11:30 +03:00
Arik Fraimovich
b9322004f8 Add data source to default group when creating with CLI 2016-04-29 16:08:23 +03:00
Arik Fraimovich
7b5d16ef6c Merge pull request #1005 from staritza/master
Update bootstrap.sh to include saml dependency
2016-04-25 23:44:39 +03:00
Arik Fraimovich
d331285c1f Merge pull request #980 from machira/master
Add environment variable to override secure_flag on session cookie
2016-04-21 19:16:40 +03:00
Ama A
aab0542a93 Update bootstrap.sh to include saml dependency
Required for saml to work
2016-04-20 14:17:10 -05:00
Arik Fraimovich
1f824fc5e3 Merge pull request #957 from gseva:dashboard-permissions
Hide dashboards that current user cannot see based on his groups
2016-04-20 20:18:19 +03:00
Raymond Machira
c19a0209eb Make secure_flag environment var default to Enforce HTTPs
Also wraps parse_boolean around the os.get call for the secure_flag variable
2016-04-20 11:01:37 -05:00
Arik Fraimovich
5bd133ca50 Add additional tests 2016-04-20 18:30:31 +03:00
Arik Fraimovich
3ce07782ad Fix #986: search might return duplicate queries 2016-04-20 17:54:20 +03:00
Arik Fraimovich
078fd96660 Record event when opening shared dashboard 2016-04-20 17:54:20 +03:00
Arik Fraimovich
5fe70b7aff Record event when opening visualization embed (closes #971). 2016-04-20 17:54:20 +03:00
Arik Fraimovich
ad445ef40d Fix: don't show viz edit button if user can't edit 2016-04-20 17:54:20 +03:00
Arik Fraimovich
61aca53300 Show query description only if enabled 2016-04-20 17:54:20 +03:00
Arik Fraimovich
6881da930b Fix #996: only show edit controls if user can edit 2016-04-20 17:54:20 +03:00
Arik Fraimovich
d9a8b25430 Fix #994: query description was rendered with bigger font than name 2016-04-20 17:54:20 +03:00
Antoine Augusti
8c77d77668 Mention how to use some special features 2016-04-20 17:54:20 +03:00
Antoine Augusti
5cef835a78 Specify the user to use when using the provided AMIs 2016-04-20 17:54:20 +03:00
Arik Fraimovich
3c0fc3b134 Feature: running queries (tasks) monitor
- Refactored tasks module into a package.
- Add new admins screens (running queries & outdated queries).
2016-04-20 17:54:20 +03:00
Arik Fraimovich
a9cab5fd46 Avoid drawing chart before there is data 2016-04-20 17:54:20 +03:00
Arik Fraimovich
152109a8ef use ng-src to avoid errors before scope is available 2016-04-20 17:54:20 +03:00
Arik Fraimovich
4ed1db3ccd Show message if dashboard is archived 2016-04-20 17:54:20 +03:00
Arik Fraimovich
b4af116fc5 Fix: new user form was in wrong scope 2016-04-20 17:54:20 +03:00
Arik Fraimovich
20f6993c8b Fix: embeds got broken due to missing inject 2016-04-20 17:54:20 +03:00
Arik Fraimovich
15c032668b Add material font to gulpfile 2016-04-20 17:54:20 +03:00
Arik Fraimovich
0f20f8d5f9 Fix #779: use the default chart type for new series 2016-04-20 17:54:20 +03:00
Arik Fraimovich
fc0dd22e03 Remove angular-plotly and use Plotly's autoresize 2016-04-20 17:54:20 +03:00
Arik Fraimovich
ae98bf9f60 Remove Plotly legend height workaround and use official support for scrolling. 2016-04-20 17:54:20 +03:00
Arik Fraimovich
a426002adf Switch to official Plotly.js bower distribution and use latest version. 2016-04-20 17:54:20 +03:00
Arik Fraimovich
2e9c6dd05d bower.json: move bootstrap version to correct location 2016-04-20 17:54:20 +03:00
Arik Fraimovich
509b8afefc Add documentation on permissions model 2016-04-20 17:54:20 +03:00
Arik Fraimovich
43fb88d49b Add Slack to list of contact methods 2016-04-20 17:54:20 +03:00
Arik Fraimovich
2bd60663b9 Update name in conf.py 2016-04-20 17:54:20 +03:00
Arik Fraimovich
accb3d973d Docs: re:dash -> Re:dash & new screenshots 2016-04-20 17:54:20 +03:00
Arik Fraimovich
807df66ae9 Refine docker instructions 2016-04-20 17:54:20 +03:00
Antoine Augusti
bdfb2e9e63 Snake case it is 2016-04-20 17:54:20 +03:00
Antoine Augusti
3d946b9a36 Clean code 2016-04-20 17:54:20 +03:00
Antoine Augusti
9ebd7c8f04 Add a command to send an invitation link to a user 2016-04-20 17:54:20 +03:00
Arik Fraimovich
222eb369ca Change logoUrl to logo_url to comply w/ code style 2016-04-20 17:54:20 +03:00
Arik Fraimovich
d8207241b7 New design 🎉 and UX improvements! In more detail:
- Based on the SuperFlat admin theme (I bought the extended license).
- All pages are now full-width to give your data the room it deserves.
- Various UX improvements (althuogh there is still room for improvement).
2016-04-20 17:54:20 +03:00
Antoine Augusti
2f94a21bd0 Inject variables with app context and ability to change the logo 2016-04-20 17:54:20 +03:00
tdawber
1233706aac Add link to embeds to open query in new window 2016-04-20 17:54:20 +03:00
Arik Fraimovich
0fb17c5478 Fix #958: group members/datasources were cached. 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
b74db8148d Correct ports per installation strategy used 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
d1b979b64e Add more instructions on getting started. 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
bf47e57abc Remove extra gif 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
f8161dc9a5 Add second demo 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
3fccd23a62 Add missing ) 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
2888f0dbf4 Add documentation link at the top 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
3b4bb6a557 Add gitter chat button 2016-04-20 17:54:20 +03:00
Arik Fraimovich
346b31d39e Add support for using Redis via unix socket 2016-04-20 17:54:20 +03:00
Arik Fraimovich
1d2425e002 Ability to disable some query runners 2016-04-20 17:54:20 +03:00
Arik Fraimovich
bee6a6d80b Friendlier name for MySQL query runner 2016-04-20 17:54:20 +03:00
Arik Fraimovich
515b52196c Allow toggling dashboard full screen from URL 2016-04-20 17:54:20 +03:00
Andrew Davison
02601ace68 Release download path must use the version, not the branch 2016-04-20 17:54:20 +03:00
Andrew Davison
5cb03baa95 Use a REDASH_BRANCH environment variable instead, in the same way as REDASH_VERSION.
Move REDASH_VERSION var setup to top of file where it is more visible and easier to update.
2016-04-20 17:54:20 +03:00
Arik Fraimovich
fac8295aaf Use ng-if instead of ng-show for schema 2016-04-20 17:54:20 +03:00
Arik Fraimovich
fd913402bc Fix: on first save, make sure we load alredy existing data 2016-04-20 17:54:20 +03:00
Arik Fraimovich
7f7ab39329 Fix mobile state of query page 2016-04-20 17:54:20 +03:00
Andrew Davison
23c7218195 Allow passing version to bootstrap.sh as a cli parameter, to download a specific tag's setup files. 2016-04-20 17:54:20 +03:00
Andrew Davison
2a559d6452 Fix "http directive is not allowed here" 2016-04-20 17:54:20 +03:00
Sam Ehlers
3a8af1e4c7 Fixed error when result doesn't contain series 2016-04-20 17:54:20 +03:00
Sam Ehlers
3c2877123f Fixed error when series doesn't have tags 2016-04-20 17:54:20 +03:00
Sam Ehlers
ebb07946ac Added support for multiple queries and tags
Multiple queries are separated by semicolons and could possibly have
different columns and tags.
https://docs.influxdata.com/influxdb/v0.11/guides/querying_data/#multiple-queries

Tags come in to the result set when you use a GROUP BY statement.
2016-04-20 17:54:20 +03:00
Arik Fraimovich
afd009e540 When opening a query page, don't automatically execute it 2016-04-20 17:54:20 +03:00
Arik Fraimovich
5d86d34b4e Fix: show notifications only when page in background 2016-04-20 17:54:20 +03:00
Arik Fraimovich
8b5673e973 Ask for notification permissions only on query execution 2016-04-20 17:54:20 +03:00
Arik Fraimovich
50c043ca54 Split colors palette to base and additional 2016-04-20 17:54:20 +03:00
chiragkparmar@gmail.com
42fdfdeb97 Update color palette to add more pretty colors
Inspired from ggplot2 color palette, update ColorPalette to make charts
more pretty.
2016-04-20 17:54:20 +03:00
Arik Fraimovich
cc51baabce Move buttons in the query page 2016-04-20 17:54:20 +03:00
Alex DeBrie
586f035a5c Prevent schemas from expanding on search 2016-04-20 17:54:20 +03:00
Andrea Leesley
d3c47e5bf3 Adjust query info ui. 2016-04-20 17:54:20 +03:00
Andrea Leesley
cfc064ef48 Make query results full width. 2016-04-20 17:54:20 +03:00
Andrea Leesley
36b471f26d Move the schema container to the right.
- Clean up ui on the new query page.
2016-04-20 17:54:20 +03:00
atharva.inamdar
96a0fe8ed8 updated query search bar visibility threshold to 500 2016-04-20 17:54:20 +03:00
Alexander Leibzon
f33a2fcaa9 code style, name method 2016-04-20 17:54:20 +03:00
Alexander Leibzon
073182612b requirements rearrangement 2016-04-20 17:54:20 +03:00
Alexander Leibzon
d3d6121fc0 fixes 2016-04-20 17:54:20 +03:00
Alexander Leibzon
0b222498e7 the dynamoDB SQL connector 2016-04-20 17:54:20 +03:00
Alexander Leibzon
1b3fe9dde2 add requirements 2016-04-20 17:54:20 +03:00
Alexander Leibzon
ccf6c0ede6 dynamodb SQL connector 2016-04-20 17:54:20 +03:00
John Katsnelson
07f18cbe0c docker-compose ls should be docker-machine ls 2016-04-20 17:54:20 +03:00
John Katsnelson
619b4ec32d adds basic docker compose instructions 2016-04-20 17:54:20 +03:00
Arik Fraimovich
b73fdf1f33 Merge pull request #1003 from getredash/feature/embed_event
Fix #986: search might return duplicate queries
2016-04-20 17:14:05 +03:00
Arik Fraimovich
10f12e5008 Fix #986: search might return duplicate queries 2016-04-20 17:09:59 +03:00
Arik Fraimovich
ff9336907e Merge pull request #1002 from getredash/feature/embed_event
Feature: record events for embed and shared dashboard open
2016-04-20 16:25:45 +03:00
Arik Fraimovich
fe54e63dd3 Record event when opening shared dashboard 2016-04-20 16:23:00 +03:00
Arik Fraimovich
17d371379b Record event when opening visualization embed (closes #971). 2016-04-20 16:15:31 +03:00
Arik Fraimovich
0908e222a6 Merge pull request #1000 from getredash/fix/edit_button
Fix: don't show visualization edit button if user can't edit it.
2016-04-19 14:14:37 +03:00
Arik Fraimovich
dbfe6c385c Fix: don't show viz edit button if user can't edit 2016-04-19 14:11:50 +03:00
Arik Fraimovich
e63220cc3a Merge pull request #998 from getredash/fix/embed_title
Fix #994: query description was rendered with bigger font than name
2016-04-18 22:10:30 +03:00
Arik Fraimovich
07ccd0986d Show query description only if enabled 2016-04-18 22:08:32 +03:00
Arik Fraimovich
9e96b7f81e Merge pull request #999 from getredash/fix/empty_dropdown
Fix #996: only show dashboard edit controls if user can edit
2016-04-18 18:46:40 +03:00
Arik Fraimovich
a9ccdc79a4 Fix #996: only show edit controls if user can edit 2016-04-18 18:43:56 +03:00
Arik Fraimovich
3ad726e87f Fix #994: query description was rendered with bigger font than name 2016-04-18 18:36:42 +03:00
Arik Fraimovich
2655eec907 Merge pull request #997 from AntoineAugusti/additional-documentation
Additional documentation
2016-04-18 18:09:36 +03:00
Antoine Augusti
1d54bf000b Mention how to use some special features 2016-04-18 17:00:23 +02:00
Antoine Augusti
2e45b67e11 Specify the user to use when using the provided AMIs 2016-04-18 15:39:42 +02:00
Arik Fraimovich
30227f4815 Merge pull request #856 from getredash/feature/task_monitoring
Feature: running queries monitor
2016-04-18 13:49:55 +03:00
Arik Fraimovich
d38ab20c45 Feature: running queries (tasks) monitor
- Refactored tasks module into a package.
- Add new admins screens (running queries & outdated queries).
2016-04-18 13:46:31 +03:00
Arik Fraimovich
c17ba03a20 Merge pull request #992 from getredash/fix/2016-04-17
Small UI fixes
2016-04-17 18:15:51 +03:00
Arik Fraimovich
ff641440aa Avoid drawing chart before there is data 2016-04-17 18:12:12 +03:00
Arik Fraimovich
505f807e5a use ng-src to avoid errors before scope is available 2016-04-17 18:08:09 +03:00
Arik Fraimovich
eb61caa6b8 Show message if dashboard is archived 2016-04-17 18:05:15 +03:00
Arik Fraimovich
cbc58ba594 Fix: new user form was in wrong scope 2016-04-17 17:57:25 +03:00
Arik Fraimovich
8b4e8729dd Fix: embeds got broken due to missing inject 2016-04-17 14:30:02 +03:00
Arik Fraimovich
3925c48d14 Add material font to gulpfile 2016-04-17 12:26:48 +03:00
Arik Fraimovich
376199957e Merge pull request #991 from getredash/plotly
Improvements to Plotly.js integration
2016-04-17 12:13:57 +03:00
Arik Fraimovich
cf2407b69b Fix #779: use the default chart type for new series 2016-04-17 11:58:29 +03:00
Arik Fraimovich
c51779708e Remove angular-plotly and use Plotly's autoresize 2016-04-17 11:58:00 +03:00
Arik Fraimovich
9cded144e6 Remove Plotly legend height workaround and use official support for scrolling. 2016-04-17 11:12:33 +03:00
Arik Fraimovich
1dd8b6293b Switch to official Plotly.js bower distribution and use latest version. 2016-04-17 11:12:09 +03:00
Arik Fraimovich
3881eaa72e bower.json: move bootstrap version to correct location 2016-04-17 11:12:03 +03:00
Arik Fraimovich
6db399893b Add documentation on permissions model 2016-04-17 09:45:52 +03:00
Arik Fraimovich
a98c45f649 Add Slack to list of contact methods 2016-04-17 09:24:21 +03:00
Arik Fraimovich
8e9cced4c5 Update name in conf.py 2016-04-15 23:27:29 +03:00
Arik Fraimovich
05eb9685ee Docs: re:dash -> Re:dash & new screenshots 2016-04-15 23:26:21 +03:00
Arik Fraimovich
7f920f352a Refine docker instructions 2016-04-15 23:14:14 +03:00
Arik Fraimovich
874793e4b0 Merge pull request #977 from ChiragKParmar/master
Adding two badges for better visibility.
2016-04-15 23:13:29 +03:00
Arik Fraimovich
6e440d8263 Merge pull request #911 from jkatsnelson/patch-1
Docs: Docker compose instructions
2016-04-15 22:45:17 +03:00
Arik Fraimovich
235109c3f7 Merge pull request #984 from getredash/surprise
New design 🎉 and UX improvements!
2016-04-15 18:59:04 +03:00
Arik Fraimovich
c7f2217f15 Merge pull request #988 from AntoineAugusti/cli-invite-user
Feature: add CLI to invite user
2016-04-15 18:54:52 +03:00
Antoine Augusti
25cfa04a2b Snake case it is 2016-04-15 17:34:57 +02:00
Antoine Augusti
a8758c3a5f Clean code 2016-04-15 16:38:05 +02:00
Antoine Augusti
e015adba7e Add a command to send an invitation link to a user 2016-04-15 15:55:52 +02:00
Arik Fraimovich
38b603b28c Change logoUrl to logo_url to comply w/ code style 2016-04-14 22:31:02 +03:00
Arik Fraimovich
44f8ccfd75 New design 🎉 and UX improvements! In more detail:
- Based on the SuperFlat admin theme (I bought the extended license).
- All pages are now full-width to give your data the room it deserves.
- Various UX improvements (althuogh there is still room for improvement).
2016-04-14 22:27:26 +03:00
Arik Fraimovich
6cc2cf765d Merge pull request #987 from AntoineAugusti/inject-app-context
Feature: ability to change logo
2016-04-14 22:18:32 +03:00
Arik Fraimovich
748f6e4f2c Merge pull request #983 from tdawber/feature/embed_open_in_redash
Add link to embeds to open query page in new window
2016-04-14 21:53:11 +03:00
Antoine Augusti
2d578247ef Inject variables with app context and ability to change the logo 2016-04-14 11:50:00 +02:00
tdawber
bde60d5919 Add link to embeds to open query in new window 2016-04-12 12:02:02 +10:00
Raymond Machira
17ca702cb3 Add environment variable to override secure_flag on session cookie 2016-04-11 13:02:29 -05:00
Arik Fraimovich
c80728c3fa Merge pull request #978 from getredash/fix958
Fix #958: group members/datasources were cached.
2016-04-10 11:28:28 +03:00
Arik Fraimovich
39a832aff5 Fix #958: group members/datasources were cached. 2016-04-10 11:26:33 +03:00
chiragkparmar@gmail.com
f3a12d20f8 Correct ports per installation strategy used 2016-04-08 12:41:29 -04:00
chiragkparmar@gmail.com
0743c4a532 Add more instructions on getting started. 2016-04-07 18:32:01 -04:00
chiragkparmar@gmail.com
1169ed2542 Remove extra gif 2016-04-07 18:19:31 -04:00
chiragkparmar@gmail.com
3f3a8fb903 Add second demo 2016-04-07 18:07:44 -04:00
chiragkparmar@gmail.com
8b87ac39d1 Add missing ) 2016-04-07 18:05:33 -04:00
chiragkparmar@gmail.com
4520d1889c Add documentation link at the top 2016-04-07 18:04:30 -04:00
chiragkparmar@gmail.com
57ec4bf21e Add gitter chat button 2016-04-07 17:55:32 -04:00
chiragkparmar@gmail.com
8091b546e0 Merge remote-tracking branch 'getredash/master' 2016-04-07 17:52:56 -04:00
Arik Fraimovich
d78ef8fab5 Merge pull request #974 from getredash/embed
Add support for using Redis via unix socket
2016-04-06 20:57:13 +03:00
Arik Fraimovich
31879f9f7d Add support for using Redis via unix socket 2016-04-06 20:54:21 +03:00
Arik Fraimovich
0c6317c1db Merge pull request #973 from getredash/embed
Small updates to data sources (friendlier name for MySQL, and ability to disable query runners)
2016-04-06 20:42:24 +03:00
Arik Fraimovich
eec883763a Ability to disable some query runners 2016-04-06 18:19:51 +03:00
Arik Fraimovich
85be5fb7e9 Friendlier name for MySQL query runner 2016-04-06 18:19:42 +03:00
Arik Fraimovich
2308a3af10 Merge pull request #972 from getredash/embed
Feature: allow toggling dashboard full screen from URL
2016-04-06 18:12:43 +03:00
Arik Fraimovich
db56818a52 Allow toggling dashboard full screen from URL 2016-04-06 18:02:42 +03:00
Arik Fraimovich
39315dbb18 Merge pull request #962 from handwritingio/influxdb_tags
InfluxDB: Added support for multiple queries and tags
2016-04-05 14:50:39 +03:00
Arik Fraimovich
0d9faa8c04 Merge pull request #964 from ink-adavison/bootstrap_version_parameter
Allow passing branch name to bootstrap.sh
2016-04-05 14:44:23 +03:00
Andrew Davison
70f7219057 Release download path must use the version, not the branch 2016-04-04 16:02:58 +01:00
Andrew Davison
ad2a5601bf Use a REDASH_BRANCH environment variable instead, in the same way as REDASH_VERSION.
Move REDASH_VERSION var setup to top of file where it is more visible and easier to update.
2016-04-04 15:37:38 +01:00
Arik Fraimovich
b0ea6b0f7f Merge pull request #970 from getredash/query_page
Use ng-if instead of ng-show for schema
2016-04-03 12:07:23 +03:00
Arik Fraimovich
43078f60cf Use ng-if instead of ng-show for schema 2016-04-03 12:06:52 +03:00
Arik Fraimovich
637c17bcd1 Merge pull request #969 from getredash/query_page
Fix: on first save, make sure we load alredy existing data
2016-04-03 11:08:09 +03:00
Arik Fraimovich
941657fbbc Fix: on first save, make sure we load alredy existing data 2016-04-03 10:42:48 +03:00
Arik Fraimovich
07a53d6aa8 Fix mobile state of query page 2016-04-03 10:30:53 +03:00
Arik Fraimovich
93c663d5aa Merge pull request #963 from ink-adavison/nginx_vhost_http_fix
Fix "http directive is not allowed here" on Ubuntu and Amazon Linux
2016-03-31 10:38:25 +03:00
Andrew Davison
4a401db4d2 Allow passing version to bootstrap.sh as a cli parameter, to download a specific tag's setup files. 2016-03-30 17:04:57 +01:00
Andrew Davison
90128b90e6 Fix "http directive is not allowed here" 2016-03-30 16:19:14 +01:00
Sam Ehlers
c6794dde64 Fixed error when result doesn't contain series 2016-03-30 10:17:55 -05:00
Sam Ehlers
b100824f94 Fixed error when series doesn't have tags 2016-03-30 10:17:45 -05:00
Sam Ehlers
9ff33ac024 Added support for multiple queries and tags
Multiple queries are separated by semicolons and could possibly have
different columns and tags.
https://docs.influxdata.com/influxdb/v0.11/guides/querying_data/#multiple-queries

Tags come in to the result set when you use a GROUP BY statement.
2016-03-30 09:28:24 -05:00
Arik Fraimovich
f6f9dace4d Merge pull request #960 from getredash/notification
When opening a query page, don't automatically execute it
2016-03-30 11:53:11 +03:00
Arik Fraimovich
4cc8dd1df8 When opening a query page, don't automatically execute it 2016-03-30 11:33:55 +03:00
Arik Fraimovich
52902c3f47 Merge pull request #959 from getredash/notification
Fix: show browser notification only when page is hidden
2016-03-30 11:04:32 +03:00
Arik Fraimovich
1768778d1d Fix: show notifications only when page in background 2016-03-30 11:01:11 +03:00
Arik Fraimovich
f5abb47d89 Ask for notification permissions only on query execution 2016-03-30 11:01:01 +03:00
Arik Fraimovich
ffe23fc59c Split colors palette to base and additional 2016-03-30 10:30:15 +03:00
chiragkparmar@gmail.com
d6a474b9f1 Update color palette to add more pretty colors
Inspired from ggplot2 color palette, update ColorPalette to make charts
more pretty.
2016-03-30 10:27:38 +03:00
Arik Fraimovich
c5a763b5f2 Merge pull request #932 from hudl:SkunkUI
Adjust the UI on the New Query page
2016-03-30 10:11:37 +03:00
Arik Fraimovich
aab2da2f4c Move buttons in the query page 2016-03-30 10:06:48 +03:00
Arik Fraimovich
d83dfc977e Merge pull request #934 from alexanderlz/master
Feature: DynamoDB DQL query runner
2016-03-29 22:00:32 +03:00
Seva Gavrilov
5149845eec Merge branch 'master' of github.com:gseva/redash into dashboard-permissions 2016-03-29 13:29:45 -03:00
Seva Gavrilov
c98cdef8f2 Fixed dashboard restrictions and added tests. 2016-03-29 13:27:35 -03:00
Arik Fraimovich
0f727c2424 Fix typo in requirements.txt. 2016-03-29 16:16:57 +03:00
Arik Fraimovich
982b0efbe8 Fix #946: update Python redis lib version.
Looks like some of the Celery dependencies (which we don't have pinned version for) require newer version of redis lib.
2016-03-29 16:12:24 +03:00
Arik Fraimovich
5e22576c5c Merge pull request #956 from getredash/fix/impala
Fix: adapt Impala query runner for new configuration
2016-03-29 10:38:13 +03:00
Arik Fraimovich
76c2d37d0e Fix: adapt Impala query runner for new configuration 2016-03-29 10:30:31 +03:00
Seva Gavrilov
5bb1d2757e Text only widgets are now shown to everybody. 2016-03-28 18:00:37 -03:00
Arik Fraimovich
a66ac849ff Merge pull request #951 from seanauriti/patch-1
Fixes URL for Github Release
2016-03-28 21:35:22 +03:00
Arik Fraimovich
8b4e3226a8 Merge pull request #952 from seanauriti/patch-2
Update upgrade.rst
2016-03-28 21:34:49 +03:00
Sean Auriti
00c455fea5 Update upgrade.rst 2016-03-28 13:41:21 -04:00
Sean Auriti
339c91836f Fixes URL for Github Release 2016-03-28 12:17:52 -04:00
Arik Fraimovich
0dfbe6fc72 Merge pull request #947 from getredash/fix/migration
Fix: permissions migration was changing default's group type
2016-03-27 10:32:14 +03:00
Arik Fraimovich
dd836d909d Migration to make sure the default group has correct type 2016-03-27 10:29:26 +03:00
Arik Fraimovich
6cff6e833a Fix permissions migration 2016-03-27 10:26:09 +03:00
Arik Fraimovich
5885cd9aef Merge pull request #940 from kirikiriyamama/improve_security
Nginx configuration: hide version
2016-03-25 20:16:37 +02:00
Alex DeBrie
d43d5731ee Prevent schemas from expanding on search 2016-03-24 17:00:45 +00:00
Andrea Leesley
1701d6cb60 Adjust query info ui. 2016-03-24 16:59:14 +00:00
Andrea Leesley
a9fbb1ccb2 Make query results full width. 2016-03-24 16:59:14 +00:00
Andrea Leesley
c096a133c5 Move the schema container to the right.
- Clean up ui on the new query page.
2016-03-24 16:55:49 +00:00
atharva.inamdar
be90353cca updated query search bar visibility threshold to 500 2016-03-24 16:39:19 +00:00
Seva Gavrilov
66d1bb1af6 Merge github.com:yanenok/redash into dashboard-permissions 2016-03-23 12:36:11 -03:00
Arik Fraimovich
002396117d Merge pull request #941 from kasajei/master
Fix install command for freetds-devel on amazon_linux
2016-03-23 14:58:47 +02:00
kasajei
eaaeffb8a2 Fix install command for freetds-devel on amazon_linux 2016-03-23 19:06:27 +09:00
Alexander Leibzon
7bb80e375a code style, name method 2016-03-23 11:44:57 +02:00
kirikiriyamama
3aca06b57f Remove unnecessary blanks 2016-03-23 11:16:12 +09:00
kirikiriyamama
d2a57cbf62 Improve security
Hide nginx version
2016-03-23 11:16:05 +09:00
Arik Fraimovich
70a5ffdbf5 Merge pull request #939 from AntoineAugusti/patch-1
Docs: Fix command to restart the web server
2016-03-22 11:03:52 +02:00
Antoine Augusti
a77b2168bd Fix command to restart the web server 2016-03-22 10:00:14 +01:00
Arik Fraimovich
ba3013a513 Merge pull request #883 from tsibley/remote-user-auth
Support for REMOTE_USER authentication
2016-03-22 09:53:13 +02:00
Thomas Sibley
e61a5f3567 Support for remote user authentication via a trusted request header
This allows redash to use nearly any custom authentication setup.
Authentication via the REMOTE_USER environment variable is not provided
as it's deemed unlikely to ever be used.

Note that, like existing authentication providers, if you disable
password authentication and the remote user auth is unsuccessful
(probably due to a misconfiguration), then you'll get a redirect
loop of /login ⇄  /remote_user/login.
2016-03-21 17:00:16 -07:00
Arik Fraimovich
624ebbadb9 Retain copy of the event before it's being changed 2016-03-21 14:29:07 +02:00
Arik Fraimovich
2ce6b567ca Include public.html in frontend build 2016-03-21 13:12:01 +02:00
Arik Fraimovich
70e2b5de23 Merge pull request #938 from getredash/api_key_name
Fix: event reporting breaks when using ApiUser.
2016-03-21 12:49:40 +02:00
Arik Fraimovich
c3299ff0e6 Fix: event reporting breaks when using ApiUser. 2016-03-21 12:40:23 +02:00
Arik Fraimovich
0ec8c3e0b9 Add find_by_email method to User model 2016-03-21 10:20:58 +02:00
Arik Fraimovich
fbb81b62d6 Make signed out layout more modular 2016-03-20 10:07:10 +02:00
Arik Fraimovich
ea57175bfa Merge pull request #935 from getredash/extensibility
Feature: allow forwarding events to a webhook
2016-03-17 13:47:50 +02:00
Alexander Leibzon
ad95a5eb5e requirements rearrangement 2016-03-17 13:10:15 +02:00
Arik Fraimovich
efe1f8370c Feature: allow forwarding events to a webhook 2016-03-17 13:10:09 +02:00
Alexander Leibzon
2e93af3a21 fixes 2016-03-17 13:09:02 +02:00
Alexander Leibzon
c2f3c55d80 Merge remote-tracking branch 'upstream/master' 2016-03-17 12:51:53 +02:00
Alexander Leibzon
629c16acbe the dynamoDB SQL connector 2016-03-17 12:51:06 +02:00
Alexander Leibzon
158fc6222d add requirements 2016-03-17 12:50:39 +02:00
Alexander Leibzon
d88d1a1e61 dynamodb SQL connector 2016-03-17 03:13:44 +02:00
John Katsnelson
f2a1bc7f0e docker-compose ls should be docker-machine ls 2016-03-16 09:17:09 -07:00
Arik Fraimovich
9e6e913347 Merge pull request #928 from getredash/extensibility
Add extension points to override frontend elements
2016-03-15 22:49:45 +02:00
Arik Fraimovich
fde36298ce Add extension points to override frontend elemnts 2016-03-15 22:46:36 +02:00
Arik Fraimovich
e75c3c6871 Merge pull request #927 from getredash/fix/format
Fix: format API not working for non default organization
2016-03-15 15:28:13 +02:00
Arik Fraimovich
82871f606a Fix: format API not working for non defualt organization 2016-03-15 15:25:52 +02:00
Arik Fraimovich
0fcf232b5e Move footer to include file 2016-03-15 14:22:12 +02:00
Arik Fraimovich
e0ad3ee309 Merge pull request #925 from getredash/feature/password_reset
Feature: password reset & invite links functionality.
2016-03-15 10:59:54 +02:00
Arik Fraimovich
df180a2cb8 Allow admin to reset password instead of resend invite 2016-03-15 10:56:37 +02:00
Arik Fraimovich
0dccaa9ca4 Show warning if email server isn't configured 2016-03-15 10:37:33 +02:00
Arik Fraimovich
5a222beff4 Merge pull request #926 from erans/master
Python query runner: make max and min functions available to the scripts
2016-03-15 10:11:05 +02:00
Eran Sandler
86980793ac made Python's max and min functions available to the scripts 2016-03-15 09:40:03 +02:00
Arik Fraimovich
7a943f62b3 Password reset & invite links functionality. 2016-03-14 18:33:17 +02:00
Arik Fraimovich
56b3675a23 Merge pull request #923 from getredash/sentry_logs
Setup Sentry to catch error logs
2016-03-14 11:54:33 +02:00
Arik Fraimovich
7e094f2b2d Setup Sentry to catch error logs 2016-03-14 11:50:11 +02:00
Arik Fraimovich
079ae09253 Merge pull request #917 from getredash/modular
Restructure the Flask app
2016-03-14 11:47:26 +02:00
Arik Fraimovich
9ae503289c Restructure the Flask app:
Tried to untangle the cyclic dependencies, although there are still some of
them left. The main reason for this restructuring/refactoring is to make
the application a bit more extensible, so it's possible to add more routes
to it without touching the core.
2016-03-14 11:45:02 +02:00
Arik Fraimovich
f8a8928a90 Merge pull request #922 from getredash/feature/google_login
Allow existing users sign in with Google Apps even if they are not from an allowed domain
2016-03-14 11:30:11 +02:00
Arik Fraimovich
7da1c85315 Allow existing users sign in with Google Apps even if they are not in domain list. 2016-03-14 11:19:23 +02:00
Arik Fraimovich
d8b1131011 Merge pull request #921 from getredash/events
Additional events and information
2016-03-14 11:16:29 +02:00
Arik Fraimovich
3bdcd958ca Track data source and query creation 2016-03-14 10:59:11 +02:00
Arik Fraimovich
4d5d9fc42f Track user ip and useragent in events 2016-03-14 10:53:41 +02:00
Arik Fraimovich
dd5c1866f2 Merge pull request #920 from getredash/mongo_improvements
Feature: MongoDB - add support for $date and relative dates.
2016-03-14 10:16:25 +02:00
Arik Fraimovich
1359d386c6 Change tag to be humanTime 2016-03-14 10:13:38 +02:00
Arik Fraimovich
1aab5b4963 Install Pymongo for tests (temporary solution) 2016-03-13 23:32:54 +02:00
Arik Fraimovich
18d7c33620 Feature: MongoDB - add support for $date and relative dates. 2016-03-13 23:25:24 +02:00
Arik Fraimovich
abde67f2d9 Fix: gulp wasn't building app_layout.html 2016-03-13 22:58:12 +02:00
Arik Fraimovich
e60caf87a6 Merge pull request #919 from alexanderlz/master
Fix: schema fetching for Vertica & SQLite was broken (fix #916)
2016-03-13 22:51:25 +02:00
Alexander Leibzon
3f15ad36a5 fix schema resolution, resolves #916 2016-03-13 16:59:09 +02:00
Arik Fraimovich
2f35c1ea2b Merge pull request #918 from getredash/query_runners_improvements
Several improvements to query runners:
2016-03-13 15:44:04 +02:00
Arik Fraimovich
2d1a28389b Sort query runners by name 2016-03-13 15:40:51 +02:00
Arik Fraimovich
5cc7eda420 Remove from default list query runners we don't install deps for by default 2016-03-13 15:39:49 +02:00
Arik Fraimovich
32682483cd Add explicit Redshift query runner 2016-03-13 15:38:09 +02:00
Arik Fraimovich
605a12c34b PostgreSQL query runner: add timeout for connection 2016-03-13 15:38:00 +02:00
Arik Fraimovich
a6b86c7af2 Friendly name for MSSQL query runner 2016-03-13 15:34:41 +02:00
Arik Fraimovich
741faeef2b Update PyMongo versino to 3.2.1 2016-03-13 15:33:19 +02:00
Arik Fraimovich
2a745d5d54 Dockerfile: set the path to static assets 2016-03-12 18:37:20 +02:00
Arik Fraimovich
12660c3d51 Remove references to deprecated config 2016-03-12 18:22:53 +02:00
Arik Fraimovich
7c0c189b55 Merge pull request #910 from getredash/feature/better_fullscreen
Better full screen support
2016-03-12 18:18:07 +02:00
Arik Fraimovich
b0b9cd92f8 Merge pull request #912 from jkatsnelson/patch-2
redash static assets path should be pointed at dist, not app
2016-03-12 18:10:00 +02:00
Arik Fraimovich
27feb676b2 Added X-Forwarded-Proto to nginx config (closes #884) 2016-03-11 23:19:28 +02:00
Arik Fraimovich
cd5aec2b63 Fix #848: change instructions to recreate database instead of running migrations. 2016-03-11 23:13:17 +02:00
Arik Fraimovich
a1a73a1b2f Merge pull request #888 from toru-takahashi/improve-treasuredata-plugin
Improve TreasureData query runner
2016-03-11 22:58:11 +02:00
toru-takahashi
99ed8f8daf Modify property name and change default behavior 2016-03-12 00:31:54 +09:00
John Katsnelson
6fe5127f20 redash static assets path should be pointed at dist, not app 2016-03-10 11:36:42 -08:00
John Katsnelson
4d06a26038 adds basic docker compose instructions 2016-03-10 11:33:08 -08:00
Arik Fraimovich
841805496e Better full screen support 2016-03-10 14:05:34 +02:00
Arik Fraimovich
0e7098020c Merge pull request #909 from getredash/fix908
Fix #908: updating configuration without secrets was failing
2016-03-10 11:58:38 +02:00
Arik Fraimovich
33a5e06eb1 Fix #908: updating configuration without secrets was failing 2016-03-10 11:56:49 +02:00
Arik Fraimovich
536d7595c5 Merge pull request #906 from getredash/feature/public_dashboard
Feature: public dashboards
2016-03-10 11:52:01 +02:00
Arik Fraimovich
6104e5df3c Remove unused (Heroku related) Procfiles 2016-03-10 11:51:06 +02:00
Arik Fraimovich
b183651e04 Verify user has access to visualization before creating widget 2016-03-10 11:42:04 +02:00
Arik Fraimovich
fad8f2b7be UI for controlling access to dashboard 2016-03-10 11:28:39 +02:00
Arik Fraimovich
298db14bc1 API to create api key for dashboards 2016-03-10 10:09:26 +02:00
Arik Fraimovich
6bc3970ad5 Make sure user has access to data source when loading query result 2016-03-09 15:15:03 +02:00
Arik Fraimovich
be65582da9 Remove explicit header setting as we do it in the config 2016-03-09 13:43:52 +02:00
Arik Fraimovich
b92fbb489b Fix call to authenticate_request 2016-03-09 13:41:33 +02:00
Arik Fraimovich
52ad1f1ba1 Public dasboards feature. 2016-03-09 13:38:02 +02:00
Arik Fraimovich
b4b2bb86ee Merge pull request #902 from jeffwidman/fix-execute-bit
Make create_database script executable
2016-03-08 11:36:08 +02:00
Jeff Widman
ed01773d4e Make create_database script executable 2016-03-08 01:34:31 -08:00
Arik Fraimovich
399b7ad348 Merge pull request #901 from jeffwidman/fix-docker-compose
Docker: fix docker-compose env variables in example
2016-03-08 11:25:23 +02:00
Jeff Widman
6393f0225a No longer specifying google-apps domain from ENV var
http://docs.redash.io/en/latest/setup.html#users-google-authentication-setup
2016-03-08 01:21:04 -08:00
Jeff Widman
30066f6d04 Postgres and Redis urls should call out to their own container 2016-03-08 01:20:32 -08:00
Arik Fraimovich
feadf88159 Merge pull request #894 from jeffwidman/patch-4
Dockerfile: use redash's docker-hub nginx image
2016-03-08 10:56:21 +02:00
Jeff Widman
8d8605c7d8 volume mapping already handled in dockerfile 2016-03-08 00:53:31 -08:00
Arik Fraimovich
bf55d2f4da Merge pull request #895 from jeffwidman/patch-5
Use redash's docker-hub redash image
2016-03-08 08:32:03 +02:00
Arik Fraimovich
aec5f78e7b Merge pull request #893 from jeffwidman/patch-3
Fix YAML syntax error due to missing spaces
2016-03-08 08:27:44 +02:00
Jeff Widman
2a1354e70b Use redash's docker-hub redash image 2016-03-07 15:44:42 -08:00
Jeff Widman
2365f25e11 Use redash's docker-hub nginx image 2016-03-07 15:16:49 -08:00
Jeff Widman
8d10e9696e Fix YAML syntax error due to missing spaces
Environment variables weren't being parsed properly due to missing spaces.
2016-03-07 14:50:12 -08:00
toru-takahashi
6065545352 Fix case sensitive issue for query type 2016-03-08 02:13:52 +09:00
toru-takahashi
a98ead9030 Add option to enable Auto Get Schema 2016-03-08 02:05:05 +09:00
toru-takahashi
f07ed1df31 Update td-client to v0.4.1 2016-03-07 22:51:13 +09:00
Arik Fraimovich
a8ece8641a Bump version. 2016-03-06 12:13:19 +02:00
Arik Fraimovich
bac4025eff Merge pull request #882 from tsibley/new-data-source-via-cli
CLI: Restore ability to pass JSON options string for a new data source
2016-03-06 12:01:23 +02:00
Thomas Sibley
d07bf7e0aa CLI: Restore ability to pass JSON options string for a new data source
Commit "Encapsulate data source/query runner configuration in an
object." (ed99b84) accidentally removed that functionality by not
inflating the passed in JSON into a ConfigurationContainer object.

This led to errors of the form if you passed -o:

    Traceback (most recent call last):
      ...
      File "/opt/redash/redash-git/redash/models.py", line 321, in db_value
	return value.to_json()
    AttributeError: 'unicode' object has no attribute 'to_json'
2016-03-04 09:22:42 -08:00
Yana Manukhina
207dac693c Fix: show empty dashboards to their creators 2016-03-02 20:44:38 +03:00
Arik Fraimovich
8f937b7a35 Merge pull request #850 from toyama0919/master
Kibana: add support for limiting # of results returned
2016-03-01 23:37:24 +02:00
Arik Fraimovich
8747d0e724 Merge pull request #872 from erans/master
MongoDB: support for count queries
2016-03-01 23:36:24 +02:00
Yana Manukhina
866f378c88 List only dashboards available to current user based on user's groups 2016-03-01 20:46:36 +03:00
Arik Fraimovich
4a280eea29 Merge pull request #877 from ink-adavison/ink-adavison-ubuntubasepathfix
Correct Ubuntu Bootstrap.sh to a working Base URL
2016-03-01 13:36:25 +02:00
ink-adavison
194e9f4d7e Correct Ubuntu Bootstrap.sh to a working Base URL
The redash/docker/setup/... path is returning 404, but redash/master/setup/... works
2016-03-01 11:17:11 +00:00
Arik Fraimovich
4c5d2f14bf Merge pull request #866 from jeffwidman/fix_end_of_file_spacing
Fix whitespace issues
2016-02-29 22:39:15 +02:00
Jeff Widman
b86cf6ea4d Check should be 'x not in y' rather than 'not x in y' 2016-02-29 12:34:50 -08:00
Jeff Widman
dd72faaa77 Fix docstring spacing per PEP 257 2016-02-29 12:34:50 -08:00
Jeff Widman
c1b33939d0 A few misc whitespaces fixes 2016-02-29 12:34:50 -08:00
Jeff Widman
1aad95986b Add spaces around arithmetic operators per PEP 8 2016-02-29 12:34:50 -08:00
Jeff Widman
80209defc9 Remove extraneous spaces at end of lines 2016-02-29 12:34:46 -08:00
Jeff Widman
c198d22691 Format files to end in a single newline per PEP 8 2016-02-29 12:00:03 -08:00
Arik Fraimovich
43ac5600e5 Merge pull request #873 from getredash/feature/print_layout
Feature: print layout for dashboards
2016-02-29 21:11:41 +02:00
Arik Fraimovich
863365a412 Feature: print layout for dashboards 2016-02-29 21:07:07 +02:00
Eran Sandler
50c6bca421 added support for count queries 2016-02-29 21:05:50 +02:00
Arik Fraimovich
30b97e37f0 Merge pull request #854 from erans/master
Minors fixes for MongoDB and Python query runners
2016-02-29 21:04:14 +02:00
Eran Sandler
7f96de8b22 updated reverted change 2016-02-29 21:02:05 +02:00
Arik Fraimovich
dec30549f6 Merge pull request #867 from jeffwidman/fix_weird_indenting
Fix non-standard indentation to conventional four spaces
2016-02-29 15:25:11 +02:00
Arik Fraimovich
1a9059f1cc Merge pull request #865 from jeffwidman/fix_flask_ext
Replace deprecated flask.ext.* with flask_*
2016-02-29 15:22:13 +02:00
Jeff Widman
5208abd072 Make lines indented by four spaces instead of three 2016-02-29 01:58:19 -08:00
Jeff Widman
0ccbb24b3f Fix non-standard indentation to conventional four spaces
Not sure what happened in this section of code, but it was incorrectly indented by two spaces rather than four in several places.
2016-02-29 01:09:43 -08:00
Jeff Widman
09ccec59f5 Replace deprecated flask.ext.* with flask_*
Importing flask extensions using flask.ext.* is deprecated in favor of flask_*
For background, see: https://github.com/mitsuhiko/flask/issues/1135
2016-02-29 00:39:50 -08:00
Arik Fraimovich
8688b1c432 Merge pull request #864 from getredash/fix/datasource_show
Fix: data source loaded without properties
2016-02-28 18:56:10 +02:00
Arik Fraimovich
d06d1ada28 Fix: data source loaded without properties 2016-02-28 18:54:20 +02:00
Arik Fraimovich
3328de3462 Merge pull request #863 from getredash/fix/filters_datetime
Fix: properly show date/time in filters
2016-02-28 11:06:02 +02:00
Arik Fraimovich
84f71d1837 Fix: properly show date/time in filters 2016-02-28 11:04:08 +02:00
Arik Fraimovich
f219d20299 Merge pull request #857 from jeffwidman/patch-1
Fix typo: completly => completely
2016-02-27 21:55:56 +02:00
Eran Sandler
bdd2e0c418 fixed the query runner actually running code 2016-02-26 09:59:49 +02:00
Jeff Widman
d0cdf53b33 Fix typo: completly => completely 2016-02-25 18:00:15 -08:00
Arik Fraimovich
27faf8f88a Merge pull request #849 from sortable/presto-column-names
Fix: Presto - deduplicate column names
2016-02-25 21:39:29 +02:00
Arik Fraimovich
caf0734bac Merge pull request #855 from sreynen/patch-2
Docs: document settings.py
2016-02-25 21:37:57 +02:00
Eran Sandler
5f501b9df6 added JSON serialization support for internal bson timestamp which sometimes gets return in newer pymongo versions 2016-02-25 09:25:26 +02:00
Scott Reynen
caaf180d13 Create settings.rst
This is mostly just a template so far, as I'm only able to describe the settings I already understand, which isn't many.
2016-02-24 16:28:24 -07:00
Eran Sandler
68220a0d67 Added 'additionalModulesPaths' to the config allowing import modules from an external verified path. You'd still need to whitelist the module name in 'allowedImportModules' 2016-02-25 00:35:00 +02:00
Colin Dellow
0ebb53994b presto: use the disambiguated column name 2016-02-24 15:40:22 -05:00
Colin Dellow
177b62ea40 presto: use existing disambiguation path 2016-02-24 15:23:50 -05:00
Arik Fraimovich
a26da3aed3 Merge pull request #846 from sreynen/patch-1
Add link to dev environment documentation.
2016-02-24 22:07:35 +02:00
Arik Fraimovich
3a27955d24 Merge pull request #853 from getredash/arikfr-patch-1
Fix #851: embed doesn't load due to missing module.
2016-02-24 21:59:29 +02:00
Arik Fraimovich
86f2a0172f Fix #851: embed doesn't load due to missing module. 2016-02-24 21:53:12 +02:00
Arik Fraimovich
db59b34bda Merge pull request #852 from hudl/ConfigurationFixes
Small fixes for new ConfigurationContainer use
2016-02-24 21:49:57 +02:00
Alex DeBrie
51e92e0c71 Small fixes for new ConfigurationContainer use 2016-02-24 17:52:49 +00:00
toyama0919
246ce10a7f fix bug: Kibana not working limit, all select results. 2016-02-24 13:02:28 +09:00
Colin Dellow
cde54cec8b presto: don't merge columns with the same name
Fixes #847
2016-02-23 18:40:49 -05:00
Scott Reynen
21dc36b506 Add link to dev environment documentation. 2016-02-23 14:16:47 -07:00
Arik Fraimovich
d74442184e Merge pull request #844 from getredash/kms
Encapsulate data sources configuration logic in an object
2016-02-23 15:06:29 +02:00
Arik Fraimovich
db3e689e68 Update query runners for new config class 2016-02-23 15:02:49 +02:00
Arik Fraimovich
491e2e10d1 Fix test 2016-02-23 15:02:49 +02:00
Arik Fraimovich
ed99b8452c Encapsulate data source/query runner configuration in an object.
This is a step towards adding more complex logic in configuration
handling, like encryption of secrets.
2016-02-23 15:02:49 +02:00
Arik Fraimovich
f1e90fde31 Merge pull request #843 from getredash/design/download_links
Fix: dashboard query results links broken
2016-02-23 11:35:06 +02:00
Arik Fraimovich
954e63a41f Fix: dashboard query results links broken 2016-02-23 11:33:13 +02:00
Arik Fraimovich
6ec4c4c19c Merge pull request #840 from getredash/design/download_links
Improve layout of download links
2016-02-22 11:53:43 +02:00
Arik Fraimovich
553c6ac8d7 Improve layout of download links 2016-02-22 11:50:42 +02:00
Arik Fraimovich
b462869be7 Merge pull request #833 from toyama0919/feature/download-excel-from-dashboard
Feature: download Excel file link from dashboard.
2016-02-22 10:55:20 +02:00
Arik Fraimovich
3a5d59cf69 Merge pull request #839 from getredash/feature/api_params
Feature: add API to trigger query refresh and support for parameters.
2016-02-22 10:43:42 +02:00
Arik Fraimovich
c12b059d10 Add API to trigger query refresh and support for parameters. 2016-02-22 10:40:46 +02:00
Arik Fraimovich
e705ede3b7 Merge pull request #838 from erans/master
Python query runner -- added access to sorted and reversed functions
2016-02-21 13:03:05 +02:00
Eran Sandler
3b5aafa8e1 Added access to sorted and reversed functions 2016-02-21 11:13:46 +02:00
Arik Fraimovich
2440a83e46 Merge pull request #835 from benmanns/ubuntu-bootstrap-update-reorder
Ubuntu bootstrap script - move update before upgrade
2016-02-18 10:56:00 +02:00
Benjamin Manns
2b5a36cb3f Move update before upgrade
Running update before upgrade will fetch the latest sources, so we
can be sure that the upgrades will bring the box to the latest
versions of everything. Otherwise, this is often a no-op because
the box's sources will be cached at time of generation, meaning
there is nothing to upgrade.
2016-02-17 16:11:16 -05:00
toyama0919
78511fd0ce add feature, Excel download from dashboard. 2016-02-17 14:48:23 +09:00
Arik Fraimovich
a50ae19236 Merge pull request #823 from mobiledefense/add-widescreen-toggle
Feature: Button toggle to display dashboard in at full screen width
2016-02-16 10:23:16 +02:00
Arik Fraimovich
65f81c4d93 Merge pull request #831 from ninneko/801-download-excel
Feature: download results in Excel (XSLX) format (closes #801)
2016-02-16 09:19:53 +02:00
yohei.naruse
0afca7321a #801 fix test case.
schedule = "{:02d}:00".format(now.hour - 3) maybe be negative value when now.hour < 3.
I've fixed it.
2016-02-16 13:16:31 +09:00
yohei.naruse
32824f7575 apply reviews 2016-02-16 10:56:06 +09:00
yohei.naruse
2f16c8ae5f #801 Download DataSheets as Excel file 2016-02-15 23:47:31 +09:00
Arik Fraimovich
868263315b Merge pull request #829 from getredash/fix/embed
Fix: Plot.ly was given wrong timestamp
2016-02-14 20:40:43 +02:00
Arik Fraimovich
1ceddc9e91 Fix: we were sending wrong timestamp to Plotly 2016-02-14 20:38:32 +02:00
Arik Fraimovich
a96d135a4f Merge pull request #828 from getredash/fix/embed
Fix #797: user redirected to homepage when changing permission type
2016-02-14 20:11:51 +02:00
Arik Fraimovich
cec4e71d99 Fix #797: user redirected to homepage when changing permission type 2016-02-14 16:01:36 +02:00
Arik Fraimovich
0730ed8ed4 Merge pull request #827 from getredash/fix/embed
Feature: pivot tables are now regular visualizations that can be *saved*
2016-02-14 15:21:45 +02:00
Arik Fraimovich
e3420acd4b Feature: pivots are now regular visualizations that can be *saved*. 2016-02-14 15:17:52 +02:00
Arik Fraimovich
d21e2a79cc Close #772: upgrade to latest PivotTable.js lib 2016-02-14 14:40:01 +02:00
Arik Fraimovich
d1cf376ab3 Merge pull request #826 from getredash/fix/embed
Fix #802: switching to/from query source view resets chart colors
2016-02-14 14:13:24 +02:00
Arik Fraimovich
0ea0ba3fbe Fix #802: switching to/from query source view resets chart colors 2016-02-14 13:52:53 +02:00
Arik Fraimovich
0c93fe12ba Amend jshint settings 2016-02-14 13:51:32 +02:00
Arik Fraimovich
dad7b22cba Merge pull request #825 from getredash/fix/embed
Fix: sorting X values in charts had no effect
2016-02-14 13:26:32 +02:00
Arik Fraimovich
19766cf4ce Fix: sorting X values had no effect. 2016-02-14 13:24:14 +02:00
Arik Fraimovich
5e2727cfdf Use unminified d3.js in development. 2016-02-14 12:25:16 +02:00
Arik Fraimovich
3da326009b Bump Plot.ly version to a more recent one. 2016-02-14 12:24:56 +02:00
Matt Sochor
240739a445 Add dashboard toggle to display dashboard in at full screen width 2016-02-11 16:39:40 -05:00
Arik Fraimovich
253c4fd0a6 Merge pull request #821 from getredash/fix/embed
Fix embed URL & move logic into a directive
2016-02-10 15:41:05 +02:00
Arik Fraimovich
cda1068ff1 Show logo in embdes 2016-02-10 15:39:02 +02:00
Arik Fraimovich
eb324a4067 Limit the amount of information we return for embeds 2016-02-10 15:34:48 +02:00
Arik Fraimovich
8cf7314dc0 Fix embed URL & move logic into a directive 2016-02-10 15:34:31 +02:00
Arik Fraimovich
32b928d247 BSD 2-Clause
Updated copyright holder & removed last paragraph that doesn't belong to BSD-2 clause.
2016-02-10 11:32:00 +02:00
Arik Fraimovich
a5168ecc80 Update bootstrap.sh to more recent release 2016-02-09 15:18:58 +02:00
Arik Fraimovich
262ebb3bf1 Merge pull request #820 from getredash/gulp
Switch to Gulp from Grunt for faster builds
2016-02-09 15:15:38 +02:00
Arik Fraimovich
3e58d8798a Copy additional files on gulp build 2016-02-09 15:09:31 +02:00
Arik Fraimovich
bab536aaea Support for embeds in multi-org 2016-02-09 14:59:38 +02:00
Arik Fraimovich
bab4080430 Switch to Gulp from Grunt 2016-02-09 14:59:19 +02:00
Arik Fraimovich
a894f035dd Merge pull request #815 from getredash/fix/cli
Fix CLI issues with recent version
2016-02-09 00:56:16 +02:00
Arik Fraimovich
d4a83e29d4 Fix: delete data source CLI failing when data source has references 2016-02-09 00:03:35 +02:00
Arik Fraimovich
ded4761c8a If start_time not found skip metric collections (probably not running in real request context) 2016-02-09 00:01:44 +02:00
Arik Fraimovich
3fa143cfb1 Merge pull request #813 from ojarva/shellcheck-fixes
Fix shellcheck issues in bootstrap.sh scripts
2016-02-07 08:49:06 +02:00
Olli Jarva
de01184bbd Small shellcheck updates
Fix shellcheck complaints. These changes are not particularly important,
but spotting new/real issues is easier when checker output is empty by
default.
2016-02-06 16:42:24 +02:00
Arik Fraimovich
635bcc3e9f Pull latest docker image before building 2016-02-03 11:06:09 +02:00
Arik Fraimovich
b6b8daced6 Update Circle: build deps on master branch 2016-02-03 10:20:07 +02:00
Arik Fraimovich
b222f85d88 Add freetds-dev to Dockerfile 2016-02-03 09:06:01 +02:00
Arik Fraimovich
27c3fee345 Merge pull request #808 from joeharris76/master
Feature: Microsoft SQL Server query runner
2016-02-03 08:48:05 +02:00
Joe Harris
8c48ec5508 Cleanup of issues with the SQL Server feature PR 2016-02-02 16:18:21 -05:00
Joe Harris
cc176f5cba Add error handling to the pymssql import 2016-02-02 09:24:58 -05:00
Joe Harris
3a970a00c4 Add Microsoft SQL Server as a data source
Uses `pymssql` which in turn uses `FreeTDS`. Note that the data type
support is somewhat limited (see “datasources” page in docs).
2016-02-01 16:53:52 -05:00
Joe Harris
3b395a05b8 Merge pull request #1 from getredash/master
Pull from origin
2016-01-29 15:55:50 -05:00
Arik Fraimovich
9fa249a519 Update screenshots. 2016-01-27 12:55:52 +02:00
Arik Fraimovich
4e9b60ac82 Merge pull request #794 from getredash/hotfixes
Fixes for #792, #785, #733 and additional logging for execute_query
2016-01-24 12:03:34 +02:00
Arik Fraimovich
7a7e5be166 Fix #733: update migrations to work with new code 2016-01-24 11:57:05 +02:00
Arik Fraimovich
a1eec8490a Add more logging to execute_query 2016-01-24 11:32:44 +02:00
Arik Fraimovich
197bbde788 Fix #785: remove admin check box and direct users to use the groups
admin.
2016-01-24 11:08:02 +02:00
Arik Fraimovich
fed9d80fdb Fix #792: can't grant admin with CLI 2016-01-24 10:58:05 +02:00
Arik Fraimovich
78ba6f2739 Merge pull request #781 from woei66/master
Amazon Linux bootstrap script: check nginx default directory
2016-01-23 16:52:39 +02:00
Arik Fraimovich
cbb84ae3d3 Merge pull request #786 from JohnConnell/patch-1
Docs: instructions for compressed backup.
2016-01-23 16:51:21 +02:00
Arik Fraimovich
8120158119 Merge pull request #782 from shyamgopal/bug-768
Fix: Empty cells in google sheets displayed as datetime values #768
2016-01-23 16:50:44 +02:00
Arik Fraimovich
bd7b60d859 Merge pull request #784 from bobrik/fix-isoformat
Fix json serialization for datetime.timedelta, closes #783
2016-01-23 16:49:46 +02:00
Arik Fraimovich
80c03a5900 Merge pull request #787 from JohnConnell/patch-2
Docs: Updated links to Google's documentation about creating a service account
2016-01-23 16:46:04 +02:00
Arik Fraimovich
77e2d5db9b Merge pull request #790 from tknzk/fix_typo_on_doc
Docs: fix a typo in backup instructions
2016-01-23 16:44:35 +02:00
tknzk
7174dd856e fix a typo. 2016-01-22 17:45:40 +09:00
John Connell
6b5efc9e16 Update datasources.rst
Updated links to Google's documentation about creating a service account.
2016-01-21 13:05:02 -07:00
John Connell
4f95205795 Update maintenance.rst
Added: How to create a compressed backup.
2016-01-21 12:51:13 -07:00
Ivan Babrou
e26ea40c9b Fix json serialization for datetime.timedelta, closes #783 2016-01-21 14:37:36 +00:00
Arik Fraimovich
24137e87fd Update cloud images references 2016-01-21 14:47:51 +02:00
Shyamgopal Kundapurkar
221ec3a2a1 Fix of #768 2016-01-21 16:35:03 +05:30
David Lin
7081e25fa3 add -y to expect package, check nginx default directory and install to the right directory 2016-01-21 06:37:12 +00:00
Arik Fraimovich
8d126331cf Fix #778: update docs with correct CLI command. 2016-01-20 22:19:43 +02:00
Arik Fraimovich
33ffb2158b Update __init__.py 2016-01-20 10:21:45 +02:00
Arik Fraimovich
76ee88608d Merge pull request #777 from getredash/hotfix
Treat query errors as expected errors
2016-01-20 10:21:08 +02:00
Arik Fraimovich
a1ac289fb4 Treat query errors as expected errors 2016-01-20 10:17:10 +02:00
Arik Fraimovich
4f0b18b44e Merge pull request #776 from getredash/hotfix
Friendlier error messages for BigQuery query errors
2016-01-20 10:16:36 +02:00
Arik Fraimovich
44595cc930 Friendlier error messages for BigQuery 2016-01-20 10:01:08 +02:00
Arik Fraimovich
fcd478c93c Merge pull request #774 from getredash/hotfix
Fix: don't fail refresh_schema if one of the refresh ops fails
2016-01-19 18:44:47 +02:00
Arik Fraimovich
9971496401 Fix: don't fail refresh_schema if one of the refresh ops fails 2016-01-19 18:37:47 +02:00
Arik Fraimovich
8473783b0b Merge pull request #773 from getredash/hotfix
0.9.0 Hot Fixes
2016-01-19 18:34:19 +02:00
Arik Fraimovich
a9ae3c9ea3 Don't use DataSource.all in old migrations 2016-01-19 18:31:08 +02:00
Arik Fraimovich
505166455d Fix: show each data source only once 2016-01-19 18:26:51 +02:00
Arik Fraimovich
c6a06bd40a Remove debugging text 2016-01-19 18:01:35 +02:00
Arik Fraimovich
ed9e27019f Remove references to activity_log table 2016-01-19 18:00:42 +02:00
Arik Fraimovich
5b1abaaa52 Bump version. 2016-01-18 10:14:15 +02:00
Arik Fraimovich
c1da2579a3 Test for embed handler 2016-01-16 21:25:19 +02:00
Arik Fraimovich
1b36a62b91 Add conversion to int for Organization 2016-01-16 21:25:09 +02:00
Arik Fraimovich
ed2e06a787 Fix: counter visualization doesn't update when editing 2016-01-16 21:17:23 +02:00
Arik Fraimovich
47d3faae92 Fix: dashboard editor doesn't include last added widget 2016-01-16 21:11:25 +02:00
Olga Kogan
ff49321056 Update supervisor configs to recycle Gunicorn/Celery workers
This helps with avoiding memory leaks.
2016-01-15 17:57:09 +02:00
Arik Fraimovich
ee98b5a5c6 Improve the migration for unique data source name 2016-01-15 17:53:24 +02:00
Arik Fraimovich
245a4b5a3f Merge pull request #765 from nakechi/master
Feature: support HipChat Server
2016-01-15 17:30:48 +02:00
Arik Fraimovich
0546528b2c Merge pull request #762 from JohnConnell/master
Fix: typos and formatting issues in letsencrypt SSL cert documentation
2016-01-15 17:29:46 +02:00
Arik Fraimovich
d8d925c297 Merge pull request #764 from JohnConnell/master
Documentation: How to backup & restore redash db
2016-01-15 17:28:43 +02:00
nao-akechi
fac0af548b Feature: support HipChat Server 2016-01-15 18:36:07 +09:00
John Connell
5deca9bd60 Documentation: How to backup & restore redash db 2016-01-14 19:48:04 -07:00
John Connell
b1e0620f85 Update backup_restore.rst 2016-01-14 18:50:20 -07:00
John Connell
0a35f70a27 Update backup_restore.rst 2016-01-14 18:49:13 -07:00
John Connell
bd1551fb9d Rename backup_restore to backup_restore.rst 2016-01-14 18:47:18 -07:00
John Connell
f6a8a9975f How To: Backup re:dash database & restore to different server
Short guide explaining how to backup your re:dash database and restore it on a different server.
2016-01-14 18:46:31 -07:00
John Connell
179649d422 Update letsencrypt.rst 2016-01-14 01:32:10 -07:00
John Connell
1c584f65ba Update letsencrypt.rst
Fix various typos and formatting issues, including the commands for step 5 not being displayed.
2016-01-14 01:30:56 -07:00
John Connell
b62c75ac66 Update letsencrypt.rst
Fix two small typos. The first prevented the commands for step 5 from appearing and the second was a typo in the SSLLabs test URL.
2016-01-14 01:19:26 -07:00
Arik Fraimovich
f4096c0356 Update README.md 2016-01-14 09:56:17 +02:00
Arik Fraimovich
419fe389a4 Update README.md 2016-01-14 09:56:07 +02:00
Arik Fraimovich
031cb63f67 Rename peronal.html -> index.html 2016-01-13 10:03:52 +02:00
Arik Fraimovich
a62c5b5b24 Merge pull request #759 from getredash/fix/new_ds
Remove unused client side code
2016-01-13 10:02:25 +02:00
Arik Fraimovich
3befab7244 Remove client side performance collection 2016-01-13 10:00:06 +02:00
Arik Fraimovich
8c006238c5 Remove old IndexCtrl 2016-01-13 09:56:58 +02:00
Arik Fraimovich
03d897886e Merge pull request #758 from getredash/fix/new_ds
Fix: update dashboard after layout change
2016-01-12 21:43:10 +02:00
Arik Fraimovich
ebe032070e Fix: update dashboard after layout change 2016-01-12 16:25:10 +02:00
Arik Fraimovich
4a29f41ab3 Merge pull request #757 from getredash/fix/new_ds
Fix: infinite digest loop in coutner visualization
2016-01-12 15:14:05 +02:00
Arik Fraimovich
566cda359e Fix: infinite digest loop in coutner visualization 2016-01-12 15:13:23 +02:00
Arik Fraimovich
5a1736ad31 Merge pull request #756 from getredash/fix/new_ds
Fix: new data source should be assigned to default group
2016-01-12 15:13:04 +02:00
Arik Fraimovich
eed3d50372 create data source with default group specific method 2016-01-12 15:10:03 +02:00
Arik Fraimovich
901cf6f017 Fix: new data source should be assigned to default group? 2016-01-12 13:39:54 +02:00
Arik Fraimovich
83458ab25e increase opacity of overlay 2016-01-12 12:08:02 +02:00
Arik Fraimovich
9ab4e0e888 Merge pull request #754 from getredash/proxy_fix
Make groups listing only available for users with list_users permission
2016-01-12 09:22:06 +02:00
Arik Fraimovich
89ac67555e Make groups listing only available for users with list_users permission 2016-01-11 15:46:41 +02:00
Arik Fraimovich
4d7e58c8d7 Merge pull request #753 from getredash/proxy_fix
Show meaningful message when no data sources defined yet
2016-01-11 12:48:29 +02:00
Arik Fraimovich
14c4203593 Show meaningful message when no data sources defined yet 2016-01-11 12:47:17 +02:00
Arik Fraimovich
ccec964c24 Merge pull request #752 from getredash/proxy_fix
Fix: creating new user w/ Google Auth was broken.
2016-01-11 12:46:53 +02:00
Arik Fraimovich
d65e1a799a Fix: creating new user w/ Google Auth was broken. 2016-01-11 12:46:19 +02:00
Arik Fraimovich
451f216c31 Merge pull request #750 from JohnConnell/master
Docs: how to setup SSL using Let's Encrypt SSL certs
2016-01-11 12:07:21 +02:00
Arik Fraimovich
270afad6cf Merge pull request #751 from getredash/proxy_fix
Feature: ability to set # of proxies for the ProxyFix & fix the unique data source name migration
2016-01-11 12:07:14 +02:00
Arik Fraimovich
ccae8bcc69 Add option to override # of proxies 2016-01-11 12:02:18 +02:00
Arik Fraimovich
07f96a22af Update data source unique name migration to support another name of constraint 2016-01-11 11:30:26 +02:00
John Connell
3f6cf95307 Update letsencrypt.rst 2016-01-10 14:41:32 -07:00
John Connell
6f2d5090e6 Add documentation on using Let's Encrypt SSL certs 2016-01-09 16:00:09 -07:00
Arik Fraimovich
9cedb3bb66 Merge pull request #749 from getredash/unique_ds
Data sources should have unique names per organization
2016-01-09 22:37:40 +02:00
Arik Fraimovich
9751d3584b Remove forgotten console.log 2016-01-08 20:45:13 +02:00
Arik Fraimovich
13ced12cc9 Change data source index to be (org, name) 2016-01-08 20:44:11 +02:00
Arik Fraimovich
fdd60b364f Merge pull request #746 from Xangis/master
Feature: add an option to update a query every 30 days
2016-01-07 21:47:14 +02:00
Arik Fraimovich
dde63d1e96 Fix #745: when creating user from CLI, use default org. 2016-01-07 21:46:46 +02:00
=
174f7c0b1a Add an option to update a query every 30 days for use with things like monthly reports. 2016-01-07 08:24:34 -08:00
Arik Fraimovich
887d7179c4 Merge pull request #744 from getredash/feature/permissions
Run make deps only if rd_ui/app exists
2016-01-07 14:56:52 +02:00
Arik Fraimovich
fc84cf39fc Run make deps only if rd_ui/app exists 2016-01-07 14:56:28 +02:00
Arik Fraimovich
849c11b5f4 Merge pull request #743 from getredash/feature/permissions
Explicitly add httplib2 to requirements
2016-01-07 14:20:07 +02:00
Arik Fraimovich
66b4fe8e32 Explicitly add httplib2 to requirements 2016-01-07 14:18:12 +02:00
Arik Fraimovich
9d1823426c Fix SSLify skip list. 2016-01-07 13:09:41 +02:00
Arik Fraimovich
c004274108 Merge pull request #742 from getredash/feature/permissions
Add option to enforce HTTPs at the "Flask level"
2016-01-07 12:25:01 +02:00
Arik Fraimovich
0b89ee4653 Add option to enforce HTTPs at the Flask level 2016-01-07 12:22:32 +02:00
Arik Fraimovich
caff2e5caa Fix logo URL for multi-org 2016-01-07 12:03:28 +02:00
Arik Fraimovich
aa98f22a04 Merge pull request #741 from getredash/feature/permissions
Upgrade gunicorn version to latest.
2016-01-07 11:55:52 +02:00
Arik Fraimovich
db8915f154 Upgrade gunicorn 2016-01-07 11:52:50 +02:00
Arik Fraimovich
ce9a5c05fb Merge pull request #740 from getredash/feature/permissions
Fix #738: alert code was referencing non existing attribute
2016-01-07 11:48:27 +02:00
Arik Fraimovich
246725515d Fix #738: alert code was referencing non existing attribute 2016-01-07 11:46:35 +02:00
Arik Fraimovich
be4c59e73d Merge pull request #739 from toyama0919/master
Fix: Alert: when Alert.name is multibyte character, occur UnicodeEncodeError
2016-01-07 11:44:58 +02:00
toyama0919
40e047a47c Fix: Alert: when Alert.name is multibyte character, occur UnicodeEncodeError. 2016-01-07 11:03:33 +09:00
Arik Fraimovich
048ef7234c Merge pull request #737 from getredash/feature/permissions
Fix: user created without groups (+2 more)
2016-01-07 00:38:27 +02:00
Arik Fraimovich
bd29bdbb2e Fix: datasource refresh schemas was broken 2016-01-07 00:36:09 +02:00
Arik Fraimovich
13252bb0af Fix #736: user missing groups & events missing ord_id 2016-01-07 00:34:23 +02:00
Arik Fraimovich
07a709d59a Upgrade Sentry client to support new flask-login 2016-01-07 00:24:34 +02:00
Arik Fraimovich
55f80695b0 Merge pull request #707 from ryotarai/bower-in-dockerfile
Build dependencies during building Docker image
2016-01-06 23:11:14 +02:00
Arik Fraimovich
991512bc17 Merge pull request #735 from getredash/feature/permissions
Fix migration issue and CLI
2016-01-06 22:28:33 +02:00
Arik Fraimovich
5e58818043 Fix CLI to work with organizations 2016-01-06 15:14:09 +02:00
Arik Fraimovich
224998c62a Fix #733: merge migration #20 into #18, to avoid errors. 2016-01-06 14:59:18 +02:00
Arik Fraimovich
9a31077a99 Merge pull request #732 from getredash/feature/permissions
Fix #730: migration failing when no Google Apps domain set
2016-01-05 12:48:08 +02:00
Arik Fraimovich
ab39ed2898 Fix #730: migration failing when no Google Apps domain set 2016-01-05 12:46:00 +02:00
Arik Fraimovich
cb4fbf81a2 Merge pull request #724 from getredash/feature/permissions
Feature: new permission model
2016-01-04 17:27:01 +02:00
Arik Fraimovich
7c6b95e71d Change multi-org implementation:
To avoid complications with how Google Auth works, when enabling organization
multi-tenancy on a single instance, each organization becomes a "sub folder"
instead of a sub-domain.
2016-01-04 00:03:49 +02:00
Arik Fraimovich
f7b57fa580 Feature: new permissions system
This is one huge change for the permissions system and related:

* (Backward incompatible:) Remove the table based permissions in favour of the new model.
* Manage permission to view or query datasources based on groups.
* Add the concept of Organization. It's irrelevant for most deployments, but allows for
  multi-tenant support in re:dash.
* Replace ActivityLog with Event based rows (old data in activity_log table is retained).
* Enforce permissions on the server-side. There were some permissions that were only enforced
  on the client side. This is no more. All permissions are enforced by the server.
* Added new permission: 'super-admin' to access the status and Flask-Admin interface.
* Make sure that html is never cached by the browser - this is to make sure that the browser
  will always ask for the new Javascript/CSS resources (if such are available).
2015-12-31 10:43:33 +02:00
Arik Fraimovich
6e32f5b9f2 Merge pull request #726 from getredash/fix/lazy_load_oauth_app
Fix: lazy load the oauth app
2015-12-28 15:15:43 +02:00
Arik Fraimovich
1a748c2141 Fix expected path in test 2015-12-28 15:10:42 +02:00
Arik Fraimovich
99ed076c0c To speed up builds, install npm & pack only on master branch. 2015-12-28 15:06:12 +02:00
Arik Fraimovich
8a7dd3b46a Fix: lazy load the oauth app 2015-12-28 14:52:33 +02:00
Arik Fraimovich
6e28f949fb Merge pull request #725 from akariv/master
Fix: Google OAuth - support for next
2015-12-28 12:07:34 +02:00
Adam Kariv
a9ccfb8b42 Fix next for Google oauth 2015-12-27 13:48:59 +02:00
Arik Fraimovich
1aba777b61 Change output path for junit.xml. 2015-12-27 10:12:19 +02:00
Arik Fraimovich
1894df49fa Use XUnit reports in CircleCI tests. 2015-12-27 09:46:45 +02:00
Arik Fraimovich
200131bb45 Silence metrics collection in tests. 2015-12-27 09:43:36 +02:00
Arik Fraimovich
5e25ba0cf6 Merge pull request #722 from ninneko/721-chart-right-axis
Fix: use second y axis for line charts while stacking
2015-12-24 17:39:52 +02:00
Arik Fraimovich
184d208020 Merge pull request #723 from getredash/feature/metrics
Feature: collect metrics on query time & request time
2015-12-24 17:33:18 +02:00
Arik Fraimovich
610fe2a8a2 Feature: collect metrics on query time & request time 2015-12-24 16:35:41 +02:00
yohei.naruse
068ce57b24 make right axis enabled if there are stacked bars on right axis and lines on right axis. 2015-12-24 17:34:29 +09:00
Arik Fraimovich
af61784a28 Merge pull request #664 from akariv/master
Feature: ability to embed visualizations in external sites
2015-12-21 22:07:32 +02:00
Arik Fraimovich
871d8d6b6a Merge pull request #716 from getredash/fix/perf
Fix #708: dashboard breaks when removing widgets and adding again
2015-12-21 16:34:13 +02:00
Adam Kariv
ea1fac76a3 Adapt to changes in upstream 2015-12-21 09:01:44 +02:00
Adam Kariv
ed380fefaa CR fixes 2015-12-21 09:01:44 +02:00
Adam Kariv
cc9e89bb69 Fix allowAllToEditQueries not bound to settings 2015-12-21 09:01:44 +02:00
Adam Kariv
e9aeb11685 Embedding of visualizations in external sites 2015-12-21 09:01:44 +02:00
Arik Fraimovich
cc2dcb25b6 Merge pull request #714 from erans/mongodb-schema-support
Feature: load schema for MongoDB data source
2015-12-20 15:38:36 +02:00
Arik Fraimovich
bfb73166c6 Merge pull request #713 from alexanderlz/master
Fix: don't add "Copy of" when saving a query
2015-12-20 14:36:46 +02:00
Arik Fraimovich
30adfccd79 Fix #708: dashboard breaks when removing widgets and adding again 2015-12-20 13:15:58 +02:00
Eran Sandler
c3b6de55c0 added an extra check when a collection is empty and there are no documents to merge to show as fields 2015-12-20 09:58:29 +02:00
Eran Sandler
fa2cae1753 added schema support for MongoDB. Collections will be shown as tables and we merge the first and last documents (sorted by Natural order) to show the properties of the document. Since MongoDB is document based it might miss a few fields but it should give a good enough reference 2015-12-20 09:55:26 +02:00
Alexander Leibzon
b337a50fcc fix queryname when forking, add forked query_id to the name 2015-12-20 01:24:24 +02:00
Arik Fraimovich
3d178f9a60 Merge pull request #711 from alexanderlz/master
Feature: update forked query name
2015-12-16 20:56:06 +02:00
Arik Fraimovich
a0219bf354 Merge pull request #706 from alonho/fix/692_3
#692: Enable scrolling for pie charts with long legend
2015-12-16 17:41:02 +02:00
Ryota Arai
ec41077dc1 Run apt-get clean to reduce image size. 2015-12-17 00:07:56 +09:00
Ryota Arai
15f9a063ae Install nodejs, build assets and uninstall it in one instruction. 2015-12-17 00:07:56 +09:00
Ryota Arai
a15085dc93 Run supervisord as root. 2015-12-17 00:07:56 +09:00
Ryota Arai
78ae9ac647 Build dependencies during building Docker image. 2015-12-17 00:07:56 +09:00
Ryota Arai
f31ec7b1dd Stop to install bower and grunt-cli globally. 2015-12-17 00:07:56 +09:00
Arik Fraimovich
85916efa81 Merge pull request #710 from ryotarai/bq-max-mb-processed
Feature: BigQuery: limit amount of MB processed per query
2015-12-16 16:30:47 +02:00
Alexander Leibzon
31b6e6ff0f Merge remote-tracking branch 'upstream/master' 2015-12-16 15:17:58 +02:00
Ryota Arai
f20774b6c2 Rename maximumTotalMBytesProcessed to totalMBytesProcessedLimit. 2015-12-16 20:25:18 +09:00
Ryota Arai
dac6cabd1e Extract code into a method _get_query_result. 2015-12-16 20:19:35 +09:00
Ryota Arai
51949230d6 Extract code into a method _get_total_bytes_processed. 2015-12-16 20:19:31 +09:00
Ryota Arai
81386bcf37 If maximumTotalMBytesProcessed is set, do dryrun and check data size. 2015-12-16 20:04:33 +09:00
Alexander Leibzon
67118ee1aa add 'Copy of' to forked query 2015-12-15 01:15:03 +02:00
Alon Horev
e863d83bf4 #692: Enable scrolling for pie charts with long legend 2015-12-14 11:24:56 +02:00
Arik Fraimovich
d958817b10 Update 0014_add_alert_rearm_seconds.py 2015-12-14 10:47:46 +02:00
Arik Fraimovich
450631d6ce Merge pull request #680 from alexanderlz/master
Feature: show rows count per table
2015-12-14 10:31:08 +02:00
Arik Fraimovich
8b5a0206c2 Merge pull request #705 from alonho/fix/692_2
#692: Fix scrolling issue with plotly charts (didn't always work)
2015-12-13 17:25:02 +02:00
Alon Horev
49848a193a #692: Fix scrolling issue with plotly charts (didn't always work) 2015-12-13 17:06:07 +02:00
Alexander Leibzon
0f9d5219ef add setting for global enable/disable of table size estimations for schema 2015-12-13 15:13:14 +02:00
Alexander Leibzon
3cb14786f5 Bug 704: fix 2015-12-13 12:22:58 +02:00
Alexander Leibzon
8e432200aa Merge remote-tracking branch 'upstream/master' 2015-12-12 12:10:35 +02:00
Arik Fraimovich
30dd030a9d Merge pull request #703 from alonho/fix/area_stacking_hover
Chart: regular area stacking (not percent) now shows both the value and sum per point.
2015-12-12 07:46:22 +02:00
Alon Horev
fc3fc0e84a Chart: pie chart colors should use our custom palette and not the default plotly palette 2015-12-12 01:02:22 +02:00
Alon Horev
24b70e66af Chart: regular area stacking (not percent) now shows both the value and sum per point. 2015-12-11 23:22:22 +02:00
Arik Fraimovich
76a1b9fdbe Merge pull request #701 from alonho/fix/694_2
Fix: #694: When stacking is enabled show both the relative value (in %) and the absolute value (attempt #2)
2015-12-11 17:02:34 +02:00
Arik Fraimovich
e310f9d522 Merge pull request #700 from alonho/fix/692
Fix: #692: Chart legend was cut off with a large number of series. The wrapping div now scrolls to make it visible.
2015-12-11 14:18:19 +02:00
Alon Horev
86a0e74db8 #694: When stacking is enabled show both the relative value (in %) and the absolute value 2015-12-10 23:00:49 +02:00
Alon Horev
30a70338ba #692: Chart legend was cut off with a large number of series. The wrapping div now scrolls to make it visible. 2015-12-10 22:16:58 +02:00
Arik Fraimovich
b242dbb531 Merge pull request #698 from alonho/fix/694
Fix: When stacking is enabled show both the relative value (in %) and the absolute value
2015-12-10 21:59:38 +02:00
Arik Fraimovich
ca47b0e6f7 Merge pull request #699 from alonho/fix/695
Fix: Charts: when stacking is enabled we should use one yaxis otherwise they overlap
2015-12-10 18:57:14 +02:00
Alon Horev
7c992c53eb #694: When stacking is enabled show both the relative value (in %) and the absolute value 2015-12-10 17:28:47 +02:00
Alon Horev
4deb150a89 #695: Charts: when stacking is enabled we should use one yaxis otherwise they overlap 2015-12-10 16:18:32 +02:00
Arik Fraimovich
63f0a8cc20 Merge pull request #631 from brickx/master
Feature: alert rearm setting which allows periodic resending of alert messages.
2015-12-10 09:19:58 +02:00
Arik Fraimovich
7e4f5e1e03 Merge pull request #687 from alonho/feature/plotly
Feature: replace HighCharts with Plotly
2015-12-09 10:17:40 +02:00
Arik Fraimovich
6f1fed47b3 Merge pull request #691 from VirtualPaul/patch-1
Docs: add TreasureData to the list of datasources
2015-12-09 10:17:26 +02:00
Arik Fraimovich
4505437097 Bump version. 2015-12-09 10:16:15 +02:00
Paul Lacey
2ea2df5943 Update datasources.rst
Add Treasure Data to list of supported data sources
2015-12-08 15:31:58 -08:00
Alon Horev
135ffd693a Add an option to disable chart legend.
A user can disable it if he has tons of series.
Now that we explicitly enable it, it's also visible for a single series.
2015-12-07 19:07:04 +02:00
Alon Horev
0f82d4e17b Remove highcharts as it's not used anymore 2015-12-06 21:05:35 +02:00
Arik Fraimovich
32c0d3eb3d Merge pull request #688 from Xangis/patch-1
Docs: Add Greenplum to Postgresql section since it works with same settings.
2015-12-06 09:22:49 +02:00
Jason Champion
1bee22a578 Add Greenplum to Postgresql section since it works with same settings. 2015-12-05 15:24:55 -08:00
Arik Fraimovich
6bb57508e1 Merge pull request #686 from scottkrager/patch-1
Docs: Update bootstrap.sh link to getredash repo
2015-12-05 22:15:32 +02:00
Alon Horev
b7a43feeca #273: Replace highcharts with plotly (it's free!) 2015-12-05 03:01:44 +02:00
Arik Fraimovich
2d34bf1c54 Typo fix in task name. 2015-12-04 17:09:01 +02:00
Arik Fraimovich
7e3856b4f5 Unify deployment sections in CirlceCI config. 2015-12-04 16:18:58 +02:00
Scott Krager
189e105c68 Update bootstrap.sh link to getredash repo 2015-12-03 16:30:06 -08:00
Arik Fraimovich
378459d64f Merge pull request #685 from getredash/fix/alert_sub_migration
Feature: add settings to query results cleanup
2015-12-03 11:20:51 +02:00
Arik Fraimovich
ab72531889 Add settings to query results cleanup (closes #683) 2015-12-03 11:10:02 +02:00
Arik Fraimovich
51deb8f75d Merge pull request #684 from getredash/fix/alert_sub_migration
Fix: add migration for AlertSubscriber table
2015-12-03 11:04:31 +02:00
Arik Fraimovich
68f6e9b5e5 Add migration for AlertSubscriber table 2015-12-03 11:03:38 +02:00
Arik Fraimovich
fbfa76f4d6 Merge pull request #682 from alonho/master
Fix: bug with new version of ui-select and 'track by ' on choices
2015-12-02 20:12:42 +02:00
Alon Horev
28e8e049eb fix bug with new version of ui-select and 'track by ' on choices 2015-12-02 20:10:19 +02:00
Alon Horev
47dcead383 #273: as a preparation for adding plotly, remove date range picker in the chart (plotly supports it within the chart) 2015-12-02 11:08:25 +02:00
Arik Fraimovich
f1f9597998 Bump version. 2015-12-02 11:03:50 +02:00
Alexander Leibzon
0da39edf1a Merge branch 'master' of github.com:alexanderlz/redash
Conflicts:
	redash/models.py
	redash/query_runner/__init__.py
2015-12-01 16:32:03 +02:00
Alexander Leibzon
7845ad5ff7 refresh param 2015-12-01 16:27:35 +02:00
Alexander Leibzon
3808b451c6 add param to allow skipping table row count 2015-12-01 16:27:34 +02:00
Alexander Leibzon
c78789a670 modify hive/impala/oracle to use BaseSQLQueryRunner 2015-12-01 16:27:34 +02:00
Alexander Leibzon
2cd08d25a0 improve code, create BaseSQLQueryRunner class, adapt postgres/mysql 2015-12-01 16:27:34 +02:00
Alexander Leibzon
09ed4d5ede feature #674 2015-12-01 16:23:28 +02:00
Alexander Leibzon
1e97a0ce9f add param to allow skipping table row count 2015-12-01 15:18:25 +02:00
Alexander Leibzon
61cb203ce7 modify hive/impala/oracle to use BaseSQLQueryRunner 2015-12-01 13:38:17 +02:00
Alexander Leibzon
58c0c5c099 improve code, create BaseSQLQueryRunner class, adapt postgres/mysql 2015-12-01 13:30:39 +02:00
blu35ky
8072b06246 Merge with upstream/master. 2015-12-01 20:50:42 +11:00
Niels Draaisma
65f2c2136b Added handling of empty rearm settings 2015-12-01 20:47:42 +11:00
Niels Draaisma
8b9a9e9ac4 Added alert rearm setting 2015-12-01 20:43:49 +11:00
Arik Fraimovich
0b389d51aa Merge pull request #644 from toyama0919/feature/alert-to-hipchat
Feature: send alert notifications to HipChat or web hook
2015-12-01 10:50:53 +02:00
toyama0919
46f3e82571 Apply reviews. fix redash.utils instead of bson. 2015-12-01 10:36:21 +09:00
toyama0919
5b64918379 Apply reviews. fix, post json nested data for webhook. 2015-12-01 10:36:21 +09:00
toyama0919
7549f32d9a Apply reviews. fix http client library httplib2 to requests. 2015-12-01 10:36:21 +09:00
toyama0919
6f51776cbb fix, basic auth for webhook. 2015-12-01 10:36:21 +09:00
toyama0919
ad0afd8f3e add, alert notification to webhook. 2015-12-01 10:36:21 +09:00
toyama0919
8863282e58 Apply reviews from arikfr 2015-12-01 10:34:56 +09:00
toyama0919
9c1fda488c fix, alert notification to hipchat. 2015-12-01 10:33:01 +09:00
blu35ky
30a494dab0 Changes based on PR 2015-12-01 11:22:19 +11:00
Arik Fraimovich
995659ee0d Merge pull request #679 from alonho/table_pagination
Improve table widget pagination UI
2015-11-30 23:39:06 +02:00
Alon Horev
ad2642e9e5 Improve table widget pagination UI 2015-11-30 23:37:56 +02:00
Arik Fraimovich
740b305910 Merge pull request #676 from getredash/feature/version_check
Feature: re:dash version check
2015-11-30 22:37:20 +02:00
Arik Fraimovich
ca8cca0a8c Merge pull request #678 from alonho/655
Fix: Dashboard shouldn't crash with empty queries
2015-11-30 22:34:00 +02:00
Arik Fraimovich
7c4410ac63 Use ng-cloak to hide the new version message until relevant 2015-11-30 22:31:06 +02:00
Alon Horev
91a209ae82 #655: Dashboard shouldn't crash with empty queries 2015-11-30 18:17:37 +02:00
Arik Fraimovich
60cdb85cc4 Move all version check logic into a module of its own 2015-11-30 17:06:21 +02:00
Arik Fraimovich
becb4decf1 Show in UI if new version available 2015-11-30 16:38:42 +02:00
Arik Fraimovich
5f33e7ea18 Perform daily version check 2015-11-30 16:31:49 +02:00
Arik Fraimovich
7675de4ec7 Merge pull request #675 from alonho/redash_link
Add link to redash.io
2015-11-30 16:16:10 +02:00
Alon Horev
fe2aa71349 Add link to redash.io 2015-11-30 16:10:33 +02:00
Arik Fraimovich
b7720f7001 Merge pull request #672 from alonho/chart_editor
Feature: Improved chart editor UI/UX
2015-11-30 12:38:01 +02:00
Alon Horev
3b24f56eba #671: Improve chart editor UI/UX 2015-11-30 12:37:00 +02:00
Alexander Leibzon
06065badd4 feature #674 2015-11-29 01:16:27 +02:00
Arik Fraimovich
52b8e98b1a Merge pull request #620 from getredash/docker
Reorganize setup files & update Docker configurations
2015-11-26 11:27:52 +02:00
Arik Fraimovich
5fe9c2fcf0 Update Ubuntu with docker readme 2015-11-26 10:39:42 +02:00
Arik Fraimovich
816142aa54 Update evn files 2015-11-26 10:38:06 +02:00
Arik Fraimovich
f737be272f Update GitHub repo url (EverythingMe -> GetRedash) 2015-11-26 10:34:16 +02:00
Arik Fraimovich
0343fa7980 Merge pull request #661 from hudl/fix-cancelquery
Fix cancelling queries for Redshift/Postgres
2015-11-24 15:18:58 +02:00
Arik Fraimovich
0f9f9a24a0 Remove spaces in export command. 2015-11-24 15:10:27 +02:00
Alex DeBrie
5b9b18639b Move signal handler 2015-11-23 14:02:09 +00:00
Arik Fraimovich
ce46295dd3 Update location of config files 2015-11-23 15:46:00 +02:00
Arik Fraimovich
3781b0758e Fix nginx conf mounting 2015-11-23 15:39:48 +02:00
Arik Fraimovich
8d20180d40 Update mail setup guide. 2015-11-23 14:24:43 +02:00
Arik Fraimovich
a7b41327c6 Update docker hub organization 2015-11-23 11:41:45 +02:00
Arik Fraimovich
4d415c0246 WIP: bootstrap for docker 2015-11-23 11:38:17 +02:00
Arik Fraimovich
5331008e78 add docker-compose.yml 2015-11-23 11:38:17 +02:00
Arik Fraimovich
80783feda6 Bootstrap files for Docker image 2015-11-23 11:38:17 +02:00
Arik Fraimovich
2f308c3fa6 Remove test file 2015-11-23 11:38:17 +02:00
Arik Fraimovich
a63055f7f0 Fix build step 2015-11-23 11:38:17 +02:00
Arik Fraimovich
ce884ba6d3 Update CircleCI config to build images 2015-11-23 11:38:17 +02:00
Arik Fraimovich
63765281fe Fix path in bootstrap script 2015-11-23 11:38:16 +02:00
Arik Fraimovich
47e79003e5 Update packer config 2015-11-23 11:38:16 +02:00
Arik Fraimovich
541060c62e Remove latest_release_url.py - docker images will be created with current code base as context 2015-11-23 11:38:16 +02:00
Arik Fraimovich
3ba19fa80f update readme for ubuntu bootstrap 2015-11-23 11:38:16 +02:00
Arik Fraimovich
f3ec0448f5 Updates to Dockerfile:
- No need to pg client anymore.
- Fix path to supervisord.conf.
2015-11-23 11:38:16 +02:00
Arik Fraimovich
654349a7ae Better arrangement of setup directory 2015-11-23 11:38:16 +02:00
Arik Fraimovich
2b32de184e Change suffix of docker-compose file to .yml as suggested by docker-compose 2015-11-23 11:38:15 +02:00
Arik Fraimovich
1fb57edd1f Remove old Vagrant file 2015-11-23 11:38:15 +02:00
Arik Fraimovich
f6c65d139a Move Amazon Linux bootstrap into folder of its own 2015-11-23 11:38:15 +02:00
Arik Fraimovich
4e59472238 Fix .dockerignore file:
Allow sending rd_ui/dist, remove rd_ui/nodemodules.
2015-11-23 11:38:15 +02:00
Arik Fraimovich
feabc46da4 Merge pull request #668 from cou929/fix-all_models
Fix: AlertSubscription missing in all_models
2015-11-23 11:13:49 +02:00
Kosei Moriyama
51a10e5a20 Add AlertSubscription to all_models 2015-11-23 02:06:39 +09:00
Arik Fraimovich
5bf370d0f0 Merge pull request #660 from hudl/fix-regexanchors
Fix: strings that start with a date wrongly treated as date fields
2015-11-21 20:41:56 +02:00
Arik Fraimovich
5beec581d8 Merge pull request #667 from getredash/docs_alerts
Docs: add instructions on setting up email server
2015-11-20 21:32:20 +02:00
Arik Fraimovich
70080df534 Add instructions on setting up email server 2015-11-20 21:31:50 +02:00
Arik Fraimovich
0d4c3c329e Merge pull request #666 from alonho/patch-1
Fix: Specifying field type in the field name using __ didn't work
2015-11-20 16:39:06 +02:00
Alon Horev
76dfbad971 Specifying field type in the field name using __ didn't work
It works for '::' but probably didn't work for '__' due to a a copy-paste
2015-11-20 14:20:26 +02:00
Alex DeBrie
45a85c110f Add SIGINT signal 2015-11-18 18:30:54 +00:00
Alex DeBrie
f77c0aeb1d Add InterruptException to __all__ 2015-11-18 18:07:47 +00:00
Alex DeBrie
b23e328f69 Add sigint signal handler to BaseQueryRunner 2015-11-18 17:20:39 +00:00
Alex DeBrie
165d782b98 Add end of string anchor to date parsing regex 2015-11-18 16:15:10 +00:00
Arik Fraimovich
1bdc1bef73 Merge pull request #653 from hakobera/fix-date-range-selector
Fix date range selector does not show data of last day when user timezone is not UTC
2015-11-18 17:58:20 +02:00
Arik Fraimovich
e3b41b15d7 Update links in README. 2015-11-18 17:49:11 +02:00
Arik Fraimovich
7a95dec33b Merge pull request #659 from getredash/fixes_151118
Add footer to the layout, to have links to docs & GitHub
2015-11-18 17:45:55 +02:00
Arik Fraimovich
a3d059041c Add footer 2015-11-18 17:36:24 +02:00
Arik Fraimovich
3a6c1599f3 Update index.rst 2015-11-18 17:35:06 +02:00
Arik Fraimovich
f92aa7b15f Merge pull request #658 from getredash/fixes_151118
Charts: remove "Show Total %" menu option and the yellow color
2015-11-18 16:51:41 +02:00
Arik Fraimovich
d823506e5b Remove menu option and yellow color 2015-11-18 16:50:59 +02:00
Arik Fraimovich
fc93de7aa2 Merge pull request #657 from getredash/fixes_151118
Fix: Change user create button from Save to Create
2015-11-18 16:49:19 +02:00
Arik Fraimovich
a0cc25d174 Change user create button from Save to Create 2015-11-18 16:45:15 +02:00
Arik Fraimovich
df24bc3aae Merge pull request #656 from enriquesaid/header-gravatar-src
Fix: load user avatar image with ng-src
2015-11-17 23:19:23 +02:00
Enrique Marques Junior
60c2cb0a75 using ng-src 2015-11-17 14:53:43 -02:00
Kazuyuki Honda
ad19f2d304 Treat dateRange as UTC 2015-11-17 11:03:07 +09:00
Arik Fraimovich
3aa59a8152 Update README links. 2015-11-16 16:12:41 +02:00
Arik Fraimovich
32638aebed Merge pull request #650 from alonho/mql
Feature: MQL query runner
2015-11-15 17:21:44 +02:00
Arik Fraimovich
346ea66c9d Merge pull request #651 from alonho/datasource_defaults
Support default values in data source creation forms
2015-11-15 17:17:26 +02:00
Arik Fraimovich
d14b74b683 Merge pull request #654 from EverythingMe/fix-graphite-verify
Fix: verify is optional value of Graphite's config
2015-11-15 17:10:46 +02:00
Arik Fraimovich
5d879ce358 Update circle.yml 2015-11-15 17:02:43 +02:00
Arik Fraimovich
b4da4359a8 Fix: verify is optional value of Graphite's config 2015-11-14 23:35:37 +02:00
Kazuyuki Honda
7e08518a31 Fix date range selector when user timezone is not UTC 2015-11-14 13:03:14 +09:00
Alon Horev
bea0e9aad0 Add support for MQL (a propietery SQL implementation for MongoDB by digdata.io) 2015-11-13 23:35:34 +02:00
Alon Horev
a87179b68b Support default values in data source creation forms 2015-11-13 23:28:33 +02:00
Arik Fraimovich
91806eda44 Merge pull request #647 from runa/patch-3
Fix: bind Redis to localhost
2015-11-11 06:04:58 +02:00
martin sarsale
d1fe3d63fd bind redis to localhost
Having it bound to the public addresses is a security problem.
See http://antirez.com/news/96
2015-11-10 23:03:53 -03:00
Arik Fraimovich
8408409ce2 Merge pull request #642 from tjwudi/patch-3
Docs: make migrating Vagrant box command a one-liner
2015-11-10 20:43:59 +02:00
John Wu
6bbdd5eb44 Make migrating command one-liner 2015-11-09 14:54:45 -08:00
Arik Fraimovich
34ba54397d Merge pull request #638 from underdogio/dev/show.db.select.mobile.sqwished
Removed `rd-hidden-xs` to make everything visible on mobile
2015-11-08 22:59:14 +02:00
Arik Fraimovich
ec79ce74d0 Merge pull request #639 from hudl/Feature-ScheduleQueryPermission
Feature: permission to schedule query
2015-11-07 23:11:38 +02:00
Alex DeBrie
f324f1bf6f Add schedule_query permission 2015-11-07 17:52:32 +00:00
Todd Wolfson
47cfb7d620 Removed rd-hidden-xs to make everything visible on mobile 2015-11-05 18:55:40 -06:00
Arik Fraimovich
dab1a21b40 Merge pull request #637 from underdogio/dev/explore.regression.sqwished
Reverted pivottable upgrade to remove XSS vulnerability
2015-11-05 20:36:05 +02:00
Arik Fraimovich
aa04a6e4a5 Merge pull request #630 from gissehel/sqlite_query_runner
Feature: SQLite query runner
2015-11-05 09:19:13 +02:00
gissehel
e0a43a32ab * Removed commented lines
* Renamed "Database Name"/dbname to "Database Path"/dbpath
2015-11-04 07:17:58 +01:00
gissehel
68001ae0f1 sqlite support 2015-11-04 07:17:58 +01:00
Todd Wolfson
9d9501b158 Reverted pivottable upgrade to remove XSS vulnerability 2015-11-03 16:49:30 -06:00
Arik Fraimovich
67aecc0201 Merge pull request #594 from tjwudi/diwu/feature/date-range-selector
Feature: date range selector support for charts
2015-11-03 23:16:04 +02:00
Arik Fraimovich
0bc9fc1ed5 Merge pull request #575 from Wondermall/feature/support_for_basic_auth_on_elastic_queries
Feature: new ElasticSearch datasource, and rename previous one to Kibana
2015-11-03 22:01:51 +02:00
Arik Fraimovich
b548cb1d8f Merge pull request #625 from essence-tech/oracle-support
Feature: Oracle query runner
2015-11-03 21:56:38 +02:00
Arik Fraimovich
eb5c4dd5f3 Merge pull request #623 from stanhu/support-mysql-ssl
Feature: support MySQL over SSL
2015-11-03 21:54:58 +02:00
Stan Hu
a07a9b9390 Normalize SSL titles 2015-11-03 10:16:48 -08:00
Arik Fraimovich
56ade4735c Merge pull request #634 from tjwudi/patch-1
Document APIs exposed to Python scripts
2015-11-03 10:17:52 +02:00
John Wu
b8a9f1048a Document APIs exposed to Python scripts 2015-11-02 13:52:39 -08:00
Niels Draaisma
3dc62e3c85 Added handling of empty rearm settings 2015-10-30 16:18:15 +11:00
Niels Draaisma
73b2c5d38e Added alert rearm setting 2015-10-30 16:01:21 +11:00
Arik Fraimovich
5b3bcff4f5 Update README.md 2015-10-26 12:54:21 +02:00
Arik Fraimovich
b41b21c69e Update README.md 2015-10-26 12:53:32 +02:00
Arik Fraimovich
172d57e82c Update README.md 2015-10-26 12:51:58 +02:00
Arik Fraimovich
f507da9df7 Update README about re:dash future. 2015-10-26 12:51:20 +02:00
Stan Hu
2e27e43357 Support MySQL over SSL 2015-10-21 16:21:17 -07:00
Josh Fyne
8a0c287d05 Updated datasources docs 2015-10-21 12:06:47 -04:00
Josh Fyne
664a1806bc Better number handling 2015-10-21 10:05:38 -04:00
Josh Fyne
9a0ccd1bb5 Added cx_Oracle requirement 2015-10-20 15:40:18 -04:00
Josh Fyne
076fca0c5a Initial Oracle pass 2015-10-20 15:27:07 -04:00
Arik Fraimovich
59f099418a Merge pull request #617 from EverythingMe/fix/timezone
Improve timezone handling:
2015-10-20 16:29:47 +03:00
Arik Fraimovich
b9a0760d7e Improve timezone handling:
1. Load all date/datetime values with moment.utc() which doesn't apply
   current timezone to them.
2. Don't use toLocaleString to format strings (which was converting them
   to current timezone as well).

Ref #411.
2015-10-20 16:17:57 +03:00
Arik Fraimovich
a0c26c64f0 Bump version. 2015-10-20 15:50:27 +03:00
Arik Fraimovich
5f47689553 Update AWS/GCE image links. 2015-10-19 23:01:43 +03:00
Arik Fraimovich
a5bc90c816 Merge pull request #615 from EverythingMe/fix_y_axis
Fix: y axis settings should take into account two axes
2015-10-19 11:33:12 +03:00
Arik Fraimovich
39b8f40ad4 Fix: y axis settings should take into account two axes 2015-10-19 11:32:47 +03:00
Arik Fraimovich
070caa6976 Gruntfile.js: copy image files. 2015-10-18 23:45:21 +03:00
Arik Fraimovich
56b51f68bc Merge pull request #614 from EverythingMe/fix/caching
Fix: don't cache /results API endpoint
2015-10-18 14:20:52 +03:00
Arik Fraimovich
799ce3e718 Fix: don't cache /results API endpoint 2015-10-16 23:11:19 +03:00
Arik Fraimovich
9b47f0d08a Fix: test shouldn't depend on currnet time 2015-10-16 23:10:50 +03:00
Arik Fraimovich
4f4dc135f5 Merge pull request #607 from tlpham/master
Docs: Remove trailing spaces
2015-10-14 13:26:48 +03:00
Lior Rozner
4eb490a839 Code review fix.
Added migration to change all existing elasticsearch datasource to kibana datasource.
2015-10-13 20:14:58 -07:00
John Wu
410c5671f0 Revert: python data source in setting 2015-10-13 11:42:42 -07:00
John Wu
fad8bd47e8 Remove commented code
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-13 11:35:56 -07:00
John Wu
89f5074054 Prevent unneccesary call to setDateRangeToExtreme
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-13 11:33:20 -07:00
John Wu
5826fbd05f Use moment.min and moment.max 2015-10-13 11:20:36 -07:00
John Wu
ddab1c9493 Update angular-moment and moment 2015-10-13 11:19:19 -07:00
John Wu
f9d5fe235b Always use _addPointToSeriesIfInDateRange 2015-10-13 11:01:21 -07:00
tlpham
afe64fe981 Update upgrade.rst
Trailing spaces.
2015-10-13 12:25:55 +08:00
tlpham
99efe497ee Update results_format.rst
Trailing spaces.
2015-10-13 12:25:11 +08:00
Arik Fraimovich
9e183f1500 Merge pull request #588 from tjwudi/diwu/feature/docker-deployment
Docker deployment support
2015-10-11 23:13:22 +03:00
Arik Fraimovich
4b17b9869e Merge pull request #551 from ElJoche:hidden_widgets
Feature: allow adding hidden text box widgets.
2015-10-11 22:56:41 +03:00
Arik Fraimovich
872d58688f Update the hidden widgets code (only use for textbox, ng-hide) 2015-10-11 22:54:24 +03:00
Arik Fraimovich
37272dc2d9 Capitalize logout link 2015-10-11 15:54:08 +03:00
Arik Fraimovich
1a3df37940 Merge pull request #605 from EverythingMe/small_fixes_11_10_2015
Feature: allow setting HighChart's turbo threshold value
2015-10-11 15:30:58 +03:00
Arik Fraimovich
ddbf264020 Close #572: allow setting the HighCharts turbo threshold value 2015-10-11 15:29:50 +03:00
Arik Fraimovich
e93b71af85 Don't sanitize non string values 2015-10-11 15:16:23 +03:00
Arik Fraimovich
13184519c3 Merge pull request #604 from EverythingMe/small_fixes_11_10_2015
Fix #597: MongoDB date parsing logic improvement
2015-10-11 15:00:23 +03:00
Arik Fraimovich
0f8da884f9 Fix #597: MongoDB date parsing logic improvement 2015-10-11 14:44:12 +03:00
Arik Fraimovich
21de1d90e3 Merge pull request #599 from EverythingMe/fix/passwords
Fix: don't send passwords back to the UI
2015-10-11 12:33:33 +03:00
Arik Fraimovich
ed9eb691c1 Merge pull request #603 from EverythingMe/small_fixes_11_10_2015
Feature: allow setting only the additional query runners you need
2015-10-11 12:29:46 +03:00
Arik Fraimovich
d6c229759f Update docs 2015-10-11 12:20:59 +03:00
Arik Fraimovich
f0b8dfb449 Allow setting only the additional query runners instead of overriding whole list 2015-10-11 12:17:28 +03:00
Arik Fraimovich
6f335d34b9 Merge pull request #602 from EverythingMe/small_fixes_11_10_2015
Close #564: support setting API key with headers
2015-10-11 12:10:04 +03:00
Arik Fraimovich
bed63083a7 Close #564: support setting API key in headers 2015-10-11 11:54:21 +03:00
Arik Fraimovich
9886f5b13b Merge pull request #601 from EverythingMe/small_fixes_11_10_2015
Fix #581: execute_query permission ignored by UI
2015-10-11 11:26:50 +03:00
Arik Fraimovich
f0ee7a67d2 Fix #581: execute_query permission ignored by UI 2015-10-11 11:26:11 +03:00
Arik Fraimovich
9c43e1540e Merge pull request #600 from EverythingMe/small_fixes_11_10_2015
Fix: cohort visulization had infinte digest loop
2015-10-11 11:24:37 +03:00
Arik Fraimovich
b0cb2d3f1c Fix: cohort visulization had infinte digest loop 2015-10-11 11:16:49 +03:00
Arik Fraimovich
b525ad0622 Fix: don't require uploading file again when editing BQ/GS data source 2015-10-11 10:29:05 +03:00
Arik Fraimovich
602b9128a7 Stop sending passwords to the UI 2015-10-11 09:27:51 +03:00
Arik Fraimovich
45d3b18c0c Update comment 2015-10-11 08:26:57 +03:00
Arik Fraimovich
b1918743f2 Merge pull request #596 from Oneross/master
Docs: added notes about Python query runner configuration
2015-10-10 11:41:26 +03:00
qjo744
716f36ef9c updated python datasources note to reflect preference for setting environ variable over editing settings.py 2015-10-09 07:54:25 -04:00
qjo744
62aa21cdc8 updated python datasources note to reflect preference for setting environ variable over editing settings.py 2015-10-09 07:53:36 -04:00
qjo744
4e30fc1054 updated python datasources note to reflect preference for setting environ variable over editing settings.py 2015-10-09 07:52:48 -04:00
Arik Fraimovich
5a1d38c572 Merge pull request #593 from hudl/chartColourPalette
Chart colour palette updated
2015-10-09 06:43:14 +03:00
qjo744
360b0da159 added notes for python query runner configuration to docs #595 2015-10-08 19:09:03 -04:00
John Wu
cc91981845 Naming stuff
`seriesCollection` -> `allSeries` (shorter)
`s` -> `series`

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 14:49:45 -07:00
John Wu
e19962d4e3 Remove unnecessary ENV line
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 13:40:03 -07:00
John Wu
99b6f8955e Add some mandatory nginx directives
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 13:25:44 -07:00
John Wu
cf6ce0599b Use volume to store postgres data
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 12:14:07 -07:00
John Wu
a699c04ee1 Download and build from latest source instead 2015-10-08 12:09:24 -07:00
John Wu
a8d7547dc7 Rename folder 2015-10-08 12:09:07 -07:00
John Wu
72804e6d80 Add redash-nginx repo content
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 11:57:44 -07:00
John Wu
e51db087c5 Remove unnecessarily exposed ports
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 11:46:16 -07:00
John Wu
0e9607205b Add nginx frontend in docker-compose
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 11:43:33 -07:00
John Wu
9f799f4bfe Use built image in docker-compose
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-08 11:38:17 -07:00
atharva.inamdar
17e0bd4cd2 hudl/fulla#140 new chart colours added to palette 2015-10-08 16:27:44 +01:00
atharva.inamdar
102038b129 hudl/fulla#140 new chart colours added to palette 2015-10-08 16:21:51 +01:00
Arik Fraimovich
c01d88cbea Merge pull request #591 from hudl/master
Feature: export pivot table as TSV
2015-10-08 08:35:28 +03:00
John Wu
9d6d88ebff Remove "export" in **.env**
Since we add `export` using `sed` in `bin/run`, there is no need to add
`export` in **.env** anymore. Also, docker-compose's `env_file` option
does not agree with `export`.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 17:26:14 -07:00
John Wu
3f429ebcb7 Don't use bin/run in docker
`bin/run` exports environment variables, which can override environment
variables provided by docker-compose.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 17:22:58 -07:00
John Wu
c854ce3c10 Remove postgres user
Also changed **docker_init_postgres.sh**. Since we don't have postgres
user now, then we cannot use `sudo -u postgres`. The alternative will be
running `psql --username=blahblah`.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 17:04:27 -07:00
John Wu
ab6cc3f146 Run celery using redash user 2015-10-07 16:21:37 -07:00
John Wu
97d0035f4a Group supervisord installation commands
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 11:16:49 -07:00
John Wu
8108bc7cb1 Group relevant commands
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 11:07:33 -07:00
John Wu
690cb2fccd Group all apt-get commands
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-07 10:58:52 -07:00
Arik Fraimovich
515c45776e Merge pull request #590 from underdogio/dev/select.last.data.source.sqwished
Added "Select last used data source" to query view
2015-10-07 19:50:15 +03:00
Todd Wolfson
fc44dba2ef Added "Select last used data source" to query view 2015-10-07 11:43:28 -05:00
Ben Cook
5329fe547c Merge pull request #1 from hudl/ExportPivotTable
Upgrade PivotTable.js and enable TSV export
2015-10-07 09:02:19 -05:00
John Wu
d6bb6d33a3 Expose ports in Dockerfile
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 16:30:18 -07:00
John Wu
9832b7f72a Use more descriptive name for series collection
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 15:04:34 -07:00
John Wu
2a6ed3ca52 Use bind(this) instead of creating that
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 15:04:02 -07:00
John Wu
2e78ef0128 Use more descriptive method name
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 14:50:15 -07:00
John Wu
d2d52d44f7 Postgres&Redis version consistency
Use Postgres 9.3 and Redis 2.8 images. This is to keep it consistent
with the version we use in provision script.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 14:38:24 -07:00
John Wu
987f4bd356 Use .env file through Dockefile
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 14:38:05 -07:00
John Wu
0c8c196d65 Group apt-get instructions
Given how docker caching works, it is better the group multiple
`apt-get` instructions into one when possible because it prevents docker
from building too many layers.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 14:13:53 -07:00
John Wu
9d703b44de Create postgres user
Create postgres user because we are now using `postgres-client` packages
which does not create postgres user by default. We need this user when
running `docker_init_postgres.sh`, so let's create it by hand.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 14:12:48 -07:00
John Wu
fb00350c58 Migrate stuff in bootstrap_docker.sh into Dockerfile
By using Dockerfile `RUN` command, we can enable docker to cache our
build. Also, much more easier to maintain.

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 13:21:09 -07:00
jbencook
6cccd30553 Upgrade PivotTable.js and enable TSV export 2015-10-06 20:14:05 +00:00
John Wu
0bbcb69197 Remove redis build + use postgres-client package instead of postgres
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 11:43:35 -07:00
John Wu
b0eaffdf6c tag postgres & redis version in docker-compose.yaml
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 11:42:36 -07:00
John Wu
407a649d17 Use ubuntu instead
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 11:42:19 -07:00
John Wu
73bd83a527 Revert TCP listening address
Instead of binding to `0.0.0.0`, use `127.0.0.1` instead for security
concerns. "The Python Web server is more
vulnerable than nginx that proxies it."

Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 11:17:48 -07:00
John Wu
72e48a191b Remove Node.js infra 2015-10-06 11:12:13 -07:00
John Wu
11682b3779 Remove redundant database migration scripts
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-06 10:35:54 -07:00
Arik Fraimovich
a15d7964fa Merge pull request #585 from matthew-sochor/add-d3js-boxplot
Feautre: d3.js based Box Plot visualization.
2015-10-06 17:14:33 +03:00
Matt Sochor
2feb8b81f5 fixup! Removed unused function and options 2015-10-06 10:11:19 -04:00
Arik Fraimovich
6286024350 Merge pull request #589 from shyamgopal/master
Fix: Google spreadsheet data source: cast values to their actual type from string
2015-10-06 17:08:53 +03:00
Matt Sochor
0b5dce0ebf Removed unused function and options 2015-10-06 09:26:33 -04:00
Arik Fraimovich
32311c55e6 Merge pull request #587 from matthew-sochor/add-logarithmic-scale-to-chart
Feature: logarithmic scale support in chart
2015-10-06 15:26:46 +03:00
Shyamgopal Kundapurkar
2ac795d6f7 Fixed non-plotting of charts for Google spreadsheet data source 2015-10-06 10:00:32 +05:30
John Wu
d50af7dec9 Use dateRangeEnabled to decided whether we should display the data range selector
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 17:35:41 -07:00
John Wu
20159a1c2a Separate setDateRangeToExtreme function
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 17:32:46 -07:00
John Wu
06400ed840 Refactor addPointToSeries
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 17:13:36 -07:00
John Wu
0ddc6cf135 Use null to state empty object instead
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 17:13:04 -07:00
John Wu
46a008346f Use standalone supervisord.conf for docker deployment
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 15:00:52 -07:00
John Wu
21c413f699 Add CMD to start service since docker doesn't support init scripts
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 14:59:52 -07:00
Matt Sochor
e7222944a5 Added logarithmic option to chart x axis type 2015-10-05 17:47:23 -04:00
Matt Sochor
f49839eadf Add logarithmic y-axis option to chart 2015-10-05 17:42:16 -04:00
John Wu
aa1b72908b Do not ignore .env file
Signed-off-by: John Wu <webmaster@leapoahead.com>
2015-10-05 14:33:20 -07:00
Matt Sochor
5dd457e5f1 fixup! Added d3 box plot visualization 2015-10-05 15:55:07 -04:00
Matt Sochor
a471134e07 Added X and Y axis labels 2015-10-05 15:53:06 -04:00
Matt Sochor
8a8f91ee8f Added ggplot style gridlines 2015-10-05 14:39:54 -04:00
Matt Sochor
59aa218b24 Added axes to boxplot 2015-10-05 10:44:59 -04:00
Matt Sochor
5fd8dbe523 fixup! Added variable width for box plots 2015-10-04 23:35:13 -04:00
Matt Sochor
a08f3c7cd0 fixup! Added variable width for box plots 2015-10-04 23:30:49 -04:00
Matt Sochor
824d053ddd Added variable width for box plots 2015-10-04 23:10:49 -04:00
Matt Sochor
b6e61deb24 Added d3 box plot visualization 2015-10-04 21:43:28 -04:00
Matt Sochor
4f40b28120 Added d3js 2015-10-04 21:43:28 -04:00
Arik Fraimovich
5d1c75df1c Merge pull request #576 from joaofraga/fix/deduplicate-column-names
Fix: support for duplicate columns for MySQL query runner
2015-10-01 19:01:49 +03:00
John Wu
28ccaedfff Ignore .env file 2015-09-30 17:11:56 -07:00
John Wu
1ee05e12fd Docker support 2015-09-30 14:19:22 -07:00
John Wu
6f91849419 Bind to 0.0.0.0 instead of 127.0.0.1 2015-09-30 10:38:51 -07:00
Joao Fraga
65cc67d1dd Changed duplicated column name formating 2015-09-30 10:47:49 -03:00
Joao Fraga
a8f6d9e45b Moved columns full data to BaseQueryRunner to avoid unnecessary loops 2015-09-29 14:56:18 -03:00
Joao Fraga
2c39a2faae Improved column name formater 2015-09-29 14:53:39 -03:00
Arik Fraimovich
1052528a5f Merge pull request #577 from EverythingMe/fix/get_key
Fix: getKeyFromObject was failing if key had dot in name
2015-09-29 09:38:06 +03:00
Arik Fraimovich
92cd2f1367 Fix: getKeyFromObject was failing if key had dot in name
This is due to incorrect use of `_.include` instead of `_.has`.

#571
2015-09-29 09:30:00 +03:00
Joao Fraga
990717a43d run_query now uses fetch_column to get column names 2015-09-29 01:29:00 -03:00
Joao Fraga
a2608d6a44 Added fetch_columns method to avoid columns duplications 2015-09-29 01:28:39 -03:00
John Wu
dedae03c8c Remove imagemin grunt task
grunt-contrib-imagemin seems to be broken because several dependencies
are quite obsolete and cannot be downloaded.
2015-09-28 17:14:49 -07:00
John Wu
61f2be02b7 Redundant filter removed 2015-09-28 15:06:09 -07:00
John Wu
9eca43801a Fix: date range does not update in dashboard
Replace the whole dateRange object in scope instead of changing min and max properties one-by-one. Given how angular `$watch` works with Moment.js object, I wrote some comment to clarify the right way to update dateRange.
2015-09-28 15:00:55 -07:00
John Wu
bcaefda600 Clearfix date-range-selector 2015-09-28 14:58:26 -07:00
Lior Rozner
42b0430866 Added support for ElasticSearch with basic auth.
Initial support for full blown ElasticSearch Search API (https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html)
2015-09-28 08:56:38 -07:00
Arik Fraimovich
445dbb5ade Merge pull request #573 from easytaxibr/PR/feature/logout_link_for_admin_UI
Feature: Add logout link to Admin UI
2015-09-25 08:18:36 +03:00
John Wu
40ee0d8a6e Add date-range-selector to chart 2015-09-24 15:06:35 -07:00
wesleybatista
a5b738a035 Feature: Add logout link to Admin UI 2015-09-24 18:24:48 -03:00
Arik Fraimovich
e893ab4519 Merge pull request #556 from nathanlubchenco/paramaterized_cohorts
Feature: options for Cohort visualization
2015-09-24 21:44:30 +03:00
Arik Fraimovich
8b569379bc Merge pull request #570 from toru-takahashi/feature/treasuredata
Add TreasureData query runner
2015-09-21 14:23:08 +03:00
toru-takahashi
bff3e7c3b2 Add TreasureData query runner 2015-09-21 16:12:34 +09:00
Arik Fraimovich
3fbd0d9579 Merge pull request #560 from stanhu/add-yaxis-label
Feature: add ability to configure y-Axis title
2015-09-20 15:27:39 +03:00
Arik Fraimovich
00f4ec16f8 Merge pull request #569 from EverythingMe/fix/remove_warnings
Remove import warnings from query runners
2015-09-20 12:39:46 +03:00
Arik Fraimovich
6f24b31858 Update setup.rst 2015-09-20 12:39:29 +03:00
Arik Fraimovich
7a8844180b Updated cloud images to latest version. 2015-09-20 12:38:06 +03:00
Arik Fraimovich
aefaf204a3 Merge pull request #568 from EverythingMe/fix/bq_timeout
Add timeout setting for BigQuery query runner
2015-09-20 12:32:18 +03:00
Arik Fraimovich
1527ea36b1 Remove import warnings from query runners 2015-09-20 12:32:04 +03:00
Arik Fraimovich
a71b83d98a Add timeout setting for BigQuery query runner 2015-09-20 12:27:58 +03:00
Arik Fraimovich
7add6287dc Merge pull request #567 from EverythingMe/fixes
Remove page title from navbar & limit # of recent entries to 20
2015-09-20 12:02:16 +03:00
Arik Fraimovich
d37b5ed075 Remove title from navbar 2015-09-20 11:18:43 +03:00
Arik Fraimovich
23b8b77feb Don't send log entries to Sentry. 2015-09-20 11:13:35 +03:00
Arik Fraimovich
46f1478e0d Make sure only 20 dashboards/queries returned in recent call. 2015-09-20 11:12:44 +03:00
Arik Fraimovich
ec46312bf6 Bump version. 2015-09-20 11:05:56 +03:00
Arik Fraimovich
7c308bee09 Merge pull request #563 from stanhu/allow-admin-to-edit-all
Fix: allow admins to edit everything.
2015-09-20 09:46:05 +03:00
Arik Fraimovich
5f656f3868 Fix: upload assets url changed 2015-09-20 09:22:41 +03:00
Arik Fraimovich
4e27331d56 Move vertica requirement to correct requirements file. 2015-09-20 08:52:33 +03:00
Stan Hu
8f28c52b8d Allow admins to edit everything
Closes #562
2015-09-17 17:24:12 -07:00
Stan Hu
47e6960b83 Add ability to configure y-Axis title 2015-09-17 15:57:44 -07:00
nathanlubchenco
0990d93b03 allow defaults for existing visualizations, link time label to time interval 2015-09-16 10:34:22 -06:00
nathanlubchenco
bf88d8b578 explicitly pass in just timeInterval and timeLabel from visualization.options to be watched 2015-09-15 14:57:27 -06:00
nathanlubchenco
384e756817 don't pass data as an argument to scope 2015-09-15 14:52:10 -06:00
nathanlubchenco
d2c46c99eb actually pass in visualization options 2015-09-15 14:46:40 -06:00
nathanlubchenco
9c2858191f typo fix 2015-09-15 14:28:51 -06:00
nathanlubchenco
0473de7392 add editor directive 2015-09-15 14:23:33 -06:00
nathanlubchenco
faece4f2c4 fixing mistakes, adding editTemplate and defaultOptions to visualization registration 2015-09-14 16:40:25 -06:00
Arik Fraimovich
c9e74104b1 Merge pull request #549 from shinjiikeda/master
Feature: Vertica query runner
2015-09-14 22:58:39 +03:00
nathanlubchenco
d100c915f4 changed text to select and replaced original cohort directive 2015-09-11 13:29:40 -06:00
nathanlubchenco
ef3636145c Revert "weekly cohort visualization modeled after chort.js"
This reverts commit 6210d6ab80.
2015-09-10 15:29:17 -06:00
nathanlubchenco
6bd7dc9237 paramaterized cohort visualization 2015-09-10 15:10:31 -06:00
nathanlubchenco
6210d6ab80 weekly cohort visualization modeled after chort.js 2015-09-10 14:34:15 -06:00
ike_s
864a12a3be Merge https://github.com/EverythingMe/redash 2015-09-10 15:40:52 +09:00
Arik Fraimovich
f48c47712d Merge pull request #553 from EverythingMe/sentry
Feature: optional Sentry support
2015-09-10 08:30:44 +03:00
Arik Fraimovich
2c90fb3fa9 Sentry support in Celery 2015-09-10 07:29:44 +03:00
jvasquez
176fd16e95 Adding behavior into the controller. 2015-09-09 16:33:51 -03:00
jvasquez
75d3a63070 Removing extra class from dashboard.html 2015-09-09 14:56:50 -03:00
jvasquez
8c4a5a644e Clean up branch. 2015-09-09 14:55:14 -03:00
jvasquez
5b024a3518 Hidden widgets 2015-09-09 14:39:43 -03:00
jvasquez
d474267934 Adding hidden options for widgets. 2015-09-09 14:14:27 -03:00
ike_s
9429314b6e update 2015-09-10 00:57:41 +09:00
EC2 Default User
7cd132b47d update 2015-09-09 12:17:17 +00:00
EC2 Default User
89661990e7 add vertica query runner 2015-09-09 10:59:37 +00:00
EC2 Default User
01564d7e10 add vertica query runner 2015-09-09 10:59:21 +00:00
Arik Fraimovich
98307aec0d Make the counter migration safer. 2015-09-09 09:57:54 +03:00
Arik Fraimovich
5de3de12f0 Remove details about datasources, as they're managed through the web UI now. 2015-09-08 12:19:13 +03:00
Arik Fraimovich
dea64734d6 Update instructions on how to flush Redis. 2015-09-08 12:17:30 +03:00
Arik Fraimovich
98857ea64c Feature: Support for Sentry 2015-09-07 10:51:51 +03:00
Arik Fraimovich
3181f28509 Merge pull request #547 from EverythingMe/fix/counter_vis
Fix: allow to control if to render script tags from user input
2015-09-07 09:14:35 +03:00
Arik Fraimovich
37745ad1c0 Fix: allow to control if to render script tags 2015-09-07 08:59:20 +03:00
Arik Fraimovich
5fe5c94b3d Merge pull request #546 from EverythingMe/fix/counter_vis
Improvements to counter visualization:
2015-09-07 08:58:55 +03:00
Arik Fraimovich
59cbafa724 Fix migration - always set target row number 2015-09-07 08:49:04 +03:00
Arik Fraimovich
1d99da5a32 Improvements to counter visualization:
1. Ability to take target value from different row.
2. Ability to clear target column name.
3. Use explicit default configuration values instead of "magic" defaults.
2015-09-06 23:30:02 +03:00
Arik Fraimovich
8dfa1ca7bd Merge pull request #543 from quaninte/fix_gte_mongo
Fix $gte mongodb query fail
2015-09-06 11:20:02 +03:00
Arik Fraimovich
1fb6860ee2 Merge pull request #545 from EverythingMe/feature/users_admin
Fix: logout wasn't working in Angluar context
2015-09-06 11:18:47 +03:00
Arik Fraimovich
99c50c1f64 Fix: logout wasn't working in Angluar context 2015-09-06 11:18:20 +03:00
Arik Fraimovich
b1576b5a91 Merge pull request #531 from EverythingMe/feature/users_admin
Feature: users admin in the web interface
2015-09-06 10:25:18 +03:00
Arik Fraimovich
6f2ee2c0bb Update vagrant instructions 2015-09-06 10:18:33 +03:00
Arik Fraimovich
eec5e3290b Return dashboard after archive 2015-09-06 10:17:38 +03:00
Arik Fraimovich
aaac5928c4 Fix: tests w/ celery breaking 2015-09-06 10:15:26 +03:00
Arik Fraimovich
b97b35d9b5 Update icons size in navbar 2015-09-06 10:15:26 +03:00
Arik Fraimovich
6955514ec3 Update documentation re. users admin 2015-09-06 10:15:26 +03:00
Arik Fraimovich
c8d5267bc7 Bump version 2015-09-06 10:15:25 +03:00
Arik Fraimovich
993a861c78 Users UI. 2015-09-06 10:15:25 +03:00
Arik Fraimovich
a11e100050 Tests for users API 2015-09-06 10:15:25 +03:00
Arik Fraimovich
470ec4924c Remove redash.cache module 2015-09-06 10:15:25 +03:00
Arik Fraimovich
cdb6aaac6e Split the giant redash.controllers module into a package 2015-09-06 10:15:25 +03:00
Arik Fraimovich
580d33a6f8 API for users resource 2015-09-06 10:14:56 +03:00
Arik Fraimovich
8686694be9 Merge pull request #544 from EverythingMe/fix/archived_dashboard_in_recent
Fix: archived dashboards were shown in recent list (and move archive button)
2015-09-03 08:44:10 +03:00
Arik Fraimovich
795a9fe011 Move dashboard archive to dashboard page. 2015-09-03 08:31:51 +03:00
Arik Fraimovich
4b08a3a5f2 Fix #541: archived dashboards appear in recent list. 2015-09-03 08:31:17 +03:00
Quan MT
d9e8a81655 Fix $gte mongodb query fail 2015-08-28 10:06:18 +07:00
Arik Fraimovich
7000547419 Merge pull request #537 from ekampf/patch-3
Docs: Missing --source-uri in command
2015-08-25 23:46:45 +03:00
Arik Fraimovich
e0100543cd Merge pull request #538 from ekampf/patch-4
Docs: Space-separated list of scopes is deprecated. Need to use comma-seper…
2015-08-25 23:46:07 +03:00
Arik Fraimovich
7ea640927f Merge pull request #539 from ekampf/patch-5
Docs: Misc. UI fixes because Google changed their console
2015-08-25 23:45:48 +03:00
Eran Kampf
db26cafc41 Misc. UI fixes because Google changed their console 2015-08-24 17:07:11 -07:00
Eran Kampf
100b9e7c71 Space-separated list of scopes is deprecated. Need to use comma-seperated 2015-08-24 16:53:29 -07:00
Eran Kampf
d3391db8f0 Missing --source-uri in command 2015-08-24 16:50:36 -07:00
Arik Fraimovich
1ad01d8394 Warn about using the bootstrap script with existing machines. 2015-08-19 21:25:36 +03:00
Arik Fraimovich
3ef3f2c01b Merge pull request #529 from rm420/fix/multifilters_for_bq
Enables multi-filtering for big-query.
2015-08-16 11:07:02 +03:00
Ryan McClarnon
371422a9ae Merge multi-filter check into one statement 2015-08-10 23:58:46 +01:00
Ryan McClarnon
f4af650292 Enables multi-filtering for big-query. Before had issue with hyphen in field name 2015-08-10 16:17:39 +01:00
Arik Fraimovich
5f38e87f01 Fix images links. 2015-08-09 13:26:23 +03:00
Arik Fraimovich
b98e4a27ce Update images. 2015-08-09 13:25:25 +03:00
Arik Fraimovich
9ff8db31d2 Merge pull request #528 from EverythingMe/chore/packer_update
Cleanup packer.json (no longer building GCE image with it).
2015-08-09 11:40:07 +03:00
Arik Fraimovich
446148d07f Run dist-upgrade before apt-get install 2015-08-09 11:29:01 +03:00
Arik Fraimovich
2d6ca50568 Remove google compute 2015-08-09 11:29:01 +03:00
Arik Fraimovich
650ccac501 Merge pull request #527 from EverythingMe/fix/filters_for_bq
Fix: support for filters in BigQuery.
2015-08-09 11:09:21 +03:00
Arik Fraimovich
ab507f0fd5 Update path to tarball. 2015-08-09 11:09:05 +03:00
Arik Fraimovich
7187b5ffee Fix: support for filters in BigQuery.
BigQuery doesn't support :: in column names, so using __ to split instead of ::.
2015-08-09 11:00:35 +03:00
Arik Fraimovich
5e73da1df4 Fix link to tarball (it changes on every build). 2015-08-07 19:34:00 +03:00
Arik Fraimovich
244d25b12c Fix #524: use v0.7.1 in bootstrap.sh. 2015-08-07 19:18:18 +03:00
Arik Fraimovich
2dcf676cf2 Fix #525: make sure we're in right path for requirements_all_ds.txt 2015-08-07 19:14:46 +03:00
Arik Fraimovich
e07af676a5 Fix #526: install latest setuptools in bootstrap.sh. 2015-08-07 19:12:17 +03:00
Arik Fraimovich
3dea6302de Merge pull request #523 from EverythingMe/feature/new_home
Fix: global_recent isnt set if user has enough recents
2015-08-06 16:58:44 +03:00
Arik Fraimovich
b1ceb60360 Fix: global_recent isnt set if user has enough recents 2015-08-06 16:58:15 +03:00
Arik Fraimovich
1ef94b77e9 Merge pull request #522 from EverythingMe/feature/new_home
Feature: "personalized" homepage with recent queries and dashboards
2015-08-06 16:48:29 +03:00
Arik Fraimovich
292d31e490 Improve /personal and use it as default home 2015-08-06 16:42:29 +03:00
Arik Fraimovich
6f0ac1e730 Merge pull request #521 from kataring/update-doc
Update docs about data sources for Presto
2015-08-06 10:16:39 +03:00
Noriaki Katayama
9f82e5850d Update docs about data sources for Presto 2015-08-06 16:02:18 +09:00
Arik Fraimovich
4a18fa07ec Merge pull request #518 from massaru129/feature/bootstrap_amazon_linux
Other: created bootstrap script for amazon linux
2015-08-04 16:17:18 +03:00
Arik Fraimovich
05d1886467 Merge pull request #520 from EverythingMe/docs-datasources
Docs: update documentation about data sources
2015-08-02 10:49:57 +03:00
Arik Fraimovich
6e45706825 Update docs about data sources 2015-08-02 10:15:11 +03:00
Arik Fraimovich
464402a233 Merge pull request #519 from EverythingMe/feature/disable_collaborative_editing
Feature: ability to disable the ability to edit anyone's query by everyone
2015-08-01 16:41:08 +03:00
Arik Fraimovich
3a56b9ded7 Don't set last_modified_by if only changing ref to last result 2015-08-01 16:36:56 +03:00
Arik Fraimovich
142295671b Feature flag to control if everyone can edit queries 2015-08-01 16:30:03 +03:00
masaru
0e46a24112 fixed config file pathes 2015-07-31 19:21:36 +09:00
masaru
a3cb698be0 fixed file path
the fixed pathes will work if my original files are uploaded
2015-07-31 14:34:25 +09:00
masaru
08730ad113 created bootstrap script for amazon linux 2015-07-31 14:05:48 +09:00
Arik Fraimovich
d155f166d7 Merge pull request #517 from EverythingMe/cleanup
Fix: URL query runner was failing without base URL
2015-07-30 21:27:00 +03:00
Arik Fraimovich
ca95e9252f Fix: URL query runner was failing without base URL 2015-07-30 21:26:14 +03:00
Arik Fraimovich
d078e80e79 Grammar fix. 2015-07-30 14:50:52 +03:00
Arik Fraimovich
8ad1d2672c Clarify about -i. 2015-07-30 14:49:55 +03:00
Arik Fraimovich
735130efc9 Merge pull request #510 from rghose/patch-1
for aws based and password less logins to boxes
2015-07-30 14:46:44 +03:00
Arik Fraimovich
7e6b7398a4 Remove confusing exception logging 2015-07-30 14:36:27 +03:00
Arik Fraimovich
edf8f5b1fd Fix tests post field name change in #515 2015-07-30 14:36:01 +03:00
Arik Fraimovich
08c09d896a Merge pull request #516 from EverythingMe/cleanup
Fix: multi-filter was broken in newer version of angular-ui-select
2015-07-30 13:36:50 +03:00
Arik Fraimovich
58403634cf Fix: multi-filter was broken in newer version of angular-ui-select 2015-07-30 13:35:50 +03:00
Arik Fraimovich
2eb171e40d Merge pull request #515 from moyomot/fix/only_email_authentication
Fix: change wording on login screen "username or email" -> "email"
2015-07-30 12:25:37 +03:00
moyomot
3753f58980 authentication are allowed e-mail only. 2015-07-30 17:56:57 +09:00
Arik Fraimovich
fe1cc78ab3 Merge pull request #514 from alexanderlz/master
Feature: Support Hive as datasource
2015-07-30 08:48:26 +03:00
Alexander Leibzon
c140668648 minor fixes. working version of Hive datasource. 2015-07-29 23:39:39 +03:00
Arik Fraimovich
41ca1321cf Merge pull request #513 from EverythingMe/cleanup
Cleanup: remove select2 and use ui-select.
2015-07-29 09:36:13 +03:00
Alexander Leibzon
d88340158a add Hive as datasource 2015-07-29 02:01:22 +03:00
Arik Fraimovich
52f335edd5 Cleanup: remove select2 and use ui-select. 2015-07-28 10:03:56 +03:00
Arik Fraimovich
22200ec7b2 Merge pull request #511 from stanhu/add-primary-key-to-flask-admin
Add the primary key to Flask admin to make it possible to lookup queries
2015-07-27 23:40:15 +03:00
Arik Fraimovich
e458ed03c8 Bump version. 2015-07-27 23:38:10 +03:00
Arik Fraimovich
e9f1e3a189 Merge pull request #512 from johnkearney/tidier-requirements
Move datasource requirements from bootstrap to own requirements file
2015-07-27 23:32:44 +03:00
John Kearney
d202570b0d Move datasource requirements from bootstrap to own requirements file 2015-07-27 11:46:53 -07:00
Stan Hu
9b6edde5c8 Add the primary key to Flask admin to make it possible to lookup queries 2015-07-27 10:24:34 -07:00
Rahul Ghose
975c92d40d for aws based and password less logins to boxes 2015-07-27 13:23:38 +05:30
Arik Fraimovich
27639f83c7 Update index.rst 2015-07-26 22:38:37 +03:00
Arik Fraimovich
c08e6791df Remove version info from conf.py -- rtd doesn't use it 2015-07-26 15:54:56 +03:00
Arik Fraimovich
5c7158b6ae Update vagrant instructions 2015-07-26 15:46:26 +03:00
Arik Fraimovich
b886067a9f Merge pull request #509 from EverythingMe/docs
Moving documentation to ReatTheDocs
2015-07-26 15:25:29 +03:00
Arik Fraimovich
2421de8819 Add Sphinx based documentation to the project. 2015-07-26 15:24:16 +03:00
Arik Fraimovich
9e87e42400 Merge pull request #508 from EverythingMe/cleanup
Some cleanup (updated settings and bootstrap script)
2015-07-26 12:30:31 +03:00
Arik Fraimovich
8c750826e3 Install dependencies for new sources 2015-07-26 11:49:23 +03:00
Arik Fraimovich
b14b6d1773 Give permission to read user(id, name) to redash_reader 2015-07-26 11:45:58 +03:00
Arik Fraimovich
76cb73f4ce Add description to the server param of elastic search 2015-07-26 11:45:25 +03:00
Arik Fraimovich
8854a45598 Update to settings:
1. Enable API key auth by default.
2. Enable query results cleanup by default.
3. Add ElasticSearch to the enabled query runners list.
2015-07-26 11:44:11 +03:00
Arik Fraimovich
228b8c7614 Merge pull request #507 from EverythingMe/cleanup
Fix: when editing alerts show correct column
2015-07-26 11:39:55 +03:00
Arik Fraimovich
5de79213ae Fix: when editing alerts show correct column 2015-07-26 11:39:22 +03:00
Arik Fraimovich
c7d30c8b87 Merge pull request #498 from EverythingMe/feature/ds_admin
Feature: datasources web admin (closes #193)
2015-07-26 11:35:52 +03:00
Arik Fraimovich
076710f0c6 Bump version 2015-07-26 10:24:09 +03:00
Arik Fraimovich
a9172dac00 Fix: if connection fails connection isn't set 2015-07-26 10:24:08 +03:00
Arik Fraimovich
accca51f39 Feature: web interface to edit datasources
* Web interface to add and delete data sources, without the need to ssh
into the server.
* Ability to safely delete datasources -- query results from this data sources
are deleted, while queries get assigned null datasource.
* Updated the BigQuery datasource to use the JSON key file from Google Developer
console. Also both BigQuery and the Google Spreadsheets datasource no longer store
their key on the filesystem, but rather in the DB.
* Minor updates to the Flask Admin.
2015-07-26 10:24:08 +03:00
Arik Fraimovich
5f5774d01b Merge pull request #506 from EverythingMe/small_fixes
Fix: makes sure the totals series is sorted
2015-07-23 15:03:36 +03:00
Arik Fraimovich
00e99d858c Fix: makes sure the totals series is sorted 2015-07-23 15:03:18 +03:00
Arik Fraimovich
da56dc883f Merge pull request #505 from EverythingMe/small_fixes
Fix: Update URL after creating an alert
2015-07-22 20:38:52 +03:00
Arik Fraimovich
02582cab65 Update URL after creating an alert 2015-07-22 20:38:22 +03:00
Arik Fraimovich
bff4d31ada Read HOST from env. 2015-07-22 18:19:27 +03:00
Arik Fraimovich
83554207e1 Merge pull request #504 from EverythingMe/fix/python_result_set
Fix: cohort was wrong if values were not sorted
2015-07-22 18:06:41 +03:00
Arik Fraimovich
1c0c3e0b93 Fix: cohort was wrong if values were not sorted 2015-07-22 18:05:54 +03:00
Arik Fraimovich
5feb563dc9 Merge pull request #503 from EverythingMe/fix/python_result_set
Fix: if you change the result object, python runner wouldn't return any results
2015-07-22 18:03:29 +03:00
Arik Fraimovich
07b88d0b53 Fix: log results were lost 2015-07-22 17:56:49 +03:00
Arik Fraimovich
21f33462d5 Anoter try in removing optipng from build 2015-07-22 17:43:05 +03:00
Arik Fraimovich
6a9d95f1ac Fix: if you change the result object, python runner wouldn't return any results 2015-07-22 17:36:46 +03:00
Arik Fraimovich
36b80fc4ef Remove optipng from build artifacts 2015-07-22 17:21:50 +03:00
Arik Fraimovich
d89dd2c9af Merge pull request #502 from EverythingMe/feature/alerts
Feature: alerts on query results
2015-07-22 17:14:29 +03:00
Arik Fraimovich
658af526c7 Add alerts to menu 2015-07-22 17:05:31 +03:00
Arik Fraimovich
3d859ec5f3 Feature: alerts for query results.
This is basic implementation for alerts feature, where you can
define a simple rule on the last query result to send an alert.

As part of the implementation added Flask-Mail to the project,
to send emails. Should be useful to make re:dash more "self aware"
(notify users about potential issues, when queries done executing
and more).
2015-07-22 17:05:31 +03:00
Arik Fraimovich
fdff799d23 ng_smart_table: support for inline templates 2015-07-22 17:05:09 +03:00
Arik Fraimovich
5fc0b88b23 ng_smart_table: support for nested objects 2015-07-22 17:05:09 +03:00
Alexander Leibzon
63de247478 add datasources 2015-07-22 14:55:26 +03:00
Arik Fraimovich
5d3caac1b5 Merge pull request #499 from alexanderlz/master
Feature: Support Impala as DataSource
2015-07-22 14:23:55 +03:00
Alexander Leibzon
e4b9d23dfe minor fixes 2015-07-22 14:21:40 +03:00
Alexander Leibzon
890f59a4c9 add get_schema ability to impala 2015-07-22 13:54:00 +03:00
Arik Fraimovich
d4a18ba611 Merge pull request #501 from johnkearney/all_pg_queries_with_no_results
All pg queries with no results
2015-07-21 06:47:33 +03:00
John Kearney
c4502b2925 Add a more use-friendly message when redshift returns no rows 2015-07-20 14:17:51 -07:00
Alexander Leibzon
1d5efdd93f fixes in accordance with pull req spec 2015-07-20 23:21:02 +03:00
John Kearney
2b95da102e Remove unused exports for env examples 2015-07-20 12:36:10 -07:00
Arik Fraimovich
d512cd0c1d Merge pull request #500 from EverythingMe/feature/login_events
Feature: add event for users logining in
2015-07-20 18:30:57 +03:00
Arik Fraimovich
3dc9c84a98 Feature: add event for users logining in 2015-07-20 18:26:45 +03:00
Alexander Leibzon
4a33b987b8 datasource rename 2015-07-20 02:07:17 +03:00
Alexander Leibzon
f7041977d5 impala datasource fixes 2015-07-20 02:06:15 +03:00
Alexander Leibzon
83bc38579e impala data source 2015-07-19 01:44:48 +03:00
Arik Fraimovich
4b8a94e795 Merge pull request #495 from EverythingMe/fix/bq_param
Fix: Update BigQuery configuration parameter name to avoid confusion.
2015-07-15 19:49:56 +03:00
Arik Fraimovich
406010a7a6 Fix: Update BigQuery configuration parameter name to avoid confusion. 2015-07-15 19:45:55 +03:00
Arik Fraimovich
4f11f28efa Merge pull request #494 from erans/master
MongoDB query runner: cleanup
2015-07-15 18:24:28 +03:00
Eran Sandler
c919602b20 cleanups and shit. 2015-07-15 18:17:55 +03:00
Arik Fraimovich
7702b05635 Merge pull request #493 from erans/master
Fix: a generic way to parse all the input JSON and make sure we replace ISODate to Python date times.
2015-07-15 17:50:21 +03:00
Eran Sandler
5fc7c499a3 stupid auto merge. 2015-07-15 17:48:03 +03:00
Eran Sandler
628240906e Fix: a generic way to parse all the input JSON and make sure we replace ISODate to Python date times. 2015-07-15 17:44:33 +03:00
Arik Fraimovich
41b9b21a20 Merge pull request #492 from erans/master
Fix: MongoDB: Date parsing and dates in aggregation $match
2015-07-15 17:03:17 +03:00
Eran Sandler
dbd3f754ba - Fixed parsing dates in the format of YYYY-MM-DDTHH:mm
- Added handling dates in the aggregate $match
2015-07-15 16:58:10 +03:00
Arik Fraimovich
4ef3c27fe6 Merge pull request #489 from kataring/suport-presto
Feature: Support Presto
2015-07-15 16:50:51 +03:00
Arik Fraimovich
58a005c71b Merge pull request #484 from alexanderlz/master
Feature: Google Spreadsheets support (alpha)
2015-07-14 12:14:57 +03:00
Alexander Leibzon
9d7ff31178 replace camelcase vars 2015-07-14 12:13:04 +03:00
Noriaki Katayama
93d6b01fbf add bigint 2015-07-14 16:59:25 +09:00
Arik Fraimovich
7d57f9d0f1 Merge pull request #488 from EverythingMe/fix/mongo-support-sandbox
Fix: Drop database name check in MongoDB queries  to support sandboxed environments
2015-07-14 08:56:47 +03:00
Arik Fraimovich
e80f470255 Mongo: Drop database name check to support sandboxed environments 2015-07-14 08:51:31 +03:00
Arik Fraimovich
5636cec0eb Merge pull request #487 from erans/master
Fix: Support newer as well as older PyMongo versions
2015-07-14 08:23:58 +03:00
Eran Sandler
912bbc1a4a Added backwards compatibility mode with older versions of PyMongo.
It appears that older versions would return a dictionary from an aggregate operation that had the cursor inside the "result" key.
Newer versions return a new type of cursor called CommandCursor.
2015-07-14 08:19:25 +03:00
Arik Fraimovich
d3bb58167e Merge pull request #486 from EverythingMe/fix/mysql-noerror-onconnect
Fix: no error when failing to connect to a MySQL data source
2015-07-13 19:04:16 +03:00
Arik Fraimovich
2911fa8af7 Bump version. 2015-07-13 18:31:31 +03:00
Arik Fraimovich
4503c6af66 Move the MySQL connect to the try/except block 2015-07-13 18:31:00 +03:00
Arik Fraimovich
7fc2d5ee0b Update bootstrap.sh to use 0.6.3. 2015-07-13 12:00:28 +03:00
Arik Fraimovich
3c9c1466a3 Merge pull request #483 from erans/master
Feature: Updated more fine grained support for CORS in QueryResultAPI
2015-07-13 11:04:10 +03:00
Eran Sandler
4a7c066bf0 Too many languages... :-( 2015-07-13 10:05:07 +03:00
Alexander Leibzon
b850da52a2 remove .nojekyll, naming convention 2015-07-13 09:56:11 +03:00
Eran Sandler
1a3657572e Added fine grind control of CORS header for QueryResultAPI and possibly future APIs. 2015-07-13 09:42:23 +03:00
Arik Fraimovich
666e3281e4 Merge pull request #482 from erans/master
Feature: CORS support for the Query Result API to allow embedding in other domains
2015-07-13 08:41:38 +03:00
Eran Sandler
66084b1a3b minor fixes 2015-07-12 23:07:06 +03:00
Eran Sandler
421470666a use set_from_string. 2015-07-12 23:06:00 +03:00
Eran Sandler
f8e2bc9eca Added configurable CORS support for the Query Result API (to export data as JSON or CSV). Configuration is via an environment variable that is comma separated to include one or more domains (REDASH_QUERIES_RESULT_CORS) 2015-07-12 23:00:50 +03:00
Alexander Leibzon
079fbf33f4 don't execute query if the query string is empty (when changing datasource) 2015-07-12 22:53:08 +03:00
Arik Fraimovich
c195362710 Merge pull request #479 from erans/master
Feature: improved error reporting and new log information support for the Python query runner
2015-07-12 22:30:21 +03:00
Arik Fraimovich
b671dd0431 Merge pull request #480 from EverythingMe/feature/multiple-domains
Feature: support for multiple domains with Google OAuth
2015-07-12 13:36:17 +03:00
Arik Fraimovich
7793f3b257 Feature: support for multiple Google Auth domains 2015-07-12 12:51:45 +03:00
Arik Fraimovich
e09aa6f81a Show message for wrong user/password (closes #275) 2015-07-12 12:43:37 +03:00
Eran Sandler
780e0c0418 - refactored the Python query runner
- Improved error handling to show the real error (including indentation and syntax errors - it should show the right row number)
- Added support for "print" statements which becomes log messages show in a single query window (where you edit). It's on by default. To remove it simply called 'disable_print_log()'
2015-07-12 12:14:46 +03:00
Alexander Leibzon
43edb009d6 safer handling of worksheet num 2015-07-12 01:28:52 +03:00
Alexander Leibzon
81978c5049 jekyll disable 2015-07-11 22:51:31 +03:00
Alexander Leibzon
239813e195 modify google spreadsheed datasource params, only the credentials file needed 2015-07-11 22:43:07 +03:00
Alexander Leibzon
28dd571a03 google spreadsheets working version 2015-07-10 21:27:16 +03:00
Alexander Leibzon
808126cf91 forgot type 2015-07-09 01:22:08 +03:00
Alexander Leibzon
69a8295f4c forgot type 2015-07-09 01:18:31 +03:00
Arik Fraimovich
a692e3f664 Merge pull request #476 from EverythingMe/feature/api
Feature: support for per user API keys
2015-07-08 21:34:06 +03:00
Arik Fraimovich
6860dde1f7 Set api_key to be unique 2015-07-08 21:29:32 +03:00
Arik Fraimovich
e183affdd0 Feature: support for per user api keys 2015-07-08 20:59:07 +03:00
Noriaki Katayama
6338be3811 modified response 2015-07-08 10:33:55 +09:00
Alexander Leibzon
3ee6371250 initial work on google spreadsheets 2015-07-07 01:39:59 +03:00
Noriaki Katayama
4f38d42182 add presto 2015-07-06 18:22:23 +09:00
Arik Fraimovich
39db74ff20 Merge pull request #475 from hakobera/support-infuxdb
Feature: Support InfluxDB v0.9+
2015-07-05 22:39:40 +03:00
Arik Fraimovich
05c2c21a85 Bump version. 2015-07-05 22:39:12 +03:00
Kazuyuki Honda
00edc29e50 Support influxdb 0.9+ 2015-07-06 01:15:43 +09:00
Arik Fraimovich
3771af0a8c Update bootstrap.sh to use 0.6.2. 2015-07-05 08:30:11 +03:00
Arik Fraimovich
c32c2d43f7 Bump version. 2015-07-04 10:41:06 +03:00
Arik Fraimovich
4e2e3f9077 Merge pull request #472 from BrunoSalerno/map_visualization_options_fixed
map visualization: options fixed
2015-07-04 10:23:55 +03:00
Bruno Salerno
2a27422df9 map visualization: draw_options to scope 2015-07-03 18:02:22 -03:00
Bruno Salerno
f9e0ce8e9c map visualization: options fixed 2015-07-03 16:45:55 -03:00
Arik Fraimovich
a1d49f13d3 Merge pull request #471 from EverythingMe/fix/visualization_api
Fix: opening viz editor resets its options
2015-07-02 13:17:50 +03:00
Arik Fraimovich
26aa199f9c Fix: opening viz editor resets its options 2015-07-02 13:17:32 +03:00
Arik Fraimovich
4c77f3f914 Merge pull request #470 from EverythingMe/fix/visualization_api
Increase limit of tables for showing search.
2015-07-02 11:06:19 +03:00
Arik Fraimovich
d6be792595 Increase limit of tables for showing search. 2015-07-02 11:05:45 +03:00
Arik Fraimovich
59c1ea7f16 Merge pull request #469 from EverythingMe/fix/visualization_api
Fix: map - HTTPS support in tiles/marker
2015-07-02 11:05:25 +03:00
Arik Fraimovich
4d24005eff Fix: map - HTTPS support in tiles/marker 2015-07-02 11:02:44 +03:00
Arik Fraimovich
2dab35b614 Merge pull request #468 from EverythingMe/fix/visualization_api
Fix: visualizations API fixes
2015-07-02 08:51:09 +03:00
Arik Fraimovich
0b61b88f5f Fix: make default options apply to new visualizations 2015-07-02 08:38:08 +03:00
Arik Fraimovich
e5cb58207c Fix: vis title wasn't updating when changing type 2015-07-02 08:26:10 +03:00
Arik Fraimovich
fc17d1af81 Don't cache static assets in debug mode 2015-07-02 08:25:51 +03:00
Arik Fraimovich
e6650e1e2d Merge pull request #467 from BrunoSalerno/leaflet-visualization-marker-path-bug-fixed
leaflet visualization: marker path bug handled
2015-07-01 22:49:12 +03:00
Bruno Salerno
3aa1cd0133 leaflet visualization: marker path bug handled 2015-07-01 16:40:56 -03:00
Arik Fraimovich
e04833c327 Merge pull request #466 from BrunoSalerno/leaflet-visualization
Feature: Map visualization (using Leaflet)
2015-07-01 20:58:43 +03:00
Bruno Salerno
b743cceb60 leaflet visualization: map template margins fixed 2015-07-01 14:53:31 -03:00
Bruno Salerno
a0e134d3b5 leaflet visualization: dinamic height 2015-07-01 14:15:17 -03:00
Bruno Salerno
d7fb2d7458 leaflet-visualization: div size fixed and bounds storting improved 2015-07-01 12:30:48 -03:00
Bruno Salerno
b913ce6022 leaflet visualization: color series named properly 2015-07-01 10:03:43 -03:00
Bruno Salerno
1eb7945d16 leaflet visualization: map bounds are stored and kept 2015-06-30 18:18:34 -03:00
Bruno Salerno
37d0026ee4 leaflet-visualization: point feature 2015-06-30 17:34:31 -03:00
Arik Fraimovich
9cdc2cb2f7 Merge pull request #465 from EverythingMe/fix/time_field_serialize
Feature: ability to control series order in charts.
2015-06-30 09:26:26 +03:00
Arik Fraimovich
a9bff9063e Feature: cli to get status. 2015-06-30 09:25:32 +03:00
Arik Fraimovich
380126ee44 Feature: ability to control series index in charts. 2015-06-30 09:15:00 +03:00
Arik Fraimovich
d8377375b8 Merge pull request #461 from myinsiders/saml
Added SAML authentication support, eg for OneLogin or Okta
2015-06-30 08:25:44 +03:00
Arik Fraimovich
98ff701f9a Merge pull request #464 from EverythingMe/fix/time_field_serialize
Fix #463: support for datetime.time and datetime.timedelta fields
2015-06-29 18:06:25 +03:00
Arik Fraimovich
f5ea3e97d3 Fix: support for datetime.time and datetime.timedelta fields 2015-06-29 18:01:36 +03:00
Mark White
719e96dd2f Added SAML login option to login form 2015-06-28 17:19:57 +01:00
Arik Fraimovich
6c6c0256ba Merge pull request #462 from EverythingMe/fix_codemirror_resize_issue
Fix: refresh CodeMirror size when schema browser appears
2015-06-28 13:46:12 +03:00
Arik Fraimovich
723df51cdd Fix: refresh CodeMirror size when schema browser appears 2015-06-28 13:45:49 +03:00
Arik Fraimovich
a0f4e263b2 Merge pull request #459 from olgakogan/patch-2
Fixed an error in case a query doesn't have last_modified_date
2015-06-28 10:27:04 +03:00
Arik Fraimovich
4706bf8060 Merge pull request #458 from erans/master
Initial and very early support for ElasticSearch query runner
2015-06-28 10:26:26 +03:00
Mark White
f96a9f659a Added Apache license to code taken from Okta 2015-06-26 11:45:24 +01:00
Mark White
63c273f896 Fixed issue in saml login 2015-06-26 11:12:27 +01:00
Mark White
622ac6d781 Fixes to saml callback server name code 2015-06-26 10:26:59 +01:00
Mark White
8dc564a8bc Added configuration of flask server name 2015-06-26 09:06:50 +01:00
Mark White
3ae5baef22 Added OneLogin support 2015-06-25 17:52:00 +01:00
olga
8d819068b5 Fixed an error in case a query doesn't have last_modified_date 2015-06-25 11:31:22 +03:00
Eran Sandler
585e056265 Initial very early release of an ElasticSearch query runner. It only support Lucene style queries (single line, similar to what Kibana uses but without aggregations). 2015-06-24 09:53:09 +03:00
Arik Fraimovich
1914ed7c7c Merge pull request #456 from bells17/master
Changed the README's 'Setting up re:dash instance' url to a new url
2015-06-19 10:25:11 +01:00
bells17
bd216e93e7 Changed the README's 'Setting up re:dash instance' url to a new url 2015-06-19 10:20:41 +09:00
Arik Fraimovich
5e351de896 Merge pull request #455 from erans/master
added Mongo JSON serializer to correctly serialize ObjectId + datetime.datetime serialization
2015-06-17 10:59:42 +03:00
Eran Sandler
de0e534c77 removed the unnecessary check for datetime.datetime in the JSON encoder. 2015-06-17 10:58:12 +03:00
Eran Sandler
5fa1f9440d duh! 2015-06-16 11:50:20 +03:00
Eran Sandler
b3ddc5f8b9 removed old conversion of ObjectId to string since it is now part of the new JSON serializer 2015-06-16 11:34:19 +03:00
Eran Sandler
8cde5f9673 added Mongo JSON serializer to correctly serialize ObjectId 2015-06-16 11:27:23 +03:00
Arik Fraimovich
1bb53ca497 Merge pull request #451 from EverythingMe/fix/unicode_in_annotation
Fix: charts with category X axis were not sorted properly
2015-06-11 21:46:26 +03:00
Arik Fraimovich
0a3cd9267f Fix: charts with category x axis were not sorted properly 2015-06-11 21:45:45 +03:00
Arik Fraimovich
075d843354 Merge pull request #449 from EverythingMe/fix/unicode_in_annotation
Fix: schema browser chokes on large schemas
2015-06-10 13:36:53 +03:00
Arik Fraimovich
b14e5e8c0e Fix: schema browser chokes on large schemas 2015-06-10 13:36:05 +03:00
Arik Fraimovich
c9da4be422 Merge pull request #442 from EverythingMe/fix/timezone
Fix: when the server has non UTC timezone, timestamps were wrong
2015-06-07 22:23:46 +03:00
Arik Fraimovich
276ee7c27a Merge pull request #448 from olgakogan/master
supervisord default config: separate queue for ad-hoc and scheduled queries
2015-06-07 17:38:53 +03:00
olga
334040532a changed default concurrency level to 2 per queue 2015-06-07 17:36:24 +03:00
olga
335a3a98b5 separated the queue for ad-hoc and for scheduled queries (someone who runs an ad-hoc query should not wait because there scheduled queries are being refreshed at that time) 2015-06-07 17:28:57 +03:00
Arik Fraimovich
b17080a7f5 Merge pull request #446 from EverythingMe/fix/unicode_in_annotation
Fix #443: open table when searching & don't hide columns
2015-06-05 18:13:05 +03:00
Arik Fraimovich
8441c12b01 Fix #443: open table when searching & don't hide columns 2015-06-05 18:08:06 +03:00
Arik Fraimovich
3b4af1b6fa Merge pull request #445 from EverythingMe/fix/unicode_in_annotation
Fix #444: unicode characters in username fail query execution
2015-06-05 16:58:00 +03:00
Arik Fraimovich
c3deb8e2fa Fix #444: unicode characters in username fail query execution 2015-06-05 16:49:25 +03:00
Arik Fraimovich
a60b1686da Fix: when the server has non UTC timezone, timestamps were wrong 2015-06-03 07:58:28 +03:00
Arik Fraimovich
b56e87ceb2 Merge pull request #440 from EverythingMe/fix_ui
Fix: python query runner didn't allow iterating lists
2015-05-31 10:20:32 +03:00
Arik Fraimovich
fc89bcdaf3 Fix: python query runner didn't allow accessing dicts 2015-05-31 10:15:48 +03:00
Arik Fraimovich
15ec8321bb Merge pull request #437 from EverythingMe/fix_ui
Feature: ability to disable x axis labels
2015-05-19 22:24:36 +03:00
Arik Fraimovich
e6ba62485c Merge pull request #436 from EverythingMe/fix_ui
Fix: sorting not working for columns with special characters
2015-05-19 22:15:21 +03:00
Arik Fraimovich
9077b01fb9 Feature: ability to disable x axis labels 2015-05-19 22:15:08 +03:00
Arik Fraimovich
f45281be96 Fix: annotation was failing if query had unicode in it 2015-05-19 22:01:02 +03:00
Arik Fraimovich
a1c8ef9037 Merge pull request #435 from EverythingMe/fix_ui
Fix: string columns with date/time values failed to render.
2015-05-19 22:00:37 +03:00
Arik Fraimovich
f46e8af23f Fix: sorting not working for columns with special characters 2015-05-19 22:00:15 +03:00
Arik Fraimovich
30a89bfd2c Fix: string columns with dates failed to render. 2015-05-19 21:43:50 +03:00
Arik Fraimovich
6312f8738d Merge pull request #433 from stanhu/make-query-link-obvious
Make it obvious that the query link is clickable.
2015-05-17 08:18:19 +03:00
Stan Hu
9e3d5c10c5 Make it obvious that the query link is clickable: underline when hovering and add glyphicon 2015-05-16 22:06:04 -07:00
Arik Fraimovich
59b87ec4fd Merge pull request #434 from erans/master
MongoDB aggregation support + mongo documentation (as comments)
2015-05-17 07:49:20 +03:00
Eran Sandler
27ecf5f25c Merged the older MongoDB code into the new mongodb query runner to support aggregation 2015-05-16 22:22:33 +03:00
Arik Fraimovich
105971c4c8 Merge pull request #432 from stanhu/allow-undefined-max-age
Allow undefined max_age parameter in query_results endpoint
2015-05-15 11:25:24 +03:00
Stan Hu
690f8323c3 Allow undefined max_age parameter in query_results endpoint
An Error 500 would be returned by the endpoint if you attempted to
pass a query parameter to the dashboard since maxAge was undefined in JavaScript.
2015-05-14 22:00:08 -07:00
Arik Fraimovich
20eb110ce3 Fix: update_release_commit_sha should return json 2015-05-14 10:09:57 +03:00
Arik Fraimovich
571c9d0aee Update release manager: update tag commit sha on new release 2015-05-14 09:59:21 +03:00
Arik Fraimovich
0ee7292f16 Merge pull request #431 from EverythingMe/feature/additional_refresh_rates
Feature: additional refresh times (5, 10, 15, 30 minutes)
2015-05-14 09:25:35 +03:00
Arik Fraimovich
8c28392dfd Feature: additional refersh times (5,10,15,30 minutes) 2015-05-13 20:59:39 +03:00
Arik Fraimovich
671f1f4478 Merge pull request #428 from olgakogan/master
Feature: support for column types in MySQL query runner
2015-05-12 13:55:56 +03:00
olga
557d3748be added support to column types in mysql 2015-05-12 12:01:47 +03:00
Arik Fraimovich
f00d080ed2 Install optipng in CircleCI. 2015-05-12 10:33:11 +03:00
Arik Fraimovich
4e76c1305f Merge pull request #425 from EverythingMe/new_logo
New logo
2015-05-12 10:27:01 +03:00
Arik Fraimovich
36ef388e92 Bump version 2015-05-12 10:26:16 +03:00
Arik Fraimovich
2e1ee7f76c New logo 2015-05-12 10:25:57 +03:00
Arik Fraimovich
fc1e38772d New logo! 2015-05-11 23:13:15 +03:00
Arik Fraimovich
0e631a5121 Merge pull request #422 from EverythingMe/feature/288_bq_instance_auth
Feature: BigQueryGCE query runner that uses instance auth (fixes #288)
2015-05-10 23:18:45 +03:00
Arik Fraimovich
d74175efca Feature: BigQueryGCE query runner that uses instance auth 2015-05-10 08:46:41 +03:00
Arik Fraimovich
bf5fe7d2c7 Merge pull request #421 from EverythingMe/fix/issue_417
Feature: show visualization name next to query name (#418)
2015-05-08 22:28:12 +03:00
Arik Fraimovich
0f022aba92 Feature: show visualization name next to query name. 2015-05-07 21:58:12 +03:00
Arik Fraimovich
0b6e55e55a Remove unused code 2015-05-07 21:58:08 +03:00
Arik Fraimovich
e1c409366c Merge pull request #420 from EverythingMe/fix/issue_417
Fix: Make query editor auto resize again to prevent scroll issues
2015-05-07 21:52:07 +03:00
Arik Fraimovich
3b942118e9 Make query editor auto resize again to prevent scroll issues 2015-05-07 21:39:25 +03:00
Arik Fraimovich
7f1543db8f Merge pull request #419 from EverythingMe/fix/issue_417
Fix #417: integer columns treated as floats
2015-05-07 21:38:54 +03:00
Arik Fraimovich
74a5121be2 Fix #417: integer columns treated as floats 2015-05-07 21:25:30 +03:00
Arik Fraimovich
26fe136a1a Merge pull request #416 from daamien/patch-1
Upgrade to requests 2.3.0
2015-05-07 09:30:43 +03:00
damien clochard
83fb189b05 Update requirements.txt
The bootstrap.sh script fails on Debian 7.8

I solved the problem with :

$ sudo pip install requests==2.3.0

Check this bug for more details :
https://github.com/kennethreitz/requests/issues/2028
2015-05-06 18:36:24 +02:00
Arik Fraimovich
5e8d0d36c0 Merge pull request #409 from erans/master
Fix: minor fixes for MongoDB, script and Python query runners
2015-04-26 11:07:33 +03:00
Eran Sandler
4ae4cffa04 Removed a copy-paste duplication. Hmpf. 2015-04-26 11:05:40 +03:00
Eran Sandler
bc433e88fe Fix for _getitem_ error when accessing a dictionary directly. 2015-04-26 11:03:53 +03:00
Arik Fraimovich
513ef501a4 Merge pull request #410 from stanhu/sort-by-y-values
Feature: sort by Y values charts that have a single value per series
2015-04-26 10:23:06 +03:00
Stan Hu
f2bdcbedfb Simplify code and remove sortY option to avoid confusion 2015-04-26 00:18:03 -07:00
Stan Hu
fd056edb2a Support sort by y values for charts that have a single value per series 2015-04-21 22:52:14 -07:00
Eran Sandler
0f0acfdd12 Fix which prevented MongoDB connections to execute queries due to a faulty json schema configuration. 2015-04-22 00:18:28 +03:00
Eran Sandler
1e3b507b2b For for the script data source when command line parameters are passed as part of the query. 2015-04-21 09:36:05 +03:00
Arik Fraimovich
84d95272f3 Comment out active tasks cleanup, as it sometimes fails. 2015-04-20 10:05:04 +03:00
Arik Fraimovich
3b08e9e214 Merge pull request #408 from alexanderlz/master
Feature: additional metadata in query annotation (username, query id, queue name)
2015-04-20 08:48:59 +03:00
Arik Fraimovich
f4be83b06f Use query id from UI & annotate scheduled queries 2015-04-20 08:46:01 +03:00
Alexander Leibzon
4918d0430c add redash username/query_id to query for easier backtracking 2015-04-20 02:16:12 +03:00
Arik Fraimovich
e25b86b10d Merge pull request #398 from lenguyenthedat/data_sources_name_unique
Fix: make the data_sources' name unique
2015-04-18 22:51:12 +03:00
Arik Fraimovich
d3d305a843 Make sure data sources have unique names in tests 2015-04-18 22:46:42 +03:00
Arik Fraimovich
825b93bfe9 Fix migration numbering (there is 0007 already) 2015-04-18 22:46:42 +03:00
Arik Fraimovich
8c98282200 Rename only data sources with duplicates 2015-04-18 22:46:42 +03:00
Dat Le
768ac9eb04 Fix: make the data_sources's name unique
Also added migration script.
2015-04-18 22:46:42 +03:00
Arik Fraimovich
71011d2fca Merge pull request #407 from stanhu/add-flask-admin 2015-04-18 22:23:10 +03:00
Arik Fraimovich
9683a8ed82 Dedicated view for data source 2015-04-18 22:21:58 +03:00
Arik Fraimovich
10a6ac9313 Dedicated view for User model 2015-04-18 18:48:44 +03:00
Arik Fraimovich
dba325e9a2 Use ArrayListField for Array fields. 2015-04-18 18:47:54 +03:00
Arik Fraimovich
fcd9ab533c Fix: correctly call CustomModelConverter __init__. 2015-04-18 18:46:32 +03:00
Arik Fraimovich
68e3e8e1c5 Update name in admin screens 2015-04-18 18:00:52 +03:00
Arik Fraimovich
7f8b738b9e Fix requirements.txt (peewee was specified twice) 2015-04-18 16:58:05 +03:00
Arik Fraimovich
8a35dcedfa Merge pull request #406 from stanhu/add-mysql-port
Add support for configuring MySQL port
2015-04-18 16:14:26 +03:00
Stan Hu
ef763b7157 Use Flask-Admin to provide basic Web-based /admin page 2015-04-18 04:11:30 -07:00
Stan Hu
498e1d4474 Add support for configuring MySQL port 2015-04-17 22:57:34 -07:00
Arik Fraimovich
73de936c75 Merge pull request #405 from EverythingMe/feature/syntax_highglight
Feature: use correct syntax highlighting for Python/Mongo data sources
2015-04-14 17:53:46 +03:00
Arik Fraimovich
e32b709a41 Typo fix in the python query runner 2015-04-14 17:50:36 +03:00
Arik Fraimovich
60652f63c4 Use correct syntax highlighting for Python/Mongo sources 2015-04-14 17:48:36 +03:00
Arik Fraimovich
d0d4101f90 Merge pull request #404 from erans/master
Improvement: make Python datasource to use the RestrictedPython sandbox
2015-04-13 16:13:00 +03:00
Eran Sandler
646875794f Per request by Arik - the BDFL :-) 2015-04-13 15:27:28 +03:00
Eran Sandler
cdad4be0d5 Removed the try..catch block in the import of RestrictedPython since we are putting it in the requirements.txt file. 2015-04-13 15:23:49 +03:00
Eran Sandler
8f4285be62 Minor fixes from code review. 2015-04-13 15:21:43 +03:00
Eran Sandler
acfa55e2d0 Python datasource that uses RestrictedPython. Only modules listed in "allowedImportModules" (command separated) will be allowed to be imported and the code assume they are installed on the server running the actual code. 2015-04-13 11:22:22 +03:00
Arik Fraimovich
0b7cd07db0 Merge pull request #403 from EverythingMe/chore/release_process
Fix: schema browser styles
2015-04-08 16:14:30 +03:00
Arik Fraimovich
6297ffd523 Fix: schema browser styles 2015-04-08 16:13:03 +03:00
Arik Fraimovich
368f4fdbef Merge pull request #402 from EverythingMe/chore/release_process
New release process.
2015-04-06 12:51:12 +03:00
Arik Fraimovich
f52044a209 New release process 2015-04-06 12:50:17 +03:00
Arik Fraimovich
9fb33cf746 Merge pull request #399 from EverythingMe/feature/schema
Feature: schema browser and simple autocomplete
2015-04-02 17:10:07 +03:00
Arik Fraimovich
e3c5da5bc5 Fix tests to use correct data 2015-04-02 17:05:16 +03:00
Arik Fraimovich
e675690cc6 Sort schema by name 2015-04-02 16:56:00 +03:00
Arik Fraimovich
edc1622cf5 Schema support for MySQL 2015-04-02 16:55:52 +03:00
Arik Fraimovich
5ab3d4a40d Basic autocomplete functionality 2015-04-02 16:12:33 +03:00
Arik Fraimovich
cb29d87b63 Improve formatting of schema browser 2015-04-02 15:40:43 +03:00
Arik Fraimovich
6ff6bdad9f Use the correct redis connection in tests 2015-04-02 11:25:42 +03:00
Arik Fraimovich
e3cc3ef9a4 Move schema fetching to DataSource + tests 2015-04-02 11:25:42 +03:00
Arik Fraimovich
1fe4f291f2 Flush test redis db after each test 2015-04-02 11:25:22 +03:00
Arik Fraimovich
a54119f4a2 Show schema along side the query 2015-04-02 11:25:22 +03:00
Arik Fraimovich
c5b7fe5321 Use codemirror directly without ui-codemirror 2015-04-02 11:24:47 +03:00
Arik Fraimovich
d487ec9153 Upgrade codemirror to latest version 2015-04-02 11:24:18 +03:00
Arik Fraimovich
fa19b1ddc8 Endpoint to return data source schema 2015-04-02 11:23:52 +03:00
Arik Fraimovich
267c32b390 Merge pull request #401 from EverythingMe/fix/wrong_time_zone
Fix: use correct date when converting to UTC to get correct timezone.
2015-04-02 07:40:27 +03:00
Arik Fraimovich
aeff3f1494 Fix: use correct date when converting to UTC to get correct timezone. 2015-04-02 07:39:37 +03:00
Arik Fraimovich
e80e52f6c9 Add annotations for the injector. 2015-04-01 20:23:18 +03:00
Arik Fraimovich
fe41a70602 Merge pull request #400 from EverythingMe/feature/better_scheduler
Improved query scheduling option
2015-04-01 17:28:02 +03:00
Arik Fraimovich
976d9abe2d Disable UI tests, as they are no longer maintained :-( 2015-04-01 17:23:08 +03:00
Arik Fraimovich
041bc1100a New UI for query schedule setting 2015-04-01 17:07:19 +03:00
Arik Fraimovich
5d095ff6ab Resolve #113: upgrade to latest ui-bootstrap 2015-04-01 12:48:24 +03:00
Arik Fraimovich
ef01b61b29 Fix: refresh selector had empty option 2015-04-01 12:11:14 +03:00
Arik Fraimovich
faad6b656b Change query ttl field to be a string and named schedule.
This to allow other types of scheduling than just repeat every X seconds.
The first supported option will be: repeat every day at hour X.
2015-04-01 11:23:26 +03:00
Arik Fraimovich
0bc775584b Merge pull request #397 from EverythingMe/feature/edit_others_queries
Fix: forking broken
2015-03-22 17:32:13 +02:00
Arik Fraimovich
f2d96d61a1 Fix: forking broken 2015-03-22 17:28:47 +02:00
Arik Fraimovich
09bf2dd608 Merge pull request #396 from EverythingMe/feature/edit_others_queries
Feature: allow editing others' queries
2015-03-22 14:53:02 +02:00
Arik Fraimovich
ad1b9b06cf Fix test. 2015-03-22 14:42:08 +02:00
Arik Fraimovich
a4bceae60b Allow anyone to edit any query & show who edited it 2015-03-22 13:22:11 +02:00
Arik Fraimovich
9385449feb Add updated_at timestamp to visualization, query, dashboard and users models 2015-03-22 12:58:26 +02:00
Arik Fraimovich
562e1bb8c9 Merge pull request #395 from EverythingMe/feature/post_to_create_a_query
Convert additional dates to user's formatting
2015-03-19 08:54:54 +02:00
Arik Fraimovich
082b718303 Convert additional dates to user's formatting 2015-03-19 08:54:04 +02:00
Arik Fraimovich
c0872899e9 Merge pull request #394 from EverythingMe/feature/post_to_create_a_query
Fix: column definitions weren't updated.
2015-03-19 08:43:17 +02:00
Arik Fraimovich
086bbf129d Fix: column definitions weren't udpated 2015-03-19 08:40:21 +02:00
Arik Fraimovich
4b7561e538 Merge pull request #393 from EverythingMe/feature/post_to_create_a_query
Fix: allow Unicode and other special chars in column names
2015-03-19 08:34:06 +02:00
Arik Fraimovich
407c5a839b Fix: allow Unicode and other special chars in column names
Stopped using Angular's $parse and just accessing the property directly.
2015-03-19 08:33:16 +02:00
Arik Fraimovich
b8aefd26b8 Merge pull request #392 from EverythingMe/feature/post_to_create_a_query
Support posting to /queries/new to create a new query.
2015-03-18 13:42:55 +02:00
Arik Fraimovich
85a762bcd2 Support posting to /queries/new to create a new query. 2015-03-18 13:28:23 +02:00
Arik Fraimovich
4f1b3d5beb Merge pull request #391 from EverythingMe/feature/api_key_auth
Fix: allow dots in column name
2015-03-16 15:08:00 +02:00
Arik Fraimovich
9218a7c437 Fix: allow dots in column name 2015-03-16 14:59:51 +02:00
Arik Fraimovich
71a3f066a5 Ignore gh-pages branch in CircleCI. 2015-03-16 09:03:52 +02:00
Arik Fraimovich
89436d779c Merge pull request #390 from fedex1/patch-1
Update bootstrap.sh
2015-03-16 05:37:33 +02:00
Ralph Yozzo
3631e938da Update bootstrap.sh
# modified by @fedex1 3/15/2015 seems to be the latest version at this point in time.
2015-03-15 23:27:45 -04:00
Arik Fraimovich
c0a9db68f0 Merge pull request #389 from EverythingMe/feature/api_key_auth
Fix: show date/time with respect to user's locale
2015-03-15 18:53:31 +02:00
Arik Fraimovich
bec9c9e14e Fix: show date/time in user's locale 2015-03-15 18:53:02 +02:00
Arik Fraimovich
47bbc25277 Merge pull request #388 from EverythingMe/feature/api_key_auth
Make it possible to set enabled query runners from env
2015-03-12 12:00:26 +02:00
Arik Fraimovich
f02c2588d2 Make it possible to set enabled query runners from env 2015-03-12 11:52:31 +02:00
Arik Fraimovich
7db5449dad Merge pull request #387 from EverythingMe/feature/api_key_auth
Record event when accessing query result from API
2015-03-12 11:46:35 +02:00
Arik Fraimovich
7f6c7f0634 Record event when accessing query result from API 2015-03-12 11:43:21 +02:00
Arik Fraimovich
73955c74f7 Merge pull request #386 from EverythingMe/feature/api_key_auth
Code cleanup (remove "worker's status" dead link & unused settings)
2015-03-11 11:30:15 +02:00
Arik Fraimovich
7de85da8ef Remove unused settings 2015-03-11 07:50:49 +02:00
Arik Fraimovich
0aab35252a Remove broken "Worker's Status" page 2015-03-11 07:47:10 +02:00
Arik Fraimovich
141dbc9e70 Merge pull request #385 from EverythingMe/feature/api_key_auth
Feature: optional API Key authentication instead of HMAC
2015-03-10 18:29:01 +02:00
Arik Fraimovich
2e513c347c Cleanup 2015-03-10 18:21:51 +02:00
Arik Fraimovich
335c136ec2 Show API Key button in query view 2015-03-10 18:08:02 +02:00
Arik Fraimovich
df1170eb9b Feature: optional api key only authentication 2015-03-10 17:51:17 +02:00
Arik Fraimovich
69bcaddbe0 Fix: migrations stopped working due to peewee upgrade 2015-03-09 16:55:55 +02:00
Arik Fraimovich
67958cc27b MySQL query runner: make configuration access safer 2015-03-09 10:16:06 +02:00
Arik Fraimovich
6c716f23d9 Fix migration & query runner for mysql 2015-03-09 08:58:03 +02:00
Arik Fraimovich
bea11b0ac2 Merge pull request #384 from EverythingMe/feature/python_query_runner
Experimental Python query runner
2015-03-08 15:03:59 +02:00
Arik Fraimovich
4927386299 Experimental Python query runner 2015-03-08 15:02:57 +02:00
Arik Fraimovich
30a8550f6b Merge pull request #383 from EverythingMe/fix/migration
Fix: make migration work with new peewee
2015-03-08 14:37:42 +02:00
Arik Fraimovich
0389a45be4 Fix: make migration work with new peewee 2015-03-08 13:28:18 +02:00
Arik Fraimovich
707c169867 Merge pull request #382 from EverythingMe/feature/datasources_v2
Fix: import should be global
2015-03-08 12:27:34 +02:00
Arik Fraimovich
fca034ac0d Fix: import should be global 2015-03-08 12:23:51 +02:00
Arik Fraimovich
97691ea5ee Merge pull request #380 from EverythingMe/feature/datasources_v2
Refactor datasources (query runners)
2015-03-08 11:50:09 +02:00
Arik Fraimovich
40335a0e21 Fix: add missing option flags 2015-03-08 11:00:56 +02:00
Arik Fraimovich
9344cbd078 Update bootstrap script to support new format 2015-03-08 10:38:50 +02:00
Arik Fraimovich
9442fd9465 Update logging messages 2015-03-02 09:49:17 +02:00
Arik Fraimovich
c816f1003d Bump version 2015-03-02 09:45:29 +02:00
Arik Fraimovich
2107b79a80 Use validation for data source editing 2015-03-02 09:44:55 +02:00
Arik Fraimovich
8fae6de8c7 Update datasource CLI to use new format 2015-03-02 09:40:15 +02:00
Arik Fraimovich
d798c77574 Support for already valid data source config 2015-03-02 07:34:06 +02:00
Arik Fraimovich
0abce27381 Set configuration in base ctor 2015-02-24 07:50:10 +02:00
Arik Fraimovich
8a171ba39a Use JSON Schema for data source configuration 2015-02-24 07:50:10 +02:00
Arik Fraimovich
20af276772 Updated configuration spec to include friendly name and more 2015-02-24 07:50:10 +02:00
Arik Fraimovich
4058342763 WIP: configuration object 2015-02-24 07:50:10 +02:00
Arik Fraimovich
af64657260 Migration to update all data source options 2015-02-24 07:50:09 +02:00
Arik Fraimovich
b6bd46e59e New query runners implementation 2015-02-24 07:50:09 +02:00
Arik Fraimovich
31fe547e03 Merge pull request #378 from EverythingMe/feature/variables
Fix #263: timestamp fields should be with time zone
2015-02-23 11:10:20 +02:00
Arik Fraimovich
aff324071e Update peewee version 2015-02-23 09:19:39 +02:00
Arik Fraimovich
131266e408 Fix #263: timestamp fields should be with time zone 2015-02-23 09:02:16 +02:00
Arik Fraimovich
b1f97e8c8d Merge pull request #377 from olgakogan/master
'Download Dataset' fix - error in case of big numeric values
2015-02-21 15:21:18 +02:00
Arik Fraimovich
9783d6e839 Merge pull request #374 from akariv/master
Support unicode queries in search API
2015-02-21 14:48:36 +02:00
akariv
8eea2fb367 Support unicode queries in search API
Modify query test case to use unicode strings
2015-02-20 23:49:37 +02:00
olgakogan
b585480c81 removed redundant handling of large numbers when generating a csv file (causes ValueError: timestamp out of range) 2015-02-20 22:33:02 +02:00
Arik Fraimovich
89e307daba Merge pull request #373 from EverythingMe/feature/variables
UI Fixes
2015-02-08 18:18:37 +02:00
Arik Fraimovich
a5eb0e293c Fix: don't lock query editing while executing 2015-02-08 18:17:08 +02:00
Arik Fraimovich
48d1113225 Fix #371: show notification when query fails. 2015-02-08 18:08:24 +02:00
Arik Fraimovich
d82d5c3bdc Merge pull request #372 from EverythingMe/feature/variables
Several UI fixes
2015-02-08 18:05:05 +02:00
Arik Fraimovich
dfe58b3953 Give the user the option to disable sorting of chart data 2015-02-08 18:02:36 +02:00
Arik Fraimovich
44019b8357 Variables: allow nesting variables 2015-02-08 17:07:20 +02:00
Arik Fraimovich
3c15a44faf Fix: keyboard shortcuts were not unbinded 2015-02-08 17:07:06 +02:00
Arik Fraimovich
8d113dadd2 Revert "Fix #242: handle the case there is no connection to the server"
This reverts commit 3960005002.

Conflicts:
	rd_ui/app/index.html
	rd_ui/bower.json
2015-02-02 18:02:42 +02:00
Arik Fraimovich
c1dd26aee7 Merge pull request #370 from alexanderlz/master
add ISO datetime to filename when saving chart as image
2015-02-02 10:52:00 +02:00
Alexander Leibzon
b2228c2a39 replace 'possibly dangerous for some OSs' characters 2015-02-01 15:29:46 +02:00
Alexander Leibzon
d9618cb09c add ISO datetime to filename when saving chart as image 2015-02-01 14:52:58 +02:00
Arik Fraimovich
c8ca683d3a Merge pull request #368 from alexanderlz/master
Issue #168. Visualization: save as image.
2015-02-01 13:22:40 +02:00
Alexander Leibzon
888963ffaa Merge branch 'master' of https://github.com/alexanderlz/redash
Conflicts:
	rd_ui/app/index.html
	rd_ui/bower.json
2015-02-01 13:20:26 +02:00
Alexander Leibzon
ae947a8310 removing unwanted commit 2015-02-01 13:18:57 +02:00
Alexander Leibzon
bee9cde347 removing unwanted commit 2015-02-01 12:00:23 +02:00
Arik Fraimovich
c131dab125 Merge pull request #369 from EverythingMe/fix/dashboard_filters
Fix: filters got linked when they shouldn't have.
2015-02-01 11:57:46 +02:00
Arik Fraimovich
e113642ae4 Fix: filters got linked when they shouldn't have.
- Make a copy of the first filter, to prevent it controlling the other filters.
- If no query string value given or dashboard filters enabled, don't link filters.
2015-02-01 11:51:07 +02:00
Arik Fraimovich
b76906b168 Merge pull request #367 from EverythingMe/feature/offline
Fix #242: handle the case there is no connection to the server
2015-01-29 20:46:32 +02:00
Arik Fraimovich
3960005002 Fix #242: handle the case there is no connection to the server 2015-01-29 20:43:03 +02:00
Arik Fraimovich
3dde578b86 Only try to render params if they are required. 2015-01-29 15:33:08 +02:00
Arik Fraimovich
813f0e74ff Merge pull request #366 from EverythingMe/fix/mget_error
Several chart editor fixes and additions
2015-01-27 22:49:41 +02:00
Arik Fraimovich
1e4e37c2ce Ability to set y axis min/max (closes #257) 2015-01-27 22:45:16 +02:00
Arik Fraimovich
a00c80eab2 Don't change zIndex if it was already set 2015-01-27 22:30:26 +02:00
Arik Fraimovich
496e5ebe8c Fix: if new series was created in result set, it wasn't using the default chart type 2015-01-27 22:23:10 +02:00
Arik Fraimovich
18cc8434a0 Merge pull request #365 from EverythingMe/fix/mget_error
Fix: when no queries are being run, cleanup job fails with error
2015-01-27 18:39:26 +02:00
Arik Fraimovich
5eba318019 Fix: when no queries are being run, cleanup job fails with error 2015-01-27 18:23:21 +02:00
Arik Fraimovich
63274dbb17 Merge pull request #363 from EverythingMe/feature/query_parameters
Feature: support for query parameters
2015-01-27 18:22:29 +02:00
Arik Fraimovich
4c73e788ae Ability to set ttl (max age) from query string 2015-01-27 17:17:58 +02:00
Arik Fraimovich
b71a2b3651 Enable query params in dashboard 2015-01-27 17:00:21 +02:00
Arik Fraimovich
521a32dfff Merge pull request #364 from EverythingMe/fix/missing_text_widgets
Remove unneeded where clause which was preventing from text widgets to show.
2015-01-27 12:59:58 +02:00
Arik Fraimovich
fd6ebe6e12 Remove unneeded where clause which was preventing from text widgets to show. 2015-01-27 12:52:17 +02:00
Arik Fraimovich
6fb97675ad Add mustache to Karma conf 2015-01-27 11:28:51 +02:00
Arik Fraimovich
c0c102207d Initial work on support for query parameters 2015-01-27 10:28:11 +02:00
Arik Fraimovich
3b9d9ac75d Merge pull request #362 from joeysim/ctrl-s-for-save
added support for saving query with ctrl+s
2015-01-26 07:31:53 +02:00
Joey Simhon
2536fd57ed added support for saving query with cmd+s 2015-01-25 22:52:31 +02:00
Arik Fraimovich
d941e5e5b1 Merge pull request #361 from EverythingMe/DAT-825
Fix: fail with 403 when user not allowed to archive query.
2015-01-25 17:44:58 +02:00
Arik Fraimovich
039b0a89bb Merge pull request #359 from alexanderlz/master
add 'autoclose' to notifications (i.e. close after 3 seconds)
2015-01-25 17:35:53 +02:00
Arik Fraimovich
febf9939c8 Fix: fail with 403 when user not allowed to archive query. 2015-01-25 17:30:10 +02:00
Arik Fraimovich
bb84c6dab8 Merge pull request #360 from EverythingMe/DAT-825
Fix Gruntfile.js settings to copy font files.
2015-01-25 17:29:57 +02:00
Arik Fraimovich
cddc00e2cc Fix Gruntfile.js settings to copy font files. 2015-01-25 17:28:41 +02:00
Alexander Leibzon
091e3d41e1 add 'autoclose' to notifications (i.e. close after 3 seconds) 2015-01-25 17:14:06 +02:00
Arik Fraimovich
9dc3a35c1a Merge pull request #357 from alexanderlz/master
Bug #303: 'Show Total' duplicates values on multiple runs
2015-01-25 16:27:24 +02:00
Arik Fraimovich
f8878d3006 Merge pull request #358 from EverythingMe/DAT-825
Feature: archive query
2015-01-25 16:24:32 +02:00
Arik Fraimovich
1c0d596f26 Bump version due to migration. 2015-01-25 16:23:58 +02:00
Arik Fraimovich
1afd2ab388 Refactoring of @christophervalles work on query delete feature:
- Change delete into archive.
- Safely remove widgets.
- Make sure archived queries don't get scheduled, or show up in search.
- If direct link to query used, show notification.
- Tests.
- Some more.
2015-01-25 16:17:52 +02:00
Christopher Valles
4aa9500402 Working on delete query 2015-01-25 16:16:31 +02:00
Alexander Leibzon
4a8a4482fc add {} for readability 2015-01-25 15:29:45 +02:00
Alexander Leibzon
d83849a1b5 fix to apply with the original logic 2015-01-25 14:44:02 +02:00
Alexander Leibzon
44272f5d66 Bug #303: 'Show Total' duplicates values on multiple runs 2015-01-24 22:02:13 +02:00
Arik Fraimovich
83727ae931 Merge pull request #356 from alexanderlz/master
Bug #307 Fix: Notifications stopped working
2015-01-22 12:01:30 +02:00
Alexander Leibzon
0b0b88a255 remove unused line 2015-01-22 00:27:01 +02:00
Alexander Leibzon
f23d709f4e Bug #307 fix. Notifications stopped working 2015-01-22 00:16:31 +02:00
Arik Fraimovich
88abbc7ea6 Merge pull request #355 from EverythingMe/feature/personal_home
Several small fixes
2015-01-20 16:36:32 +02:00
Arik Fraimovich
16f0413af8 Fix: don't show dashboard filters where it's not enabled 2015-01-20 16:35:55 +02:00
Arik Fraimovich
f47020a64d Report personal page as different page 2015-01-20 16:32:31 +02:00
Arik Fraimovich
55e1ef81f7 Add activity_log to list of tables redash_reader can query 2015-01-20 16:32:31 +02:00
Arik Fraimovich
6bb43d0411 Merge pull request #354 from EverythingMe/feature/personal_home
Feature: personal home with recent queries & dashboards
2015-01-19 12:15:13 +02:00
Arik Fraimovich
f51c2328c9 Feature: personal home with recent queries & dashboards 2015-01-19 12:09:06 +02:00
Arik Fraimovich
fd37188ace Merge pull request #353 from EverythingMe/bug/dashboard_auto_refresh
Fix: nulls converted to strings in UI
2015-01-19 10:51:44 +02:00
Arik Fraimovich
758e27ce91 Fix: nulls converted to strings in UI 2015-01-19 10:49:39 +02:00
Arik Fraimovich
9a3b25eb50 Merge pull request #352 from EverythingMe/bug/dashboard_auto_refresh
Fix: dashboard auto refresh stopped working
2015-01-19 09:14:32 +02:00
Arik Fraimovich
6da890dfb8 FIX: dashboard auto refresh stopped working 2015-01-19 08:32:40 +02:00
Arik Fraimovich
0d35ec7139 Merge pull request #349 from erans/master
Minor bug fixes + supprot for limit and skip in simple query
2015-01-18 10:11:27 +02:00
Arik Fraimovich
dc0f9a63cb Merge pull request #351 from joeysim/search_improvements
Search improvements
2015-01-18 09:22:41 +02:00
Arik Fraimovich
21c042996e Merge pull request #350 from joeysim/ctrl_enter_exec
Added support for Cmd+Enter query execution for PCs
2015-01-18 09:21:32 +02:00
Joey Simhon
5f22adadf2 ordering all_queries by created_at desc for better relevancy with big lists 2015-01-17 21:19:22 +02:00
Joey Simhon
4e8888ce2f sort searched queries by creation time, assuming the newer queries are usually more relevant 2015-01-17 21:14:56 +02:00
Joey Simhon
0a69609d38 Added support for Cmd+Enter query execution for PCs 2015-01-17 00:32:21 +02:00
Eran Sandler
2dbcd88313 added support for skip and limit 2015-01-15 17:14:48 +02:00
Eran Sandler
6b0775f7c7 fixed an issue where 'query' element is missing as well as a bad sort order in simple queries 2015-01-15 17:11:32 +02:00
Arik Fraimovich
e85d3c3c9f Merge pull request #348 from EverythingMe/feature/additional_manage_commands
Feature: new data source management commands in manage.py
2015-01-14 12:35:13 +02:00
Arik Fraimovich
e20f57bba8 Added edit & delete commands to data source cli 2015-01-14 12:23:53 +02:00
Arik Fraimovich
933ace2e38 Split CLI commands to several files for easier editing and naming. 2015-01-14 10:52:11 +02:00
Arik Fraimovich
4c1e5aed6b Remove import from settings command (obsolete). 2015-01-14 10:27:53 +02:00
Arik Fraimovich
77d982b4aa Merge pull request #347 from barnash/query-params-for-filters
Query params for filters
2015-01-13 22:35:32 +02:00
barnash
02c8163265 Changed the query param to something more url friendly 2015-01-12 18:56:44 +02:00
Arik Fraimovich
ef868dbb6e Merge pull request #346 from erans/master
Initial support for Mongo's aggregation framework.
2015-01-12 18:17:41 +02:00
Iftach Bar
b2bab33baa added support for deep links to dashboards with saved filters 2015-01-12 09:23:27 +02:00
Iftach Bar
149e0835f8 fixed jshint stuff - semicolon in different places 2015-01-12 09:22:53 +02:00
Eran Sandler
50bed1d8f2 Initial support for Mongo's aggregation framework. 2015-01-11 12:37:37 +02:00
Eran Sandler
d4b5d78743 Perform a JSON.stringify on values who's type is "object" 2015-01-11 12:28:21 +02:00
Arik Fraimovich
7fc82a2562 Merge pull request #345 from EverythingMe/vagrant_dev
Developer Vagrant box for easier contribution
2014-12-30 07:52:07 +02:00
Arik Fraimovich
92fb138c2c Vagrant file to use the redash/dev box 2014-12-30 07:45:30 +02:00
Arik Fraimovich
71b4b45a3c Merge pull request #344 from EverythingMe/feature/query_results_cleanup
Job to cleanup unused query results
2014-12-25 15:58:10 +02:00
Arik Fraimovich
07f4a1b227 Fix: wiredep failing after version upgrade 2014-12-25 15:52:52 +02:00
Arik Fraimovich
e116e88e98 Job to cleanup unused query results 2014-12-25 15:39:49 +02:00
Arik Fraimovich
2278a181ca Merge pull request #339 from EverythingMe/counter-vis
bugfix: Counter visualization font size issues
2014-11-11 18:21:29 +02:00
Amir Nissim
98dc75a404 bugfix: Counter visualization was not watching for filter changes 2014-11-11 13:04:45 +02:00
Amir Nissim
536918aab3 bugfix: Counter visualization font size issues 2014-11-10 15:21:03 +02:00
Arik Fraimovich
c75ac80c7a Merge pull request #333 from EverythingMe/fix/import
Fix: mixed number columns was wrongly detected as integer
2014-11-05 11:33:46 +02:00
Arik Fraimovich
522d8542e9 Fix: mixed number columns was wrongly detected as integer 2014-11-05 11:30:17 +02:00
Arik Fraimovich
562df44c22 Merge pull request #331 from EverythingMe/fix/import
Fixes and improvements to import dashboard command:
2014-11-04 07:34:59 +02:00
Arik Fraimovich
86e6798c96 manage.py: better output for list data sources command 2014-11-04 07:26:32 +02:00
Arik Fraimovich
db7a287e82 manage.py: list all users command 2014-11-04 07:26:16 +02:00
Arik Fraimovich
518206f208 Fixes and imporvements to import dashboard:
- Update it to not expect query result.
- Add support for specifying data source.
- Create mapping file if it doesn't exist yet.
2014-11-04 07:24:51 +02:00
Arik Fraimovich
bcee1e12b4 Merge pull request #325 from EverythingMe/feature/search-by-id
Add support for searching for query by id
2014-10-30 08:23:41 +02:00
Arik Fraimovich
410f4f35e2 Add support for searching for query by id 2014-10-30 07:58:53 +02:00
Arik Fraimovich
84ea9fec43 Merge pull request #323 from EverythingMe/counter-vis
Counter visualization
2014-10-27 13:58:58 +02:00
Amir Nissim
cda82b7adc #27: use <select> for columns names 2014-10-27 11:47:38 +02:00
Amir Nissim
f2d8c2020b #27: counter and target as query params, change UI 2014-10-27 11:34:56 +02:00
Amir Nissim
1b82ecbc46 #27: Counter visualization draft 2014-10-26 15:42:57 +02:00
Arik Fraimovich
e381331c36 Merge pull request #319 from EverythingMe/bug_292
#292: Customizable series colors
2014-10-23 14:44:02 +03:00
Amir Nissim
ff58247987 #292: move color palette to ng_highcharts 2014-10-23 14:36:30 +03:00
Amir Nissim
dcf0d2cbe3 #292: Customizable series colors 2014-10-23 13:46:43 +03:00
Arik Fraimovich
eb99fa5671 Merge pull request #318 from EverythingMe/docs_setup
Packer: make re:dash version configurable
2014-10-22 12:01:32 +03:00
Arik Fraimovich
ce3e19f212 Make redash version configurable 2014-10-22 11:55:17 +03:00
Arik Fraimovich
44dca6da01 Spelling mistakes. 2014-10-21 19:02:17 +03:00
Arik Fraimovich
34c9fee540 Link to new setup instructions. 2014-10-21 19:01:40 +03:00
Arik Fraimovich
e0b13b2ffa Merge pull request #316 from EverythingMe/feature_users_cli
Add commands to change user's password and grant admin
2014-10-21 18:57:40 +03:00
Arik Fraimovich
df362c12b6 Add commands to change user password and grant admin 2014-10-21 18:51:23 +03:00
Arik Fraimovich
0d1f8c948a Merge pull request #309 from EverythingMe/docs_setup
Setup script for Ubuntu/Debian + packer configuration
2014-10-21 18:42:26 +03:00
Arik Fraimovich
f523378326 Setup script for Ubuntu/Debian + packer configuration
This script is intended to work on Ubuntu 12.04, Ubuntu 14.04 and Debian Wheezy (for GCE users).
To make sure we use the same version of Redis across all distributions we install from source,
and to make sure we use the same version of PostgreSQL we install it from PostgreSQL's apt.

Also included Packer configuration to generate GCE & AWS images.
2014-10-21 18:28:39 +03:00
Arik Fraimovich
b0f9e49709 Merge pull request #313 from erans/master
Forced setting a script execution path
2014-10-21 14:32:03 +03:00
Eran Sandler
b6dbb4e3f8 forced setting a script execution path 2014-10-21 11:20:31 +03:00
Arik Fraimovich
3f6a0e8ffa Merge pull request #312 from erans/master
MongoDB ReplicaSet support and a new connection string format.
2014-10-21 10:21:49 +03:00
Eran Sandler
a7bcc6d31e Added support for MongoDB ReplicaSet as well as changed the connection string format to a JSON based one (like BigQuery). Check the wiki for an example. 2014-10-21 10:16:48 +03:00
Arik Fraimovich
8aa2d8e70a landscape.io configuration file 2014-10-19 13:41:29 +03:00
Arik Fraimovich
4720e12be7 add angular-ui-select to list of dependencies 2014-10-15 17:56:32 +03:00
Arik Fraimovich
5463591f0d Merge branch 'feature/dashboard_add_query_by_name' 2014-10-15 17:45:57 +03:00
Arik Fraimovich
2a0198fba8 Make search expect at least 2 characters 2014-10-15 17:45:39 +03:00
Arik Fraimovich
652f214b25 Updated bower dependencies:
- Angular 1.2.7 -> 1.2.18 (to support angular-ui-select).
- angular-resource and angular-route to match Angular version.
- angular-growl to latest version that supports ~1.2.
- Change version of angular-ui-select to specific one.
2014-10-15 17:42:08 +03:00
Arik Fraimovich
aa49780134 Use unminified version of angular-ui-select 2014-10-15 17:41:55 +03:00
Raymond
f483b61cfb add global html sanitizer 2014-10-15 20:55:29 +08:00
Arik Fraimovich
38a189b671 Merge pull request #306 from raymoondtang/fix/clomun_type_ingeter
Client fix, clomun type support ingeter
2014-10-15 15:46:15 +03:00
Raymond
c2331988db use selected_query for ng-show of visualisation form 2014-10-15 20:32:15 +08:00
Raymond
eff5bdb454 Merge branch 'master' of github-yalo:EverythingMe/redash into fix/clomun_type_ingeter 2014-10-15 19:29:01 +08:00
Raymond
bd1babec3a Add query to dashboard based on name not query id, issue #171 2014-10-15 14:46:55 +08:00
Raymond
d43c2bbf62 table column type handle both integer and float 2014-10-13 12:57:42 +08:00
377 changed files with 37842 additions and 6759 deletions

4
.dockerignore Normal file
View File

@@ -0,0 +1,4 @@
rd_ui/.tmp/
rd_ui/node_modules/
.git/
.vagrant/

View File

@@ -1,9 +1,5 @@
REDASH_CONNECTION_ADAPTER=pg
REDASH_CONNECTION_STRING="dbname=data"
REDASH_STATIC_ASSETS_PATH=../rd_ui/app/
REDASH_GOOGLE_APPS_DOMAIN=
REDASH_ADMINS=
REDASH_WORKERS_COUNT=2
REDASH_COOKIE_SECRET=
REDASH_DATABASE_URL='postgresql://rd'
REDASH_LOG_LEVEL = "INFO"
REDASH_STATIC_ASSETS_PATH="../rd_ui/app/"
REDASH_LOG_LEVEL="INFO"
REDASH_REDIS_URL=redis://localhost:6379/1
REDASH_DATABASE_URL="postgresql://redash"
REDASH_COOKIE_SECRET=veryverysecret

4
.gitignore vendored
View File

@@ -8,6 +8,7 @@ celerybeat-schedule*
.#*
\#*#
*~
_build
# Vagrant related
.vagrant
@@ -18,3 +19,6 @@ redash/dump.rdb
venv
dump.rdb
# Docker related
docker-compose.yml

2
.landscape.yaml Normal file
View File

@@ -0,0 +1,2 @@
ignore-paths:
- migrations

53
Dockerfile Normal file
View File

@@ -0,0 +1,53 @@
FROM ubuntu:trusty
# Ubuntu packages
RUN apt-get update && \
apt-get install -y python-pip python-dev curl build-essential pwgen libffi-dev sudo git-core wget \
# Postgres client
libpq-dev \
# Additional packages required for data sources:
libssl-dev libmysqlclient-dev freetds-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Users creation
RUN useradd --system --comment " " --create-home redash
# Pip requirements for all data source types
RUN pip install -U setuptools && \
pip install supervisor==3.1.2
COPY . /opt/redash/current
RUN chown -R redash /opt/redash/current
# Setting working directory
WORKDIR /opt/redash/current
ENV REDASH_STATIC_ASSETS_PATH="../rd_ui/dist/"
# Install project specific dependencies
RUN pip install -r requirements_all_ds.txt && \
pip install -r requirements.txt
RUN curl https://deb.nodesource.com/setup_4.x | bash - && \
apt-get install -y nodejs && \
sudo -u redash -H make deps && \
rm -rf rd_ui/node_modules /home/redash/.npm /home/redash/.cache && \
apt-get purge -y nodejs && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Setup supervisord
RUN mkdir -p /opt/redash/supervisord && \
mkdir -p /opt/redash/logs && \
cp /opt/redash/current/setup/docker/supervisord/supervisord.conf /opt/redash/supervisord/supervisord.conf
# Fix permissions
RUN chown -R redash /opt/redash
# Expose ports
EXPOSE 5000
EXPOSE 9001
# Startup script
CMD ["supervisord", "-c", "/opt/redash/supervisord/supervisord.conf"]

19
LICENSE
View File

@@ -1,4 +1,5 @@
Copyright 2013 DoAT. All rights reserved.
Copyright (c) 2013-2016, Arik Fraimovich.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -10,17 +11,13 @@ are permitted provided that the following conditions are met:
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED “AS IS” WITHOUT ANY WARRANTIES WHATSOEVER.
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF NON INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL DoAT OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of
the authors and should not be interpreted as representing official policies,
either expressed or implied, of DoAT.

View File

@@ -1,22 +1,22 @@
NAME=redash
VERSION=`python ./manage.py version`
FULL_VERSION=$(VERSION)+b$(CIRCLE_BUILD_NUM)
BASE_VERSION=$(shell python ./manage.py version | cut -d + -f 1)
# VERSION gets evaluated every time it's referenced, therefore we need to use VERSION here instead of FULL_VERSION.
FILENAME=$(CIRCLE_ARTIFACTS)/$(NAME).$(VERSION).tar.gz
deps:
cd rd_ui && npm install
cd rd_ui && npm install -g bower grunt-cli
cd rd_ui && bower install
cd rd_ui && grunt build
if [ -d "./rd_ui/app" ]; then cd rd_ui && npm install; fi
if [ -d "./rd_ui/app" ]; then cd rd_ui && npm run bower install; fi
if [ -d "./rd_ui/app" ]; then cd rd_ui && npm run build; fi
pack:
sed -ri "s/^__version__ = '([0-9.]*)'/__version__ = '$(FULL_VERSION)'/" redash/__init__.py
tar -zcv -f $(FILENAME) --exclude=".git*" --exclude="*.pyc" --exclude="*.pyo" --exclude="venv" --exclude="rd_ui/node_modules" --exclude="rd_ui/dist/bower_components" --exclude="rd_ui/app" *
tar -zcv -f $(FILENAME) --exclude="optipng*" --exclude=".git*" --exclude="*.pyc" --exclude="*.pyo" --exclude="venv" --exclude="rd_ui/node_modules" --exclude="rd_ui/dist/bower_components" --exclude="rd_ui/app" *
upload:
python bin/upload_version.py $(VERSION) $(FILENAME)
python bin/release_manager.py $(CIRCLE_SHA1) $(BASE_VERSION) $(FILENAME)
test:
nosetests --with-coverage --cover-package=redash tests/*.py
cd rd_ui && grunt test
nosetests --with-coverage --cover-package=redash tests/
#cd rd_ui && grunt test

View File

@@ -1 +0,0 @@
web: honcho start -f Procfile.heroku -p $PORT

View File

@@ -1,2 +1,2 @@
web: ./manage.py runserver -p $PORT
web: ./manage.py runserver -p $PORT --host 0.0.0.0
worker: ./bin/run celery worker --app=redash.worker --beat -Qqueries,celery,scheduled_queries

View File

@@ -1,2 +0,0 @@
web: ./manage.py runserver -p $PORT --host 0.0.0.0 -d -r
worker: ./bin/run celery worker --app=redash.worker --beat -Qqueries,celery,scheduled_queries

View File

@@ -1,17 +1,24 @@
<p align="center">
<img title="re:dash" src='https://raw.githubusercontent.com/EverythingMe/redash/screenshots/redash_logo.png' />
More details about the future of re:dash : http://bit.ly/journey-first-step
---
<p align="center">
<img title="re:dash" src='http://redash.io/static/old_img/redash_logo.png' width="200px"/>
</p>
<p align="center">
<img title="Build Status" src='https://circleci.com/gh/EverythingMe/redash.png?circle-token=8a695aa5ec2cbfa89b48c275aea298318016f040'/>
<img title="Build Status" src='https://circleci.com/gh/getredash/redash.png?circle-token=8a695aa5ec2cbfa89b48c275aea298318016f040'/>
</p>
[![Join the chat at https://gitter.im/getredash/redash](https://badges.gitter.im/getredash/redash.svg)](https://gitter.im/getredash/redash?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Documentation](https://img.shields.io/badge/docs-redash.io-brightgreen.svg)](http://docs.redash.io)
**_re:dash_** is our take on freeing the data within our company in a way that will better fit our culture and usage patterns.
Prior to **_re:dash_**, we tried to use traditional BI suites and discovered a set of bloated, technically challenged and slow tools/flows. What we were looking for was a more hacker'ish way to look at data, so we built one.
**_re:dash_** was built to allow fast and easy access to billions of records, that we process and collect using Amazon Redshift ("petabyte scale data warehouse" that "speaks" PostgreSQL).
Today **_re:dash_** has support for querying multiple databases, including: Redshift, Google BigQuery, PostgreSQL, MySQL, Graphite and custom scripts.
Today **_re:dash_** has support for querying multiple databases, including: Redshift, Google BigQuery, PostgreSQL, MySQL, Graphite,
Presto, Google Spreadsheets, Cloudera Impala, Hive and custom scripts.
**_re:dash_** consists of two parts:
@@ -22,31 +29,28 @@ Today **_re:dash_** has support for querying multiple databases, including: Reds
## Demo
![Screenshots](https://raw.github.com/EverythingMe/redash/screenshots/screenshots.gif)
<img src="https://cloud.githubusercontent.com/assets/71468/12611424/1faf4d6a-c4f5-11e5-89b5-31efc1155d2c.gif" width="60%"/>
You can try out the demo instance: http://demo.redash.io/ (login with any Google account).
## Getting Started
* [Setting re:dash on your own server (Ubuntu)](https://github.com/EverythingMe/redash/wiki/Setting-re:dash-on-your-own-server-(for-version-0.4))
* Additional documentation in the [Wiki](https://github.com/everythingme/redash/wiki).
* [Setting up re:dash instance](http://redash.io/deployment/setup.html) (includes links to ready made AWS/GCE images).
* [Documentation](http://docs.redash.io).
## Getting help
## Getting Help
* [Google Group (mailing list)](https://groups.google.com/forum/#!forum/redash-users): the best place to get updates about new releases or ask general questions.
* Find us [on gitter](https://gitter.im/EverythingMe/redash#) (chat).
* Contact Arik, the maintainer directly: arik@everything.me.
## Roadmap
TBD.
* Issues: https://github.com/getredash/redash/issues
* Mailing List: https://groups.google.com/forum/#!forum/redash-users
* Slack: http://slack.redash.io/
* Gitter (chat): https://gitter.im/getredash/redash
## Reporting Bugs and Contributing Code
* Want to report a bug or request a feature? Please open [an issue](https://github.com/everythingme/redash/issues/new).
* Want to help us build **_re:dash_**? Fork the project and make a pull request. We need all the help we can get!
* Want to report a bug or request a feature? Please open [an issue](https://github.com/getredash/redash/issues/new).
* Want to help us build **_re:dash_**? Fork the project, edit in a [dev environment](http://docs.redash.io/en/latest/dev/vagrant.html), and make a pull request. We need all the help we can get!
## License
See [LICENSE](https://github.com/EverythingMe/redash/blob/master/LICENSE) file.
See [LICENSE](https://github.com/getredash/redash/blob/master/LICENSE) file.

11
Vagrantfile vendored Normal file
View File

@@ -0,0 +1,11 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "redash/dev"
config.vm.synced_folder "./", "/opt/redash/current"
config.vm.network "forwarded_port", guest: 5000, host: 9001
end

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env python
import sys
import requests
if __name__ == '__main__':
response = requests.get('https://api.github.com/repos/EverythingMe/redash/releases')
if response.status_code != 200:
exit("Failed getting releases (status code: %s)." % response.status_code)
sorted_releases = sorted(response.json(), key=lambda release: release['id'], reverse=True)
latest_release = sorted_releases[0]
asset_url = latest_release['assets'][0]['url']
filename = latest_release['assets'][0]['name']
wget_command = 'wget --header="Accept: application/octet-stream" %s -O %s' % (asset_url, filename)
if '--url-only' in sys.argv:
print asset_url
elif '--wget' in sys.argv:
print wget_command
else:
print "Latest release: %s" % latest_release['tag_name']
print latest_release['body']
print "\nTarball URL: %s" % asset_url
print 'wget: %s' % (wget_command)

147
bin/release_manager.py Normal file
View File

@@ -0,0 +1,147 @@
import os
import sys
import json
import re
import subprocess
import requests
github_token = os.environ['GITHUB_TOKEN']
auth = (github_token, 'x-oauth-basic')
repo = 'getredash/redash'
def _github_request(method, path, params=None, headers={}):
if not path.startswith('https://api.github.com'):
url = "https://api.github.com/{}".format(path)
else:
url = path
if params is not None:
params = json.dumps(params)
response = requests.request(method, url, data=params, auth=auth)
return response
def exception_from_error(message, response):
return Exception("({}) {}: {}".format(response.status_code, message, response.json().get('message', '?')))
def rc_tag_name(version):
return "v{}-rc".format(version)
def get_rc_release(version):
tag = rc_tag_name(version)
response = _github_request('get', 'repos/{}/releases/tags/{}'.format(repo, tag))
if response.status_code == 404:
return None
elif response.status_code == 200:
return response.json()
raise exception_from_error("Unknown error while looking RC release: ", response)
def create_release(version, commit_sha):
tag = rc_tag_name(version)
params = {
'tag_name': tag,
'name': "{} - RC".format(version),
'target_commitish': commit_sha,
'prerelease': True
}
response = _github_request('post', 'repos/{}/releases'.format(repo), params)
if response.status_code != 201:
raise exception_from_error("Failed creating new release", response)
return response.json()
def upload_asset(release, filepath):
upload_url = release['upload_url'].replace('{?name,label}', '')
filename = filepath.split('/')[-1]
with open(filepath) as file_content:
headers = {'Content-Type': 'application/gzip'}
response = requests.post(upload_url, file_content, params={'name': filename}, headers=headers, auth=auth, verify=False)
if response.status_code != 201: # not 200/201/...
raise exception_from_error('Failed uploading asset', response)
return response
def remove_previous_builds(release):
for asset in release['assets']:
response = _github_request('delete', asset['url'])
if response.status_code != 204:
raise exception_from_error("Failed deleting asset", response)
def get_changelog(commit_sha):
latest_release = _github_request('get', 'repos/{}/releases/latest'.format(repo))
if latest_release.status_code != 200:
raise exception_from_error('Failed getting latest release', latest_release)
latest_release = latest_release.json()
previous_sha = latest_release['target_commitish']
args = ['git', '--no-pager', 'log', '--merges', '--grep', 'Merge pull request', '--pretty=format:"%h|%s|%b|%p"', '{}...{}'.format(previous_sha, commit_sha)]
log = subprocess.check_output(args)
changes = ["Changes since {}:".format(latest_release['name'])]
for line in log.split('\n'):
try:
sha, subject, body, parents = line[1:-1].split('|')
except ValueError:
continue
try:
pull_request = re.match("Merge pull request #(\d+)", subject).groups()[0]
pull_request = " #{}".format(pull_request)
except Exception, ex:
pull_request = ""
author = subprocess.check_output(['git', 'log', '-1', '--pretty=format:"%an"', parents.split(' ')[-1]])[1:-1]
changes.append("{}{}: {} ({})".format(sha, pull_request, body.strip(), author))
return "\n".join(changes)
def update_release_commit_sha(release, commit_sha):
params = {
'target_commitish': commit_sha,
}
response = _github_request('patch', 'repos/{}/releases/{}'.format(repo, release['id']), params)
if response.status_code != 200:
raise exception_from_error("Failed updating commit sha for existing release", response)
return response.json()
def update_release(version, build_filepath, commit_sha):
try:
release = get_rc_release(version)
if release:
release = update_release_commit_sha(release, commit_sha)
else:
release = create_release(version, commit_sha)
print "Using release id: {}".format(release['id'])
remove_previous_builds(release)
response = upload_asset(release, build_filepath)
changelog = get_changelog(commit_sha)
response = _github_request('patch', release['url'], {'body': changelog})
if response.status_code != 200:
raise exception_from_error("Failed updating release description", response)
except Exception, ex:
print ex
if __name__ == '__main__':
commit_sha = sys.argv[1]
version = sys.argv[2]
filepath = sys.argv[3]
# TODO: make sure running from git directory & remote = repo
update_release(version, filepath, commit_sha)

View File

@@ -1,63 +0,0 @@
"""
Script to test concurrency (multithreading/multiprocess) issues with the workers. Use with caution.
"""
import json
import atfork
atfork.monkeypatch_os_fork_functions()
import atfork.stdlib_fixer
atfork.stdlib_fixer.fix_logging_module()
import time
from redash.data import worker
from redash import models, data_manager, redis_connection
if __name__ == '__main__':
models.create_db(True, False)
print "Creating data source..."
data_source = models.DataSource.create(name="Concurrency", type="pg", options="dbname=postgres")
print "Clear jobs/hashes:"
redis_connection.delete("jobs")
query_hashes = redis_connection.keys("query_hash_*")
if query_hashes:
redis_connection.delete(*query_hashes)
starting_query_results_count = models.QueryResult.select().count()
jobs_count = 5000
workers_count = 10
print "Creating jobs..."
for i in xrange(jobs_count):
query = "SELECT {}".format(i)
print "Inserting: {}".format(query)
data_manager.add_job(query=query, priority=worker.Job.LOW_PRIORITY,
data_source=data_source)
print "Starting workers..."
workers = data_manager.start_workers(workers_count)
print "Waiting for jobs to be done..."
keep_waiting = True
while keep_waiting:
results_count = models.QueryResult.select().count() - starting_query_results_count
print "QueryResults: {}".format(results_count)
time.sleep(5)
if results_count == jobs_count:
print "Yay done..."
keep_waiting = False
data_manager.stop_workers()
qr_count = 0
for qr in models.QueryResult.select():
number = int(qr.query.split()[1])
data_number = json.loads(qr.data)['rows'][0].values()[0]
if number != data_number:
print "Oops? {} != {} ({})".format(number, data_number, qr.id)
qr_count += 1
print "Verified {} query results.".format(qr_count)
print "Done."

View File

@@ -1,46 +0,0 @@
#!python
import os
import sys
import json
import requests
import subprocess
def capture_output(command):
proc = subprocess.Popen(command, stdout=subprocess.PIPE)
return proc.stdout.read()
if __name__ == '__main__':
version = sys.argv[1]
filepath = sys.argv[2]
filename = filepath.split('/')[-1]
github_token = os.environ['GITHUB_TOKEN']
auth = (github_token, 'x-oauth-basic')
commit_sha = os.environ['CIRCLE_SHA1']
commit_body = capture_output(["git", "log", "--format=%b", "-n", "1", commit_sha])
file_md5_checksum = capture_output(["md5sum", filepath]).split()[0]
file_sha256_checksum = capture_output(["sha256sum", filepath]).split()[0]
version_body = "%s\n\nMD5: %s\nSHA256: %s" % (commit_body, file_md5_checksum, file_sha256_checksum)
params = json.dumps({
'tag_name': 'v{0}'.format(version),
'name': 're:dash v{0}'.format(version),
'body': version_body,
'target_commitish': commit_sha,
'prerelease': True
})
response = requests.post('https://api.github.com/repos/everythingme/redash/releases',
data=params,
auth=auth)
upload_url = response.json()['upload_url']
upload_url = upload_url.replace('{?name}', '')
with open(filepath) as file_content:
headers = {'Content-Type': 'application/gzip'}
response = requests.post(upload_url, file_content, params={'name': filename}, auth=auth,
headers=headers, verify=False)

View File

@@ -1,28 +1,39 @@
machine:
services:
- docker
node:
version:
0.10.24
0.12.4
python:
version:
2.7.3
dependencies:
pre:
- make deps
- pip install -r dev_requirements.txt
- pip install -r requirements_dev.txt
- pip install -r requirements.txt
- pip install pymongo==3.2.1
- if [ "$CIRCLE_BRANCH" = "master" ]; then make deps; fi
cache_directories:
- rd_ui/node_modules/
- rd_ui/app/bower_components/
test:
override:
- make test
post:
- make pack
- nosetests --with-xunit --xunit-file=$CIRCLE_TEST_REPORTS/junit.xml --with-coverage --cover-package=redash tests/
deployment:
github:
github_and_docker:
branch: master
commands:
- make pack
- make upload
- echo "rd_ui/app" >> .dockerignore
- docker pull redash/redash:latest
- docker build -t redash/redash:$(./manage.py version | sed -e "s/\+/./") .
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- docker push redash/redash:$(./manage.py version | sed -e "s/\+/./")
notify:
webhooks:
- url: https://webhooks.gitter.im/e/895d09c3165a0913ac2f
general:
branches:
ignore:
- gh-pages

View File

@@ -0,0 +1,25 @@
redash:
image: redash/redash:latest
ports:
- "5000:5000"
links:
- redis
- postgres
environment:
REDASH_STATIC_ASSETS_PATH: "../rd_ui/dist/"
REDASH_LOG_LEVEL: "INFO"
REDASH_REDIS_URL: "redis://redis:6379/0"
REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
REDASH_COOKIE_SECRET: veryverysecret
redis:
image: redis:2.8
postgres:
image: postgres:9.3
volumes:
- /opt/postgres-data:/var/lib/postgresql/data
redash-nginx:
image: redash/nginx:latest
ports:
- "80:80"
links:
- redash

192
docs/Makefile Normal file
View File

@@ -0,0 +1,192 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/redash.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/redash.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/redash"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/redash"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

110
docs/conf.py Normal file
View File

@@ -0,0 +1,110 @@
# -*- coding: utf-8 -*-
#
# re:dash documentation build configuration file, created by
# sphinx-quickstart on Mon Jul 20 22:40:24 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Re:dash'
copyright = u'2013-2016, Arik Fraimovich'
author = u'Arik Fraimovich'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
exclude_patterns = ['_build']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
import sphinx_rtd_theme
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = False
# Output file base name for HTML help builder.
htmlhelp_basename = 'redashdoc'
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'redash', u're:dash Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'redash', u're:dash Documentation',
author, 'redash', 'One line description of project.',
'Miscellaneous'),
]

261
docs/datasources.rst Normal file
View File

@@ -0,0 +1,261 @@
Supported Data Sources
######################
Re:dash supports several types of data sources, and if you set it up using the provided images, it should already have
the needed dependencies to use them all. Starting from version 0.7 and newer, you can manage data sources from the UI
by browsing to ``/data_sources`` on your instance.
If one of the listed data source types isn't available when trying to create a new data source, make sure that:
1. You installed required dependencies.
2. If you've set custom value for the ``REDASH_ENABLED_QUERY_RUNNERS`` setting, it's included in the list.
PostgreSQL / Redshift / Greenplum
---------------------------------
- **Options**:
- Database name (mandatory)
- User
- Password
- Host
- Port
- **Additional requirements**:
- None
MySQL
-----
- **Options**:
- Database name (mandatory)
- User
- Password
- Host
- Port
- **Additional requirements**:
- ``MySQL-python`` python package
Google BigQuery
---------------
- **Options**:
- Project ID (mandatory)
- JSON key file, generated when creating a service account (see `instructions <https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount>`__).
- **Additional requirements**:
- ``google-api-python-client``, ``oauth2client`` and ``pyopenssl`` python packages (on Ubuntu it might require installing ``libffi-dev`` and ``libssl-dev`` as well).
Graphite
--------
- **Options**:
- Url (mandatory)
- User
- Password
- Verify SSL certificate
MongoDB
-------
- **Options**:
- Connection String (mandatory)
- Database name
- Replica set name
- **Additional requirements**:
- ``pymongo`` python package.
For information on how to write MongoDB queries, see :doc:`documentation </usage/mongodb_querying>`.
ElasticSearch
-------------
...
InfluxDB
--------
...
Presto
------
- **Options**:
- Host (mandatory)
- Address to a Presto coordinator.
- Port
- Port to a Presto coordinator. `8080` is the default port.
- Schema
- Default schema name of Presto. You can read other schemas by qualified name like `FROM myschema.table1`.
- Catalog
- Catalog (connector) name of Presto such as `hive-cdh4`, `hive-hadoop1`, etc.
- Username
- User name to connect to a Presto.
- **Additional requirements**:
- ``pyhive`` python package.
Hive
----
...
Impala
------
...
URL
---
A URL based data source which requests URLs that return the :doc:`results JSON
format </dev/results_format>`.
Very useful in situations where you want to expose the data without
connecting directly to the database.
The query itself inside Re:dash will simply contain the URL to be
executed (i.e. http://myserver/path/myquery)
- **Options**:
- Url - set this if you want to limit queries to certain base path.
Google Spreadsheets
-------------------
- **Options**:
- JSON key file, generated when creating a service account (see `instructions <https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount>`__).
- **Additional requirements**:
- ``gspread`` and ``oauth2client`` python packages.
Notes:
1. To be able to load the spreadsheet in Re:dash - share your it with
your ServiceAccount's email (it can be found in the credentials json
file, for example
43242343247-fjdfakljr3r2@developer.gserviceaccount.com).
2. The query format is "DOC\_UUID\|SHEET\_NUM" (for example
"kjsdfhkjh4rsEFSDFEWR232jkddsfh\|0")
Python
------
**Execute other queries, manipulate and compute with Python code**
This is a special query runner, that will execute provided Python code as the query. Useful for various scenarios such as
merging data from different data sources, doing data transformation/manipulation that isn't trivial with SQL, merging
with remote data or using data analysis libraries such as Pandas (see `example query <https://gist.github.com/arikfr/be7c2888520c44cf4f0f>`__).
While the Python query runner uses a sandbox (RestrictedPython), it's not 100% secure and the security depends on the
modules you allow to import. We recommend enabling the Python query runner only in a trusted environment (meaning: behind
VPN and with users you trust).
- **Options**:
- Allowed Modules in a comma separated list (optional). **NOTE:**
You MUST make sure these modules are installed on the machine
running the Celery workers.
Notes:
- For security, the python query runner is disabled by default.
To enable, add ``redash.query_runner.python`` to the ``REDASH_ADDITIONAL_QUERY_RUNNERS`` environmental variable. If you used
the bootstrap script, or one of the provided images, add to ``/opt/redash/.env`` file the line: ``export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python``.
Vertica
-----
- **Options**:
- Database (mandatory)
- User
- Password
- Host
- Port
- **Additional requirements**:
- ``vertica-python`` python package
Oracle
------
- **Options**
- DSN Service name
- User
- Password
- Host
- Port
- **Additional requirements**
- ``cx_Oracle`` python package. This requires the installation of the Oracle `instant client <http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html>`__.
Treasure Data
------
- **Options**
- Type (TreasureData)
- API Key
- Database Name
- Type (Presto/Hive[default])
- **Additional requirements**
- Must have account on https://console.treasuredata.com
Documentation: https://docs.treasuredata.com/articles/redash
Microsoft SQL Server
-----
- **Options**:
- Database (mandatory)
- User #TODO: DB users only? What about domain users?
- Password
- Server
- Port
- **Notes**:
- Data type support is currently quite limited.
- Complex and new types are converted to strings in ``Re:dash``
- Coerce into simpler types if needed using ``CAST()``
- Known conversion issues for:
- DATE
- TIME
- DATETIMEOFFSET
- **Additional requirements**:
- ``freetds-dev`` C library
- ``pymsssql`` python package, requires FreeTDS to be installed first

11
docs/dev.rst Normal file
View File

@@ -0,0 +1,11 @@
Developer Information
=====================
.. toctree::
:maxdepth: 2
:glob:
dev/vagrant
dev/*

View File

@@ -0,0 +1,94 @@
Query Execution Model
#####################
Introduction
============
The first datasource which was used with Re:dash was Redshift. Because
we had billions of records in Redshift, and some queries were costly to
re-run, from the get go there was the idea of caching query results in
Re:dash.
This was to relieve stress from the Redshift cluster and also to improve
user experience.
How queries get executed and cached in Re:dash?
===============================================
Server
------
To make sure each query is executed only once at any giving time, we
translate the query to a ``query hash``, using the following code:
.. code:: python
COMMENTS_REGEX = re.compile("/\*.*?\*/")
def gen_query_hash(sql):
sql = COMMENTS_REGEX.sub("", sql)
sql = "".join(sql.split()).lower()
return hashlib.md5(sql.encode('utf-8')).hexdigest()
When query execution is done, the result gets stored to
``query_results`` table. Also we check for all queries in the
``queries`` table that have the same query hash and update their
reference to the query result we just saved
(`code <https://github.com/getredash/redash/blob/master/redash/models.py#L235>`__).
Client
------
The client (UI) will execute queries in two scenarios:
1. (automatically) When opening a query page of a query that doesn't
have a result yet.
2. (manually) When the user clicks on "Execute".
In each case the client does a POST request to ``/api/query_results``
with the following parameters: ``query`` (the query text),
``data_source_id`` (data source to execute the query with) and ``ttl``.
When loading a cached result, ``ttl`` will be the one set to the query
(if it was set). This is a relic from previous versions, and I'm not
sure if it's really used anymore, as usually we will fetch query result
using its id.
When loading a non cached result, ``ttl`` will be 0 which will "force"
the server to execute the query.
As a response to ``/api/query_results`` the server will send either the
query results (in case of a cached query) or job id of the currently
executing query. When job id received the client will start polling on
this id, until a query result received (this is encapsulated in
``Query`` and ``QueryResult`` services).
Ideas on how to implement query parameters
==========================================
Client side only implementation
-------------------------------
(This was actually implemented in. See pull request `#363 <https://github.com/getredash/redash/pull/363>`__ for details.)
The basic idea of how to implement parametized queries is to treat the
query as a template and merge it with parameters taken from query string
or UI (or both).
When the caching facility isn't required (with queries that return in a
reasonable time frame) the implementation can be completely client side
and the backend can be "blind" to the parameters - it just receives the
final query to execute and returns result.
As one improvement over this, we can let the UI/user specify the TTL
value when making the request to ``/api/query_results``, in which case
caching will be availble too, while not having to make the server aware
of the parameters.
Hybrid
------
Another option, will be to store the list of possible parameters for a
query, with their default/optional values. In such case, the server can
prefetch all the options and cache them to provide faster results to the
client.

View File

@@ -0,0 +1,30 @@
Data Source Results Format
==========================
All data sources in Re:dash return the following results in JSON format:
.. code:: javascript
{
"columns" : [
{
// Required: a unique identifier of the column name in this result
"name" : "COLUMN_NAME",
// Required: friendly name of the column that will appear in the results
"friendly_name" : "FRIENDLY_NAME",
// Optional: If not specified sort might not work well.
// Supported types: integer, float, boolean, string (default), datetime (ISO-8601 text format)
"type" : "VALUE_TYPE"
},
...
],
"rows" : [
{
// name is the column name as it appears in the columns above.
// VALUE is a valid JSON value. For dates its an ISO-8601 string.
"name" : VALUE,
"name2" : VALUE2
},
...
]
}

40
docs/dev/vagrant.rst Normal file
View File

@@ -0,0 +1,40 @@
Setting up development environment (using Vagrant)
==================================================
To simplify contribution there is a `Vagrant
box <https://vagrantcloud.com/redash/boxes/dev>`__ available with all
the needed software to run Re:dash for development (use it only for
development, for demo purposes there is
`redash/demo <https://vagrantcloud.com/redash/boxes/demo>`__ box and the
AWS/GCE images).
To get started with this box:
1. Make sure you have recent version of
`Vagrant <https://www.vagrantup.com/>`__ installed.
2. Clone the Re:dash repository:
``git clone https://github.com/getredash/redash.git``.
3. Change dir into the repository (``cd redash``) and run run
``vagrant up``. This might take some time the first time you run it,
as it downloads the Vagrant virtual box.
4. Once Vagrant is ready, ssh into the instance (``vagrant ssh``), and
change dir to ``/opt/redash/current`` -- this is where your local
repository copy synced to.
5. Copy ``.env`` file into this directory (``cp ../.env ./``).
6. From ``/opt/redash/current/rd_ui`` run ``bower install`` to install
frontend packages. This can be done from your host machine as well,
if you have bower installed.
7. Go back to ``/opt/redash/current`` and install python dependencies
``sudo pip install -r requirements.txt``
8. Update database schema to the latest version:
::
bin/run ./manage.py database drop_tables
bin/run ./manage.py database create_tables
bin/run ./manage.py users create --admin --password admin "Admin" "admin"
9. Start the server and background workers with
``bin/run honcho start -f Procfile.dev``.
10. Now the server should be available on your host on port 9001 and you
can login with username admin and password admin.

57
docs/index.rst Normal file
View File

@@ -0,0 +1,57 @@
.. image:: http://redash.io/static/old_img/redash_logo.png
:width: 200px
Open Source Data Collaboration and Visualization Platform
===================================
**Re:dash** is our take on freeing the data within our company in a way that will better fit our culture and usage patterns.
Prior to **Re:dash**, we tried to use traditional BI suites and discovered a set of bloated, technically challenged and slow tools/flows. What we were looking for was a more hacker'ish way to look at data, so we built one.
**Re:dash** was built to allow fast and easy access to billions of records, that we process and collect using Amazon Redshift ("petabyte scale data warehouse" that "speaks" PostgreSQL).
Today **_re:dash_** has support for querying multiple databases, including: Redshift, Google BigQuery,Google Spreadsheets, PostgreSQL, MySQL, Graphite and custom scripts.
Features
########
1. **Query Editor**: think of `JS Fiddle`_ for SQL queries. It's your way to share data in the organization in an open way, by sharing both the dataset and the query that generated it. This way everyone can peer review not only the resulting dataset but also the process that generated it.
2. **Visualizations**: once you have a dataset, you can create different visualizations out of it. Currently it supports charts, pivot table and cohorts.
3. **Dashboards**: combine several visualizations into a single dashboard.
Demo
####
.. figure:: https://cloud.githubusercontent.com/assets/71468/12611424/1faf4d6a-c4f5-11e5-89b5-31efc1155d2c.gif
:alt: Screenshots
You can try out the demo instance: `http://demo.redash.io`_ (login with any Google account).
.. _http://demo.redash.io: http://demo.redash.io
.. _JS Fiddle: http://jsfiddle.net
Getting Started
###############
:doc:`Setting up Re:dash instance </setup>` (includes links to ready made AWS/GCE images).
Getting Help
############
* Source: https://github.com/getredash/redash
* Issues: https://github.com/getredash/redash/issues
* Mailing List: https://groups.google.com/forum/#!forum/redash-users
* Slack: http://slack.redash.io/
* Gitter (chat): https://gitter.im/getredash/redash
TOC
###
.. toctree::
:maxdepth: 2
setup
upgrade
datasources
usage
dev
misc

10
docs/misc.rst Normal file
View File

@@ -0,0 +1,10 @@
Miscellaneous
=============
.. toctree::
:maxdepth: 2
:glob:
misc/*

View File

@@ -0,0 +1,74 @@
How To: Backup your Re:dash database and restore it on a different server
=================
**Note:** This guide assumes that the default database name (redash) has not been changed.
1. Check the size of your redash database. This can be done by creating a query within redash itself against the 'Re:dash metadata' data source.
.. code::
select t1.datname AS db_name, pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
where t1.datname = 'redash'
2. Check the amount of available disk space on your existing server.
.. code::
df -hT
3. Backup the existing redash database.
.. code::
sudo -u redash pg_dump redash | gzip > redash_backup.gz
4. Transfer the backup to the new server.
5. `Perform a clean install of Re:dash <http://docs.redash.io/en/latest/setup.html>`__ on the new server.
6. Check the amount of available disk space on the new server.
.. code::
df -hT
7. Login as postgres user on the new server.
.. code::
sudo -u postgres -i
8. drop the current redash database, create a new database named redash, and then restore the backup into the new database.
.. code::
dropdb redash
createdb -T template0 redash
gunzip -c redash_backup.gz | psql redash
9. Set a new password of your choosing for the 'redash_reader' user (since the new installation generated a random password).
.. code::
psql -c "ALTER ROLE redash_reader WITH PASSWORD 'yourpasswordgoeshere';"
**Note:** Then you must navigate to the 'Re:dash metadata' data source (/data_sources/1) in the new Re:dash installation and change the password to match the one entered above.
10. Grant permissions on the redash database to the redash_reader user.
.. code::
psql -c "grant select(id,name,type) ON data_sources to redash_reader;" redash
psql -c "grant select(id,name) ON users to redash_reader;" redash
psql -c "grant select on events, queries, dashboards, widgets, visualizations, query_results to redash_reader;" redash
Create a new query in redash (using Re:dash metadata as the data source) to test that everything is working as expected.

View File

@@ -0,0 +1,50 @@
How To: Create a Google Developers Project
==========================================
1. Go to the `Google Developers
Console <https://console.developers.google.com/>`__.
2. Select a project, or create a new one by clicking Create Project:
1. In the Project name field, type in a name for your project.
2. In the Project ID field, optionally type in a project ID for your
project or use the one that the console has created for you. This
ID must be unique world-wide.
3. Click the **Create** button and wait for the project to be
created.
4. Click on the new project name in the list to start editing the
project.
3. In the left sidebar, select the **APIs** item below "APIs & auth". A
list of Google web services appears.
4. Find the **Google+ API** service and set its status to **ON**—notice
that this action moves the service to the top of the list.
5. In the sidebar under "APIs & auth", select **Credentials** and in that screen choose the **OAuth consent screen** tab
- Choose an Email Address and specify a Product Name.
6. In the sidebar under "APIs & auth", select **Credentials**.
7. Click **Add Credentials** button and choose **OAuth 20 Client ID**.
- In the **Application type** section of the dialog, select **Web
application**.
- In the **Authorized JavaScript origins** field, enter the origin
for your app. You can enter multiple origins to use with multiple
Re:dash instance. Wildcards are not allowed. In the example below,
we assume your Re:dash instance address is *redash.example.com*:
::
http://redash.example.com
https://redash.example.com
- In the Authorized redirect URI field, enter the redirect URI
callback:
::
http://redash.example.com/oauth/google_callback
- Click the ``Create`` button.
8. In the resulting **Client ID for web application** section, copy the
**Client ID** and **Client secret** to your ``.env`` file.

141
docs/misc/letsencrypt.rst Normal file
View File

@@ -0,0 +1,141 @@
How To: Encrypt your Re:dash installation with a free SSL certificate from Let's Encrypt
=================
**Note:** This below steps were tested on Ubuntu 14.04, but *should* work with any Debian-based distro.
`Let's Encrypt <https://letsencrypt.org/>`__ is a new certificate authority sponsored by major tech companies including Mozilla, Google, Cisco, and Facebook. Unlike traditional CA authorities, Let's Encrypt allows you to generate and renew an SSL certificate quickly and **at no cost**.
1. Open port 443 in your security group (if using AWS or GCE).
2. Update package lists, install git, and clone the letsencrypt repository.
.. code::
sudo apt-get update
sudo apt-get install git
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
3. Stop nginx and redash, then ensure that no processes are still listening on port 80.
.. code::
sudo supervisorctl stop redash_server
sudo service nginx stop
netstat -na | grep ':80.*LISTEN'
4. Generate your letsencrypt certificate.
.. code::
cd /opt/letsencrypt
sudo pip install urllib3[secure] --upgrade
./letsencrypt-auto certonly --standalone
In most cases you'll want to enter 'example.com www.example.com' when prompted for your domain so that you can use the certificate on http://example.com and http://www.example.com.
5. Optionally generate a stronger Diffie-Hellman ephemeral parameter. Without this step, you will not achieve higher than a B score on `SSLLabs <https://www.ssllabs.com/ssltest/>`__. Please note that on a low-end server (VPS or micro/small GCE instance) this step can take approximately 20-30 minutes.
.. code::
cd /etc/ssl/certs
sudo openssl dhparam -out dhparam.pem 3072
6. Backup the existing nginx redash config, delete it, and then create a new version with the code supplied below.
.. code::
sudo cp /etc/nginx/sites-available/redash /etc/nginx/sites-available/redash.bak
sudo rm /etc/nginx/sites-available/redash
sudo nano /etc/nginx/sites-available/redash
.. code:: nginx
upstream redash_servers {
server 127.0.0.1:5000;
}
server {
listen 80;
# Allow accessing /ping without https. Useful when placing behind load balancer.
location /ping {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://redash_servers;
}
location / {
# Enforce SSL.
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
ssl on;
# Make sure to set paths to your certificate .pem and .key files.
ssl_certificate /etc/letsencrypt/live/YOURDOMAIN.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOURDOMAIN.TLD/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# Use secure protocols and ciphers which are compatible with modern browsers
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH;
ssl_session_cache shared:SSL:20m;
# Enforce strict transport security
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
access_log /var/log/nginx/redash.access.log;
gzip on;
gzip_types *;
gzip_proxied any;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://redash_servers;
proxy_redirect off;
}
}
7. Start the nginx and redash servers again.
.. code::
sudo service nginx start
sudo supervisorctl start redash_server
8. Verify the installation by running a `SSLLabs test <https://www.ssllabs.com/ssltest/>`__. This guide *should* yield an A+ score. If everything is working as expected, optionally delete the old redash nginx config:
.. code::
sudo rm /etc/nginx/sites-available/redash.bak
**Important Note:** letsencrypt certificates only remain valid for 90 days. To renew your certificate, simply follow steps 3 and 4 again:
.. code::
sudo supervisorctl stop redash_server
sudo service nginx stop
netstat -na | grep ':80.*LISTEN'
cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone
sudo service nginx start
sudo supervisorctl start redash_server

59
docs/misc/ssl.rst Normal file
View File

@@ -0,0 +1,59 @@
SSL (HTTPS) Setup
=================
If you used the provided images or the bootstrap script, to start using
SSL with your instance you need to:
1. Update the nginx config file (``/etc/nginx/sites-available/redash``)
with SSL configuration (see below an example). Make sure to upload
the certificate to the server, and set the paths correctly in the new
config.
2. Open port 443 in your security group (if using AWS or GCE).
.. code:: nginx
upstream redash_servers {
server 127.0.0.1:5000;
}
server {
listen 80;
# Allow accessing /ping without https. Useful when placing behind load balancer.
location /ping {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://redash_servers;
}
location / {
# Enforce SSL.
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
# Make sure to set paths to your certificate .pem and .key files.
ssl on;
ssl_certificate /path-to/cert.pem; # or crt
ssl_certificate_key /path-to/cert.key;
access_log /var/log/nginx/redash.access.log;
gzip on;
gzip_types *;
gzip_proxied any;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://redash_servers;
proxy_redirect off;
}
}

3
docs/requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
sphinx
sphinx-autobuild
sphinx_rtd_theme

60
docs/settings.rst Normal file
View File

@@ -0,0 +1,60 @@
Settings
########
Much of the functionality of Re:dash can be changes with settings. Settings are read by `/redash/settings.py` from environment variables which (for most installs) can be set in `/opt/redash/current/.env`
The follow is a list of settings and what they control:
- **REDASH_NAME**: name of the site, used in page titles, *default "Re:dash"*
- **REDASH_REDIS_URL**: *default "redis://localhost:6379/0"*
- **REDASH_PROXIES_COUNT**: *default "1"*
- **REDASH_STATSD_HOST**: *default "127.0.0.1"*
- **REDASH_STATSD_PORT**: *default "8125"*
- **REDASH_STATSD_PREFIX**: *default "redash"*
- **REDASH_DATABASE_URL**: *default "postgresql://postgres"*
- **REDASH_CELERY_BROKER**: *default REDIS_URL*
- **REDASH_CELERY_BACKEND**: *default CELERY_BROKER*
- **REDASH_QUERY_RESULTS_CLEANUP_ENABLED**: *default "true"*
- **REDASH_QUERY_RESULTS_CLEANUP_COUNT**: *default "100"*
- **REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE**: *default "7"*
- **REDASH_AUTH_TYPE**: *default "api_key"*
- **REDASH_PASSWORD_LOGIN_ENABLED**: *default "true"*
- **REDASH_ENFORCE_HTTPS**: *default "false"*
- **REDASH_MULTI_ORG**: *default "false"*
- **REDASH_GOOGLE_CLIENT_ID**: *default ""*
- **REDASH_GOOGLE_CLIENT_SECRET**: *default ""*
- **REDASH_SAML_METADATA_URL**: *default ""*
- **REDASH_SAML_CALLBACK_SERVER_NAME**: *default ""*
- **REDASH_STATIC_ASSETS_PATH**: *default "../rd_ui/app/"*
- **REDASH_JOB_EXPIRY_TIME**: *default 3600 * 6*
- **REDASH_COOKIE_SECRET**: *default "c292a0a3aa32397cdb050e233733900f"*
- **REDASH_LOG_LEVEL**: *default "INFO"*
- **REDASH_MAIL_SERVER**: *default "localhost"*
- **REDASH_MAIL_PORT**: *default 25*
- **REDASH_MAIL_USE_TLS**: *default "false"*
- **REDASH_MAIL_USE_SSL**: *default "false"*
- **REDASH_MAIL_USERNAME**: *default None*
- **REDASH_MAIL_PASSWORD**: *default None*
- **REDASH_MAIL_DEFAULT_SENDER**: *default None*
- **REDASH_MAIL_MAX_EMAILS**: *default None*
- **REDASH_MAIL_ASCII_ATTACHMENTS**: *default "false"*
- **REDASH_HOST**: *default ""*
- **REDASH_HIPCHAT_API_TOKEN**: *default None*
- **REDASH_HIPCHAT_API_URL**: *default None*
- **REDASH_HIPCHAT_ROOM_ID**: *default None*
- **REDASH_WEBHOOK_ENDPOINT**: *default None*
- **REDASH_WEBHOOK_USERNAME**: *default None*
- **REDASH_CORS_ACCESS_CONTROL_ALLOW_ORIGIN**: *default ""*
- **REDASH_CORS_ACCESS_CONTROL_ALLOW_CREDENTIALS**: *default "false"*
- **REDASH_CORS_ACCESS_CONTROL_REQUEST_METHOD**: *default GET, POST, PUT""*
- **REDASH_CORS_ACCESS_CONTROL_ALLOW_HEADERS**: *default "Content-Type"*
- **REDASH_ENABLED_QUERY_RUNNERS**: *default ",".join(default_query_runners)*
- **REDASH_ADDITIONAL_QUERY_RUNNERS**: *default ""*
- **REDASH_SENTRY_DSN**: *default ""*
- **REDASH_ALLOW_SCRIPTS_IN_USER_INPUT**: disable sanitization of text input, allowing full HTML, *default "true"*
- **REDASH_DATE_FORMAT**: *default "DD/MM/YY"*
- **REDASH_FEATURE_ALLOW_ALL_TO_EDIT**: *default "true"*
- **REDASH_FEATURE_TABLES_PERMISSIONS**: *default "false"*
- **REDASH_VERSION_CEHCK**: *default "true"*
- **REDASH_BIGQUERY_HTTP_TIMEOUT**: *default "600"*
- **REDASH_SCHEMA_RUN_TABLE_SIZE_CALCULATIONS**: *default "false"*

194
docs/setup.rst Normal file
View File

@@ -0,0 +1,194 @@
Setting up Re:dash instance
###########################
The `provisioning
script <https://raw.githubusercontent.com/getredash/redash/master/setup/ubuntu/bootstrap.sh>`__
works on Ubuntu 12.04, Ubuntu 14.04 and Debian Wheezy. This script
installs all needed dependencies and creates basic setup.
To ease the process, there are also images for AWS, Google Compute
Cloud and Docker. These images created with the same provision script using Packer.
Create an instance
==================
AWS
---
Launch the instance with from the pre-baked AMI (for small deployments
t2.micro should be enough):
- us-east-1: `ami-a7ddfbcd <https://console.aws.amazon.com/ec2/home?region=us-east-1#LaunchInstanceWizard:ami=ami-a7ddfbcd>`__
- us-west-1: `ami-269feb46 <https://console.aws.amazon.com/ec2/home?region=us-west-1#LaunchInstanceWizard:ami=ami-269feb46>`__
- us-west-2: `ami-435fba23 <https://console.aws.amazon.com/ec2/home?region=us-west-2#LaunchInstanceWizard:ami=ami-435fba23>`__
- eu-west-1: `ami-b4c277c7 <https://console.aws.amazon.com/ec2/home?region=eu-west-1#LaunchInstanceWizard:ami=ami-b4c277c7>`__
- eu-central-1: `ami-07ced76b <https://console.aws.amazon.com/ec2/home?region=eu-central-1#LaunchInstanceWizard:ami=ami-07ced76b>`__
- sa-east-1: `ami-6e2eaf02 <https://console.aws.amazon.com/ec2/home?region=sa-east-1#LaunchInstanceWizard:ami=ami-6e2eaf02>`__
- ap-northeast-1: `ami-aa5a64c4 <https://console.aws.amazon.com/ec2/home?region=ap-northeast-1#LaunchInstanceWizard:ami=ami-aa5a64c4>`__
- ap-southeast-1: `ami-1c45897f <https://console.aws.amazon.com/ec2/home?region=ap-southeast-1#LaunchInstanceWizard:ami=ami-1c45897f>`__
- ap-southeast-2: `ami-42b79221 <https://console.aws.amazon.com/ec2/home?region=ap-southeast-2#LaunchInstanceWizard:ami=ami-42b79221>`__
(the above AMIs are of version: 0.9.1)
When launching the instance make sure to use a security group, that **only** allows incoming traffic on: port 22 (SSH), 80 (HTTP) and 443 (HTTPS). These AMIs are based on Ubuntu so you will need to use the user ``ubuntu`` when connecting to the instance via SSH.
Now proceed to `"Setup" <#setup>`__.
Google Compute Engine
---------------------
First, you need to add the images to your account:
.. code:: bash
$ gcloud compute images create "redash-091-b1377" --source-uri gs://redash-images/redash.0.9.1.b1377.tar.gz
Next you need to launch an instance using this image (n1-standard-1
instance type is recommended). If you plan using Re:dash with BigQuery,
you can use a dedicated image which comes with BigQuery preconfigured
(using instance permissions):
.. code:: bash
$ gcloud compute images create "redash-091-b1377-bq" --source-uri gs://redash-images/redash.0.9.1.b1377-bq.tar.gz
Note that you need to launch this instance with BigQuery access:
.. code:: bash
$ gcloud compute instances create <your_instance_name> --image redash-091-b1377-bq --scopes storage-ro,bigquery
(the same can be done from the web interface, just make sure to enable
BigQuery access)
Now proceed to `"Setup" <#setup>`__.
Docker Compose
------
1. Make sure you have a Docker machine up and running.
2. Make sure your current working directory is the root of this GitHub repository.
3. Run ``docker-compose up postgres``.
4. Run ``./setup/docker/create_database.sh``. This will access the postgres container and set up the database.
5. Run ``docker compose up``
6. Run ``docker-machine ls``, take note of the ip for the Docker machine you are using, and open the web browser.
7. Visit that Docker machine IP at port 80, and you should see a Re:dash login screen.
Now proceed to `"Setup" <#setup>`__.
Other
-----
Download the provision script and run it on your machine. Note that:
1. You need to run the script as root.
2. It was tested only on Ubuntu 12.04, Ubuntu 14.04 and Debian Wheezy.
3. It's designed to run on a "clean" machine. If you're running this script on a machine that is used for other purposes, you might want to tweak it to your needs (like removing the ``apt-get dist-upgrade`` call at the beginning of it).
Setup
=====
Once you created the instance with either the image or the script, you
should have a running Re:dash instance with everything you need to get
started . Re:dash should be available using the server IP or DNS name
you assigned to it. You can point your browser to this address, and login
with the user "admin" (password: "admin"). But to make it useful, there are
a few more steps that you need to manually do to complete the setup:
First ssh to your instance and change directory to ``/opt/redash``. If
you're using the GCE image, switch to root (``sudo su``).
Users & Google Authentication setup
-----------------------------------
Most of the settings you need to edit are in the ``/opt/redash/.env``
file.
1. Update the cookie secret (important! otherwise anyone can sign new
cookies and impersonate users): change "veryverysecret" in the line:
``export REDASH_COOKIE_SECRET=veryverysecret`` to something else (you
can run the command ``pwgen 32 -1`` to generate a random string).
2. By default we create an admin user with the password "admin". You
can change this password opening the: ``/users/me#password`` page after
logging in as admin.
3. If you want to use Google OAuth to authenticate users, you need to
create a Google Developers project (see :doc:`instructions </misc/google_developers_project>`)
and then add the needed configuration in the ``.env`` file:
.. code::
export REDASH_GOOGLE_CLIENT_ID=""
export REDASH_GOOGLE_CLIENT_SECRET=""
4. Configure the domain(s) you want to allow to use with Google Apps, by running the command:
.. code::
cd /opt/redash/current
sudo -u redash bin/run ./manage.py org set_google_apps_domains {{domains}}
If you're passing multiple domains, separate them with commas.
5. Restart the web server to apply the configuration changes:
``sudo supervisorctl restart redash_server``.
6. Once you have Google OAuth enabled, you can login using your Google
Apps account. If you want to grant admin permissions to some users,
you can do this by adding them to the admin group (from ``/groups`` page).
7. If you don't use Google OAuth or just need username/password logins,
you can create additional users by opening the ``/users/new`` page.
Datasources
-----------
To make Re:dash truly useful, you need to setup your data sources in it. Browse to ``/data_sources`` on your instance,
to create new data source connection.
See :doc:`documentation </datasources>` for the different options.
Your instance comes ready with dependencies needed to setup supported sources.
Mail Configuration
------------------
For the system to be able to send emails (for example when alerts trigger), you need to set the mail server to use and the
host name of your Re:dash server. If you're using one of our images, you can do this by editing the `.env` file:
.. code::
# Note that not all values are required, as they have default values.
export REDASH_MAIL_SERVER="" # default: localhost
export REDASH_MAIL_PORT="" # default: 25
export REDASH_MAIL_USE_TLS="" # default: False
export REDASH_MAIL_USE_SSL="" # default: False
export REDASH_MAIL_USERNAME="" # default: None
export REDASH_MAIL_PASSWORD="" # default: None
export REDASH_MAIL_DEFAULT_SENDER="" # Email address to send from
export REDASH_HOST="" # base address of your Re:dash instance, for example: "https://demo.redash.io"
- Note that not all values are required, as there are default values.
- It's recommended to use some mail service, like `Amazon SES <https://aws.amazon.com/ses/>`__, `Mailgun <http://www.mailgun.com/>`__
or `Mandrill <http://mandrillapp.com>`__ to send emails to ensure deliverability.
To test email configuration, you can run `bin/run ./manage.py send_test_mail` (from `/opt/redash/current`).
How to upgrade?
---------------
It's recommended to upgrade once in a while your Re:dash instance to
benefit from bug fixes and new features. See :doc:`here </upgrade>` for full upgrade
instructions (including Fabric script).
Notes
=====
- If this is a production setup, you should enforce HTTPS and make sure
you set the cookie secret (see :doc:`instructions </misc/ssl>`).

37
docs/upgrade.rst Normal file
View File

@@ -0,0 +1,37 @@
How to Upgrade
##############
It's recommended to upgrade your Re:dash instance once there are new
releases, to benefit from new features and bug fixes. The upgrade
process is relatively simple, and assuming you used one of the base
images we provide, you can just use the
`Fabric <http://www.fabfile.org/>`__ script provided here:
https://gist.github.com/arikfr/440d1403b4aeb76ebaf8.
How to run the Fabric script
============================
1. Install Fabric: ``pip install fabric requests`` (needed only once)
2. Download the ``fabfile.py`` from the gist.
3. Run the script:
``fab -H{your Re:dash host} -u{the ssh user for this host} -i{path to key file for passwordless login} deploy_latest_release``
``-i`` is optional and it is only needed in case you're using private-key based authentication (and didn't add the key file to your authentication agent or set its path in your SSH config).
What the Fabric script does
===========================
Even if you didn't use the image, it's very likely you can reuse most of
this script with small modifications. What this script does is:
1. Find the URL of the latest release tarball (from `GitHub releases
page <http://github.com/getredash/redash/releases>`__).
2. Download it.
3. Create new directory for this version (for example:
``/opt/redash/redash.0.5.0.b685``).
4. Unpack that (``tar -C {dir} -xvf {tarball path}``).
5. Link ``/opt/redash/.env`` file into this directory.
6. Apply any new migrations.
7. Link ``/opt/redash/current`` to new version.
8. Install any new requirements - ``sudo pip install -r requirements.txt``
9. Restart web server and celery workers.

10
docs/usage.rst Normal file
View File

@@ -0,0 +1,10 @@
Usage
=====
.. toctree::
:maxdepth: 2
:glob:
usage/*

View File

@@ -0,0 +1,72 @@
ElasticSearch: Querying
#######################
ElasticSearch currently supports only simple Lucene style queries (like
Kibana but without the aggregation).
Full blown JSON based ElasticSearch queries (including aggregations)
will be added later.
Simple query example:
=====================
- Query the index named "twitter"
- Filter by "user:kimchy"
- Return the fields: "@timestamp", "tweet" and "user"
- Return up to 15 results
- Sort by @timestamp ascending
.. code:: json
{
"index" : "twitter",
"query" : "user:kimchy",
"fields" : ["@timestamp", "tweet", "user"],
"size" : 15,
"sort" : "@timestamp:asc"
}
Simple query on a logstash ElasticSearch instance:
==================================================
- Query the index named "logstash-2015.04.\*" (in this case its all of
April 2015)
- Filter by type:events AND eventName:UserUpgrade AND channel:selfserve
- Return fields: "@timestamp", "userId", "channel", "utm\_source",
"utm\_medium", "utm\_campaign", "utm\_content"
- Return up to 250 results
- Sort by @timestamp ascending
.. code:: json
{
"index" : "logstash-2015.04.*",
"query" : "type:events AND eventName:UserUpgrade AND channel:selfserve",
"fields" : ["@timestamp", "userId", "channel", "utm_source", "utm_medium", "utm_campaign", "utm_content"],
"size" : 250,
"sort" : "@timestamp:asc"
}
Simple query on a ElasticSearch instance:
==================================================
- Query the index named "twitter"
- Filter by user equal "kimchy"
- Return the fields: "@timestamp", "tweet" and "user"
- Return up to 15 results
- Sort by @timestamp ascending
.. code:: json
{
"index" : "twitter",
"query" : {
"match": {
"user" : "kimchy"
}
},
"fields" : ["@timestamp", "tweet", "user"],
"size" : 15,
"sort" : "@timestamp:asc"
}

View File

@@ -0,0 +1,72 @@
Ongoing Maintanence and Basic Operations
########################################
Configuration and logs
======================
The supervisor config can be found in
``/opt/redash/supervisord/supervisord.conf``.
There you can see the names of its programs (``redash_celery``,
``redash_server``) and the location of their logs.
Restart
=======
Restarting the Web Server
-------------------------
``sudo supervisorctl restart redash_server``
Restarting Celery Workers
-------------------------
``sudo supervisorctl restart redash_celery``
Restarting Celery Workers & the Queries Queue
---------------------------------------------
In case you are handling a problem, and you need to stop the currently
running queries and reset the queue, follow the steps below.
1. Stop celery: ``sudo supervisorctl stop redash_celery`` (celery might
take some time to stop, if it's in the middle of running a query)
2. Flush redis: ``redis-cli flushall``.
3. Start celery: ``sudo supervisorctl start redash_celery``
Changing the Number of Workers
==============================
By default, Celery will start a worker per CPU core. Because most of
Re:dash's tasks are IO bound, the real limit for number of workers you
can use depends on the amount of memory your machine has. It's
recommended to increase number of workers, to support more concurrent
queries.
1. Open the supervisord configuration file:
``/opt/redash/supervisord/supervisord.conf``
2. Edit the ``[program:redash_celery]`` section and add to the *command*
value, the param "-c" with the number of concurrent workers you need.
3. Restart supervisord to apply new configuration:
``sudo /etc/init.d/redash_supervisord restart``.
DB
==
Backup Re:dash's DB:
--------------------
Uncompressed backup: ``sudo -u redash pg_dump > backup_filename.sql``
Compressed backup: ``sudo -u redash pg_dump redash | gzip > backup_filename.gz``
Version
=======
See current version:
``bin/run ./manage.py version``

View File

@@ -0,0 +1,74 @@
MongoDB: Querying
#################
Simple query example:
=====================
.. code:: json
{
"collection" : "my_collection",
"query" : {
"date" : {
"$gt" : "ISODate(\"2015-01-15 11:41\")",
},
"type" : 1
},
"fields" : {
"_id" : 1,
"name" : 2
},
"sort" : [
{
"name" : "date",
"direction" : -1
}
]
}
Live example on the demo instance:
http://demo.redash.io/queries/394/source.
Aggregation
===========
Uses a syntax similar to the one used in PyMongo, however to support the
correct order of sorting, it uses a regular list for the "$sort"
operation that converts into a SON (sorted dictionary) object before
execution.
Aggregation query example:
.. code:: json
{
"collection" : "things",
"aggregate" : [
{
"$unwind" : "$tags"
},
{
"$group" : {
"_id" : "$tags",
"count" : { "$sum" : 1 }
}
},
{
"$sort" : [
{
"name" : "count",
"direction" : -1
},
{
"name" : "_id",
"direction" : -1
}
]
}
]
}
Live examples on the demo instance:
1. http://demo.redash.io/queries/393/source
2. http://demo.redash.io/queries/387/source

View File

@@ -0,0 +1,35 @@
Permissions Model
#################
In version 0.9.0 we introduced a new permissions model based on groups. Each user by default joins the ``Default`` group, but
can be a member of any number of groups.
Group membership defines the actions you're allowed to take (although currently there is no UI to edit group action permissions),
but also what data sources you have access to (for this we have UI).
How does it work?
=================
* Each user belongs to one or more groups. By default each user joins the ``Default`` group. So the common
data sources, should be associated with this group.
* Each data source will be associated with one or more groups. Each connection to a group will define,
whether this group has full access to this data source (view existing queries and run new ones) or view only access,
which allows only viewing existing queries and results.
* Any dashboard can contain visualizations from any data source (as long as the creating user has access to them). When
a user who doesn't have access to some visualization (because he doesn't have access to the data source) opens a dashboard,
he will see that there is a visualization there but won't see the details.
.. figure:: https://cloud.githubusercontent.com/assets/71468/12002946/dc5032ca-ab16-11e5-90e7-aae9234a596b.png
Dashboard widget with a visualization the user doesn't have access to.
In current implementation all the users see a list of all the dashboards. Once `pull request #957 <https://github.com/getredash/redash/pull/957>`__
gets merged, we will filter out dashboards from the list that the user has no access to any of their widgets.
What if I want to limit the user to only some tables?
=====================================================
The idea is to leverage your database's security model, and hence create a user with access to the tables/columns you
want to give access to. Create a data source that is using this user and then associate it with a group of users who need
this level of access.

View File

@@ -0,0 +1,44 @@
Special Features
#################
Re:dash has a lot of very useful features and most of them can be found easily when using the UI. This page features the less well-known ones.
Queries
========
It is possible to have filters for query results and visualizations. Thanks to filters, you can restrain the result to a certain or multiple values. Filters are enabled by following a naming convention for columns.
If you want to focus only on a specific value, you will need to alias your column to ``<columnName>::filter``. Here is an example:
.. code:: sql
select action as "action::filter", count (0) as "actions count"
from events
group by action
You can see this query and the rendered UI `here <http://demo.redash.io/queries/143/source#table>`_.
If you are interested in multi filters (meaning that you can select multiple values), you will need to alias your column to ``<columnName>::multi-filter``. Here is an example:
.. code:: sql
select action as "action::multi-filter", count (0) as "actions count"
from events
group by action
You can see this query and the rendered UI `here <http://demo.redash.io/queries/144/source#table>`_.
Note that you can use ``__filter`` or ``__multiFilter`` if your database doesn't support ``::`` in column names (such as BigQuery).
Dashboards
==========
It is possible to group multiple dashboards in the dashboards menu. To do this, you need to follow a naming convention by using a column (``:``) to separate the dashboard group and the actual dashboard name. For example, if you name 2 dashboards ``Foo: Bar`` and ``Foo: Baz``, they will be grouped under the ``Foo`` namespace in the dropdown menu.
If you've got queries that have some filters and you want to apply filters at the dashboard level (that apply to all queries), you need to set a flag. Can you do it through the admin interface at ``/admin/dashboard`` or you can do it by manually setting the column ``dashboard_filters_enabled`` of the table ``dashboards`` to ``TRUE`` in the Re:dash database.
Exporting query results to CSV or JSON
======================================
Query results can be automatically exported to CSV or JSON by using your API key. Your API key can be found when viewing your profile, from the top right menu in the navigation bar.
The format of the URL is the following: ``https://<redash_domain>/api/queries/<query_id>/results.(csv|json)?api_key=<your_api_key>``. Here is a working example: `<http://demo.redash.io/api/queries/63/results.json?api_key=874fcd93ce4b6ef87a9aad41c712bcd5d17cdc8f>`_.
Using this URL you can easily import query results directly into Google Spreadsheets, using the ``importdata`` function. For example: ``=importdata("...")``.

154
manage.py
View File

@@ -2,27 +2,35 @@
"""
CLI to manage redash.
"""
import datetime
from flask.ext.script import Manager, prompt_pass
import json
from flask_script import Manager
from redash import settings, models, __version__
from redash.wsgi import app
from redash.import_export import import_manager
from redash.cli import users, database, data_sources, organization
from redash.monitor import get_status
manager = Manager(app)
database_manager = Manager(help="Manages the database (create/drop tables).")
users_manager = Manager(help="Users management commands.")
data_sources_manager = Manager(help="Data sources management commands.")
manager.add_command("database", database.manager)
manager.add_command("users", users.manager)
manager.add_command("ds", data_sources.manager)
manager.add_command("org", organization.manager)
@manager.command
def version():
"""Displays re:dash version."""
print __version__
@manager.command
def status():
print json.dumps(get_status(), indent=2)
@manager.command
def runworkers():
"""Prints deprecation warning."""
"""Start workers (deprecated)."""
print "** This command is deprecated. Please use Celery's CLI to control the workers. **"
@@ -31,134 +39,20 @@ def make_shell_context():
from redash.models import db
return dict(app=app, db=db, models=models)
@manager.command
def check_settings():
from types import ModuleType
for name in dir(settings):
item = getattr(settings, name)
if not callable(item) and not name.startswith("__") and not isinstance(item, ModuleType):
print "{} = {}".format(name, item)
"""Show the settings as re:dash sees them (useful for debugging)."""
for name, item in settings.all_settings().iteritems():
print "{} = {}".format(name, item)
@manager.command
def import_events(events_file):
# TODO: remove this code past 1/11/2014.
import json
from collections import Counter
def send_test_mail():
from redash import mail
from flask_mail import Message
count = Counter()
mail.send(Message(subject="Test Message from re:dash", recipients=[settings.MAIL_DEFAULT_SENDER], body="Test message."))
with open(events_file) as f:
for line in f:
try:
event = json.loads(line)
object_type = event.get('object_type', None)
object_id = event.get('object_id', None)
if object_id == 'dashboard' and object_type == 'dashboard':
count['bad dashboard id'] += 1
continue
models.Event.record(event)
count['imported'] += 1
except Exception as ex:
print "Failed importing line:"
print line
print ex.message
count[ex.message] += 1
count['failed'] += 1
models.db.close_db(None)
for k, v in count.iteritems():
print k
print v
@database_manager.command
def create_tables():
"""Creates the database tables."""
from redash.models import create_db, init_db
create_db(True, False)
init_db()
@database_manager.command
def drop_tables():
"""Drop the database tables."""
from redash.models import create_db
create_db(False, True)
@users_manager.option('email', help="User's email")
@users_manager.option('name', help="User's full name")
@users_manager.option('--admin', dest='is_admin', action="store_true", default=False, help="set user as admin")
@users_manager.option('--google', dest='google_auth', action="store_true", default=False, help="user uses Google Auth to login")
@users_manager.option('--password', dest='password', default=None, help="Password for users who don't use Google Auth (leave blank for prompt).")
@users_manager.option('--groups', dest='groups', default=models.User.DEFAULT_GROUPS, help="Comma seperated list of groups (leave blank for default).")
def create(email, name, groups, is_admin=False, google_auth=False, password=None):
print "Creating user (%s, %s)..." % (email, name)
print "Admin: %r" % is_admin
print "Login with Google Auth: %r\n" % google_auth
if isinstance(groups, basestring):
groups= groups.split(',')
groups.remove('') # in case it was empty string
if is_admin:
groups += ['admin']
user = models.User(email=email, name=name, groups=groups)
if not google_auth:
password = password or prompt_pass("Password")
user.hash_password(password)
try:
user.save()
except Exception, e:
print "Failed creating user: %s" % e.message
@users_manager.option('email', help="email address of user to delete")
def delete(email):
deleted_count = models.User.delete().where(models.User.email == email).execute()
print "Deleted %d users." % deleted_count
@data_sources_manager.command
def import_from_settings(name=None):
"""Import data source from settings (env variables)."""
name = name or "Default"
data_source = models.DataSource.create(name=name,
type=settings.CONNECTION_ADAPTER,
options=settings.CONNECTION_STRING)
print "Imported data source from settings (id={}).".format(data_source.id)
@data_sources_manager.command
def list():
"""List currently configured data sources"""
for ds in models.DataSource.select():
print "Name: {}\nType: {}\nOptions: {}".format(ds.name, ds.type, ds.options)
@data_sources_manager.command
def new(name, type, options):
"""Create new data source"""
# TODO: validate it's a valid type and in the future, validate the options.
print "Creating {} data source ({}) with options:\n{}".format(type, name, options)
data_source = models.DataSource.create(name=name,
type=type,
options=options)
print "Id: {}".format(data_source.id)
manager.add_command("database", database_manager)
manager.add_command("users", users_manager)
manager.add_command("import", import_manager)
manager.add_command("ds", data_sources_manager)
if __name__ == '__main__':
manager.run()
manager.run()

View File

@@ -0,0 +1,15 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.add_column('queries', 'is_archived', models.Query.is_archived)
)
db.close_db(None)

View File

@@ -0,0 +1,20 @@
from redash.models import db
if __name__ == '__main__':
db.connect_db()
columns = (
('activity_log', 'created_at'),
('dashboards', 'created_at'),
('data_sources', 'created_at'),
('events', 'created_at'),
('groups', 'created_at'),
('queries', 'created_at'),
('widgets', 'created_at'),
('query_results', 'retrieved_at')
)
with db.database.transaction():
for column in columns:
db.database.execute_sql("ALTER TABLE {} ALTER COLUMN {} TYPE timestamp with time zone;".format(*column))
db.close_db(None)

View File

@@ -0,0 +1,91 @@
import json
import jsonschema
from jsonschema import ValidationError
from redash import query_runner
from redash.models import DataSource
def validate_configuration(query_runner_type, configuration_json):
query_runner_class = query_runner.query_runners.get(query_runner_type, None)
if query_runner_class is None:
return False
try:
if isinstance(configuration_json, basestring):
configuration = json.loads(configuration_json)
else:
configuration = configuration_json
jsonschema.validate(configuration, query_runner_class.configuration_schema())
except (ValidationError, ValueError):
return False
return True
def update(data_source):
print "[%s] Old options: %s" % (data_source.name, data_source.options)
if validate_configuration(data_source.type, data_source.options):
print "[%s] configuration already valid. skipping." % data_source.name
return
if data_source.type == 'pg':
values = data_source.options.split(" ")
configuration = {}
for value in values:
k, v = value.split("=", 1)
configuration[k] = v
if k == 'port':
configuration[k] = int(v)
data_source.options = json.dumps(configuration)
elif data_source.type == 'mysql':
mapping = {
'Server': 'host',
'User': 'user',
'Pwd': 'passwd',
'Database': 'db'
}
values = data_source.options.split(";")
configuration = {}
for value in values:
k, v = value.split("=", 1)
configuration[mapping[k]] = v
data_source.options = json.dumps(configuration)
elif data_source.type == 'graphite':
old_config = json.loads(data_source.options)
configuration = {
"url": old_config["url"]
}
if "verify" in old_config:
configuration['verify'] = old_config['verify']
if "auth" in old_config:
configuration['username'], configuration['password'] = old_config["auth"]
data_source.options = json.dumps(configuration)
elif data_source.type == 'url':
data_source.options = json.dumps({"url": data_source.options})
elif data_source.type == 'script':
data_source.options = json.dumps({"path": data_source.options})
elif data_source.type == 'mongo':
data_source.type = 'mongodb'
else:
print "[%s] No need to convert type of: %s" % (data_source.name, data_source.type)
print "[%s] New options: %s" % (data_source.name, data_source.options)
data_source.save(only=data_source.dirty_fields)
if __name__ == '__main__':
for data_source in DataSource.select(DataSource.id, DataSource.name, DataSource.type, DataSource.options):
update(data_source)

View File

@@ -0,0 +1,12 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.drop_not_null('events', 'user_id')
)

View File

@@ -0,0 +1,25 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.add_column('queries', 'updated_at', models.Query.updated_at),
migrator.add_column('dashboards', 'updated_at', models.Dashboard.updated_at),
migrator.add_column('widgets', 'updated_at', models.Widget.updated_at),
migrator.add_column('users', 'created_at', models.User.created_at),
migrator.add_column('users', 'updated_at', models.User.updated_at),
migrator.add_column('visualizations', 'created_at', models.Visualization.created_at),
migrator.add_column('visualizations', 'updated_at', models.Visualization.updated_at)
)
db.database.execute_sql("UPDATE queries SET updated_at = created_at;")
db.database.execute_sql("UPDATE dashboards SET updated_at = created_at;")
db.database.execute_sql("UPDATE widgets SET updated_at = created_at;")
db.close_db(None)

View File

@@ -0,0 +1,17 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.add_column('queries', 'last_modified_by_id', models.Query.last_modified_by)
)
db.database.execute_sql("UPDATE queries SET last_modified_by_id = user_id;")
db.close_db(None)

View File

@@ -0,0 +1,21 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.add_column('queries', 'schedule', models.Query.schedule),
)
db.database.execute_sql("UPDATE queries SET schedule = ttl WHERE ttl > 0;")
migrate(
migrator.drop_column('queries', 'ttl')
)
db.close_db(None)

View File

@@ -0,0 +1,20 @@
from redash.models import db
if __name__ == '__main__':
db.connect_db()
with db.database.transaction():
# Make sure all data sources names are unique.
db.database.execute_sql("""
UPDATE data_sources
SET name = new_names.name
FROM (
SELECT id, name || ' ' || id as name
FROM (SELECT id, name, rank() OVER (PARTITION BY name ORDER BY created_at ASC) FROM data_sources) ds WHERE rank > 1
) AS new_names
WHERE data_sources.id = new_names.id;
""")
# Add unique constraint on data_sources.name.
db.database.execute_sql("ALTER TABLE data_sources ADD CONSTRAINT unique_name UNIQUE (name);")
db.close_db(None)

View File

@@ -0,0 +1,24 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
column = models.User.api_key
column.null = True
migrate(
migrator.add_column('users', 'api_key', models.User.api_key),
)
for user in models.User.select(models.User.id, models.User.api_key):
user.save(only=user.dirty_fields)
migrate(
migrator.add_not_null('users', 'api_key')
)
db.close_db(None)

View File

@@ -0,0 +1,14 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.drop_not_null('queries', 'data_source_id'),
)
db.close_db(None)

View File

@@ -0,0 +1,8 @@
from redash.models import db, Alert, AlertSubscription
if __name__ == '__main__':
with db.database.transaction():
Alert.create_table()
AlertSubscription.create_table()
db.close_db(None)

View File

@@ -0,0 +1,44 @@
from base64 import b64encode
import json
from redash.models import DataSource
def convert_p12_to_pem(p12file):
from OpenSSL import crypto
with open(p12file, 'rb') as f:
p12 = crypto.load_pkcs12(f.read(), "notasecret")
return crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
if __name__ == '__main__':
for ds in DataSource.select(DataSource.id, DataSource.type, DataSource.options):
if ds.type == 'bigquery':
options = json.loads(ds.options)
if 'jsonKeyFile' in options:
continue
new_options = {
'projectId': options['projectId'],
'jsonKeyFile': b64encode(json.dumps({
'client_email': options['serviceAccount'],
'private_key': convert_p12_to_pem(options['privateKey'])
}))
}
ds.options = json.dumps(new_options)
ds.save(only=ds.dirty_fields)
elif ds.type == 'google_spreadsheets':
options = json.loads(ds.options)
if 'jsonKeyFile' in options:
continue
with open(options['credentialsFilePath']) as f:
new_options = {
'jsonKeyFile': b64encode(f.read())
}
ds.options = json.dumps(new_options)
ds.save(only=ds.dirty_fields)

View File

@@ -0,0 +1,7 @@
from redash import models
if __name__ == '__main__':
default_group = models.Group.select(models.Group.id, models.Group.permissions).where(models.Group.name=='default').first()
default_group.permissions.append('list_users')
default_group.save(only=[models.Group.permissions])

View File

@@ -0,0 +1,23 @@
import json
from redash import models
if __name__ == '__main__':
for vis in models.Visualization.select():
if vis.type == 'COUNTER':
options = json.loads(vis.options)
print "Before: ", options
if 'rowNumber' in options and options['rowNumber'] is not None:
options['rowNumber'] += 1
else:
options['rowNumber'] = 1
if 'counterColName' not in options:
options['counterColName'] = 'counter'
if 'targetColName' not in options:
options['targetColName'] = 'target'
options['targetRowNumber'] = options['rowNumber']
print "After: ", options
vis.options = json.dumps(options)
vis.save()

View File

@@ -0,0 +1,21 @@
import peewee
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
cursor = db.database.execute_sql("SELECT column_name FROM information_schema.columns WHERE table_name='alerts' and column_name='rearm';")
if cursor.rowcount > 0:
print "Column exists. Skipping."
exit()
with db.database.transaction():
migrate(
migrator.add_column('alerts', 'rearm', models.Alert.rearm),
)
db.close_db(None)

View File

@@ -0,0 +1,10 @@
__author__ = 'lior'
from redash.models import DataSource
if __name__ == '__main__':
for ds in DataSource.select(DataSource.id, DataSource.type):
if ds.type == 'elasticsearch':
ds.type = 'kibana'
ds.save(only=ds.dirty_fields)

View File

@@ -0,0 +1,6 @@
from redash import models
if __name__ == '__main__':
default_group = models.Group.select(models.Group.id, models.Group.permissions).where(models.Group.name=='default').first()
default_group.permissions.append('schedule_query')
default_group.save(only=[models.Group.permissions])

View File

@@ -0,0 +1,9 @@
from redash.models import db, Alert, AlertSubscription
if __name__ == '__main__':
with db.database.transaction():
# There was an AWS/GCE image created without this table, to make sure this exists we run this migration.
if not AlertSubscription.table_exists():
AlertSubscription.create_table()
db.close_db(None)

View File

@@ -0,0 +1,14 @@
from playhouse.migrate import PostgresqlMigrator, migrate
from redash.models import db
if __name__ == '__main__':
db.connect_db()
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
migrate(
migrator.drop_column('groups', 'tables')
)
db.close_db(None)

View File

@@ -0,0 +1,34 @@
from redash.models import db, Organization, Group
from redash import settings
from playhouse.migrate import PostgresqlMigrator, migrate
if __name__ == '__main__':
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
Organization.create_table()
default_org = Organization.create(name="Default", slug='default', settings={
Organization.SETTING_GOOGLE_APPS_DOMAINS: list(settings.GOOGLE_APPS_DOMAIN)
})
column = Group.org
column.default = default_org
migrate(
migrator.add_column('groups', 'org_id', column),
migrator.add_column('events', 'org_id', column),
migrator.add_column('data_sources', 'org_id', column),
migrator.add_column('users', 'org_id', column),
migrator.add_column('dashboards', 'org_id', column),
migrator.add_column('queries', 'org_id', column),
migrator.add_column('query_results', 'org_id', column),
)
# Change the uniqueness constraint on user email to be (org, email):
migrate(
migrator.drop_index('users', 'users_email'),
migrator.add_index('users', ('org_id', 'email'), unique=True)
)
db.close_db(None)

View File

@@ -0,0 +1,44 @@
from collections import defaultdict
from redash.models import db, DataSourceGroup, DataSource, Group, Organization, User
from playhouse.migrate import PostgresqlMigrator, migrate
import peewee
if __name__ == '__main__':
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
# Add type to groups
migrate(
migrator.add_column('groups', 'type', Group.type)
)
for name in ['default', 'admin']:
group = Group.get(Group.name==name)
group.type = Group.BUILTIN_GROUP
group.save()
# Create association table between data sources and groups
DataSourceGroup.create_table()
# add default to existing data source:
default_org = Organization.get_by_id(1)
default_group = Group.get(Group.name=="default")
for ds in DataSource.all(default_org):
DataSourceGroup.create(data_source=ds, group=default_group)
# change the groups list on a user object to be an ids list
migrate(
migrator.rename_column('users', 'groups', 'old_groups'),
)
migrate(migrator.add_column('users', 'groups', User.groups))
group_map = dict(map(lambda g: (g.name, g.id), Group.select()))
user_map = defaultdict(list)
for user in User.select(User, peewee.SQL('old_groups')):
group_ids = [group_map[group] for group in user.old_groups]
user.update_instance(groups=group_ids)
migrate(migrator.drop_column('users', 'old_groups'))
db.close_db(None)

View File

@@ -0,0 +1,6 @@
from redash import models
if __name__ == '__main__':
admin_group = models.Group.get(models.Group.name=='admin')
admin_group.permissions.append('super_admin')
admin_group.save()

View File

@@ -0,0 +1,19 @@
from redash.models import db
import peewee
from playhouse.migrate import PostgresqlMigrator, migrate
if __name__ == '__main__':
migrator = PostgresqlMigrator(db.database)
with db.database.transaction():
# Change the uniqueness constraint on data source name to be (org, name):
# In some cases it's a constraint:
db.database.execute_sql('ALTER TABLE data_sources DROP CONSTRAINT IF EXISTS unique_name')
# In others only an index:
db.database.execute_sql('DROP INDEX IF EXISTS data_sources_name')
migrate(
migrator.add_index('data_sources', ('org_id', 'name'), unique=True)
)
db.close_db(None)

View File

@@ -0,0 +1,5 @@
from redash.models import ApiKey
if __name__ == '__main__':
ApiKey.create_table()

View File

@@ -0,0 +1,10 @@
from redash import models
if __name__ == '__main__':
with models.db.database.transaction():
groups = models.Group.select(models.Group.id, models.Group.permissions).where(models.Group.name=='default')
for group in groups:
group.permissions.append('list_dashboards')
group.permissions.append('list_alerts')
group.permissions.append('list_data_sources')
group.save(only=[models.Group.permissions])

View File

@@ -0,0 +1,8 @@
from redash import models
if __name__ == '__main__':
with models.db.database.transaction():
groups = models.Group.select(models.Group.id, models.Group.type).where(models.Group.name=='default')
for group in groups:
group.type = models.Group.BUILTIN_GROUP
group.save(only=[models.Group.type])

View File

@@ -1,13 +0,0 @@
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.Dashboard, models.Dashboard.created_at, 'created_at')
migrator.add_column(models.Widget, models.Widget.created_at, 'created_at')
db.close_db(None)

View File

@@ -1,12 +0,0 @@
from playhouse.migrate import Migrator
from redash import models
from redash.models import db
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.Dashboard, models.Dashboard.dashboard_filters_enabled, 'dashboard_filters_enabled')
db.close_db(None)

View File

@@ -1,12 +0,0 @@
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.User, models.User.password_hash, 'password_hash')
db.close_db(None)

View File

@@ -1,13 +0,0 @@
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.User, models.User.permissions, 'permissions')
models.User.update(permissions=['admin'] + models.User.DEFAULT_PERMISSIONS).where(models.User.is_admin == True).execute()
db.close_db(None)

View File

@@ -1,13 +0,0 @@
from playhouse.migrate import Migrator
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.DataSource, models.DataSource.queue_name, 'queue_name')
migrator.add_column(models.DataSource, models.DataSource.scheduled_queue_name, 'scheduled_queue_name')
db.close_db(None)

View File

@@ -1,13 +0,0 @@
from playhouse.migrate import Migrator
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.add_column(models.Widget, models.Widget.text, 'text')
migrator.set_nullable(models.Widget, models.Widget.visualization, True)
db.close_db(None)

View File

@@ -1,13 +0,0 @@
import peewee
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
previous_default_permissions = models.User.DEFAULT_PERMISSIONS[:]
previous_default_permissions.remove('view_query')
models.User.update(permissions=peewee.fn.array_append(models.User.permissions, 'view_query')).where(peewee.SQL("'view_source' = any(permissions)")).execute()
db.close_db(None)

View File

@@ -1,12 +0,0 @@
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.set_nullable(models.Query, models.Query.description, True)
db.close_db(None)

View File

@@ -1,13 +0,0 @@
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
with db.database.transaction():
migrator.set_nullable(models.Widget, models.Widget.query_id, True)
migrator.set_nullable(models.Widget, models.Widget.type, True)
db.close_db(None)

View File

@@ -1,11 +0,0 @@
from redash import db
from redash import models
if __name__ == '__main__':
db.connect_db()
if not models.ActivityLog.table_exists():
print "Creating activity_log table..."
models.ActivityLog.create_table()
db.close_db(None)

View File

@@ -1,48 +0,0 @@
import logging
import peewee
from playhouse.migrate import Migrator
from redash import db
from redash import models
from redash import settings
if __name__ == '__main__':
db.connect_db()
if not models.DataSource.table_exists():
print "Creating data_sources table..."
models.DataSource.create_table()
default_data_source = models.DataSource.create(name="Default",
type=settings.CONNECTION_ADAPTER,
options=settings.CONNECTION_STRING)
else:
default_data_source = models.DataSource.select().first()
migrator = Migrator(db.database)
models.Query.data_source.null = True
models.QueryResult.data_source.null = True
try:
with db.database.transaction():
migrator.add_column(models.Query, models.Query.data_source, "data_source_id")
except peewee.ProgrammingError:
print "Failed to create data_source_id column -- assuming it already exists"
try:
with db.database.transaction():
migrator.add_column(models.QueryResult, models.QueryResult.data_source, "data_source_id")
except peewee.ProgrammingError:
print "Failed to create data_source_id column -- assuming it already exists"
print "Updating data source to existing one..."
models.Query.update(data_source=default_data_source.id).execute()
models.QueryResult.update(data_source=default_data_source.id).execute()
with db.database.transaction():
print "Setting data source to non nullable..."
migrator.set_nullable(models.Query, models.Query.data_source, False)
with db.database.transaction():
print "Setting data source to non nullable..."
migrator.set_nullable(models.QueryResult, models.QueryResult.data_source, False)
db.close_db(None)

View File

@@ -1,12 +0,0 @@
from redash.models import db
from redash import models
if __name__ == '__main__':
db.connect_db()
if not models.Event.table_exists():
print "Creating events table..."
models.Event.create_table()
db.close_db(None)

View File

@@ -1,56 +0,0 @@
import json
import itertools
import peewee
from playhouse.migrate import Migrator
from redash import db, settings
from redash import models
if __name__ == '__main__':
db.connect_db()
if not models.User.table_exists():
print "Creating user table..."
models.User.create_table()
migrator = Migrator(db.database)
with db.database.transaction():
print "Creating user field on dashboard and queries..."
try:
migrator.rename_column(models.Query, '"user"', "user_email")
migrator.rename_column(models.Dashboard, '"user"', "user_email")
except peewee.ProgrammingError:
print "Failed to rename user column -- assuming it already exists"
with db.database.transaction():
models.Query.user.null = True
models.Dashboard.user.null = True
try:
migrator.add_column(models.Query, models.Query.user, "user_id")
migrator.add_column(models.Dashboard, models.Dashboard.user, "user_id")
except peewee.ProgrammingError:
print "Failed to create user_id column -- assuming it already exists"
print "Creating user for all queries and dashboards..."
for obj in itertools.chain(models.Query.select(), models.Dashboard.select()):
# Some old databases might have queries with empty string as user email:
email = obj.user_email or settings.ADMINS[0]
email = email.split(',')[0]
print ".. {} , {}, {}".format(type(obj), obj.id, email)
try:
user = models.User.get(models.User.email == email)
except models.User.DoesNotExist:
is_admin = email in settings.ADMINS
user = models.User.create(email=email, name=email, is_admin=is_admin)
obj.user = user
obj.save()
print "Set user_id to non null..."
with db.database.transaction():
migrator.set_nullable(models.Query, models.Query.user, False)
migrator.set_nullable(models.Dashboard, models.Dashboard.user, False)
migrator.set_nullable(models.Query, models.Query.user_email, True)
migrator.set_nullable(models.Dashboard, models.Dashboard.user_email, True)

View File

@@ -1,70 +0,0 @@
import json
from playhouse.migrate import Migrator
from redash import db
from redash import models
if __name__ == '__main__':
default_options = {"series": {"type": "column"}}
db.connect_db()
if not models.Visualization.table_exists():
print "Creating visualization table..."
models.Visualization.create_table()
with db.database.transaction():
migrator = Migrator(db.database)
print "Adding visualization_id to widgets:"
field = models.Widget.visualization
field.null = True
migrator.add_column(models.Widget, models.Widget.visualization, 'visualization_id')
print 'Creating TABLE visualizations for all queries...'
for query in models.Query.select():
vis = models.Visualization(query=query, name="Table",
description=query.description or "",
type="TABLE", options="{}")
vis.save()
print 'Creating COHORT visualizations for all queries named like %cohort%...'
for query in models.Query.select().where(models.Query.name ** "%cohort%"):
vis = models.Visualization(query=query, name="Cohort",
description=query.description or "",
type="COHORT", options="{}")
vis.save()
print 'Create visualization for all widgets (unless exists already):'
for widget in models.Widget.select():
print 'Processing widget id: %d:' % widget.id
vis_type = widget.type.upper()
if vis_type == 'GRID':
vis_type = 'TABLE'
query = models.Query.get_by_id(widget.query_id)
vis = query.visualizations.where(models.Visualization.type == vis_type).first()
if vis:
print '... visualization type (%s) found.' % vis_type
widget.visualization = vis
widget.save()
else:
vis_name = vis_type.title()
options = json.loads(widget.options)
vis_options = {"series": options} if options else default_options
vis_options = json.dumps(vis_options)
vis = models.Visualization(query=query, name=vis_name,
description=query.description or "",
type=vis_type, options=vis_options)
print '... Created visualization for type: %s' % vis_type
vis.save()
widget.visualization = vis
widget.save()
with db.database.transaction():
migrator = Migrator(db.database)
print "Setting visualization_id as not null..."
migrator.set_nullable(models.Widget, models.Widget.visualization, False)
db.close_db(None)

View File

@@ -1,29 +0,0 @@
import peewee
from playhouse.migrate import Migrator
from redash import models
from redash.models import db
if __name__ == '__main__':
db.connect_db()
migrator = Migrator(db.database)
if not models.Group.table_exists():
print "Creating groups table..."
models.Group.create_table()
with db.database.transaction():
models.Group.insert(name='admin', permissions=['admin'], tables=['*']).execute()
models.Group.insert(name='api', permissions=['view_query'], tables=['*']).execute()
models.Group.insert(name='default', permissions=models.Group.DEFAULT_PERMISSIONS, tables=['*']).execute()
migrator.add_column(models.User, models.User.groups, 'groups')
models.User.update(groups=['admin', 'default']).where(peewee.SQL("is_admin = true")).execute()
models.User.update(groups=['admin', 'default']).where(peewee.SQL("'admin' = any(permissions)")).execute()
models.User.update(groups=['default']).where(peewee.SQL("is_admin = false")).execute()
migrator.drop_column(models.User, 'permissions')
migrator.drop_column(models.User, 'is_admin')
db.close_db(None)

View File

@@ -11,14 +11,17 @@
"latedef": true,
"newcap": true,
"noarg": true,
"quotmark": "single",
"quotmark": false,
"regexp": true,
"undef": true,
"unused": true,
"strict": true,
"strict": false,
"trailing": true,
"smarttabs": true,
"globals": {
"angular": false
"angular": false,
"_": false,
"$": false,
"currentUser": false
}
}

View File

@@ -1,412 +0,0 @@
// Generated on 2014-07-30 using generator-angular 0.9.2
'use strict';
// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'
module.exports = function (grunt) {
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);
// Configurable paths for the application
var appConfig = {
app: require('./bower.json').appPath || 'app',
dist: 'dist'
};
// Define the configuration for all the tasks
grunt.initConfig({
// Project settings
yeoman: appConfig,
// Watches files for changes and runs tasks based on the changed files
watch: {
bower: {
files: ['bower.json'],
tasks: ['wiredep']
},
js: {
files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
tasks: ['newer:jshint:all'],
options: {
livereload: '<%= connect.options.livereload %>'
}
},
jsTest: {
files: ['test/spec/{,*/}*.js'],
tasks: ['newer:jshint:test', 'karma']
},
styles: {
files: ['<%= yeoman.app %>/styles/{,*/}*.css'],
tasks: ['newer:copy:styles', 'autoprefixer']
},
gruntfile: {
files: ['Gruntfile.js']
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
},
files: [
'<%= yeoman.app %>/{,*/}*.html',
'.tmp/styles/{,*/}*.css',
'<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
}
},
// The actual grunt server settings
connect: {
options: {
port: 9000,
// Change this to '0.0.0.0' to access the server from outside.
hostname: 'localhost',
livereload: 35729
},
livereload: {
options: {
open: true,
middleware: function (connect) {
return [
connect.static('.tmp'),
connect().use(
'/bower_components',
connect.static('./bower_components')
),
connect.static(appConfig.app)
];
}
}
},
test: {
options: {
port: 9001,
middleware: function (connect) {
return [
connect.static('.tmp'),
connect.static('test'),
connect().use(
'/bower_components',
connect.static('./bower_components')
),
connect.static(appConfig.app)
];
}
}
},
dist: {
options: {
open: true,
base: '<%= yeoman.dist %>'
}
}
},
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: '.jshintrc',
reporter: require('jshint-stylish')
},
all: {
src: [
'Gruntfile.js',
'<%= yeoman.app %>/scripts/{,*/}*.js'
]
},
test: {
options: {
jshintrc: 'test/.jshintrc'
},
src: ['test/spec/{,*/}*.js']
}
},
// Empties folders to start fresh
clean: {
dist: {
files: [{
dot: true,
src: [
'.tmp',
'<%= yeoman.dist %>/{,*/}*',
'!<%= yeoman.dist %>/.git*'
]
}]
},
server: '.tmp'
},
// Add vendor prefixed styles
autoprefixer: {
options: {
browsers: ['last 1 version']
},
dist: {
files: [{
expand: true,
cwd: '.tmp/styles/',
src: '{,*/}*.css',
dest: '.tmp/styles/'
}]
}
},
// Automatically inject Bower components into the app
wiredep: {
options: {
cwd: '<%= yeoman.app %>'
},
app: {
src: ['<%= yeoman.app %>/index.html'],
ignorePath: /\.\.\//
}
},
// Renames files for browser caching purposes
filerev: {
dist: {
src: [
'<%= yeoman.dist %>/scripts/{,*/}*.js',
'<%= yeoman.dist %>/styles/{,*/}*.css',
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/styles/fonts/*'
]
}
},
// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
html: ['<%= yeoman.app %>/index.html', '<%= yeoman.app %>/login.html'],
options: {
dest: '<%= yeoman.dist %>',
flow: {
html: {
steps: {
js: ['concat', 'uglifyjs'],
css: ['cssmin']
},
post: {}
}
}
}
},
// Performs rewrites based on filerev and the useminPrepare configuration
usemin: {
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
options: {
assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist %>/images']
}
},
// The following *-min tasks will produce minified files in the dist folder
// By default, your `index.html`'s <!-- Usemin block --> will take care of
// minification. These next options are pre-configured if you do not wish
// to use the Usemin blocks.
// cssmin: {
// dist: {
// files: {
// '<%= yeoman.dist %>/styles/main.css': [
// '.tmp/styles/{,*/}*.css'
// ]
// }
// }
// },
// uglify: {
// dist: {
// files: {
// '<%= yeoman.dist %>/scripts/scripts.js': [
// '<%= yeoman.dist %>/scripts/scripts.js'
// ]
// }
// }
// },
// concat: {
// dist: {}
// },
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.{png,jpg,jpeg,gif}',
dest: '<%= yeoman.dist %>/images'
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.svg',
dest: '<%= yeoman.dist %>/images'
}]
}
},
htmlmin: {
dist: {
options: {
collapseWhitespace: true,
conservativeCollapse: true,
collapseBooleanAttributes: true,
removeCommentsFromCDATA: true,
removeOptionalTags: true
},
files: [{
expand: true,
cwd: '<%= yeoman.dist %>',
src: ['*.html', 'views/{,*/}*.html'],
dest: '<%= yeoman.dist %>'
}]
}
},
// ngmin tries to make the code safe for minification automatically by
// using the Angular long form for dependency injection. It doesn't work on
// things like resolve or inject so those have to be done manually.
ngmin: {
dist: {
files: [{
expand: true,
cwd: '.tmp/concat/scripts',
src: '*.js',
dest: '.tmp/concat/scripts'
}]
}
},
// Replace Google CDN references
cdnify: {
dist: {
html: ['<%= yeoman.dist %>/*.html']
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt}',
'.htaccess',
'*.html',
'views/{,*/}*.html',
'images/{,*/}*.{webp}',
'fonts/*'
]
}, {
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: ['generated/*']
}, {
expand: true,
cwd: 'bower_components/bootstrap/dist',
src: 'fonts/*',
dest: '<%= yeoman.dist %>'
}]
},
styles: {
expand: true,
cwd: '<%= yeoman.app %>/styles',
dest: '.tmp/styles/',
src: '{,*/}*.css'
}
},
// Run some tasks in parallel to speed up the build process
concurrent: {
server: [
'copy:styles'
],
test: [
'copy:styles'
],
dist: [
'copy:styles',
'imagemin',
'svgmin'
]
},
// Test settings
karma: {
unit: {
configFile: 'test/karma.conf.js',
singleRun: true
}
}
});
grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'connect:dist:keepalive']);
}
grunt.task.run([
'clean:server',
'wiredep',
'concurrent:server',
'autoprefixer',
'connect:livereload',
'watch'
]);
});
grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
grunt.task.run(['serve:' + target]);
});
grunt.registerTask('test', [
'clean:server',
'concurrent:test',
'autoprefixer',
'connect:test',
'karma'
]);
grunt.registerTask('build', [
'clean:dist',
'wiredep',
'useminPrepare',
'concurrent:dist',
'autoprefixer',
'concat',
'ngmin',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'filerev',
'usemin',
'htmlmin'
]);
grunt.registerTask('default', [
'newer:jshint',
'test',
'build'
]);
};

118
rd_ui/app/app_layout.html Normal file
View File

@@ -0,0 +1,118 @@
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" ng-app="redash" ng-controller='MainCtrl'> <!--<![endif]-->
<head>
<base href="{{base_href}}">
<title ng-bind="pageTitle + '| {{name}}'"></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- build:css /styles/main.css -->
<link rel="stylesheet" href="/styles/superflat_redash.css">
<link rel="stylesheet" href="/bower_components/material-design-iconic-font/dist/css/material-design-iconic-font.css">
<link rel="stylesheet" href="/bower_components/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/bower_components/gridster/dist/jquery.gridster.css">
<link rel="stylesheet" href="/bower_components/pivottable/dist/pivot.css">
<link rel="stylesheet" href="/bower_components/cornelius/src/cornelius.css">
<link rel="stylesheet" href="/bower_components/angular-ui-select/dist/select.css">
<link rel="stylesheet" href="/bower_components/pace/themes/pace-theme-minimal.css">
<link rel="stylesheet" href="/bower_components/font-awesome/css/font-awesome.css">
<link rel="stylesheet" href="/bower_components/codemirror/addon/hint/show-hint.css">
<link rel="stylesheet" href="/bower_components/leaflet/dist/leaflet.css">
<link rel="stylesheet" href="/bower_components/angular-resizable/src/angular-resizable.css">
<link rel="stylesheet" href="/styles/redash.css">
<!-- endbuild -->
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/images/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
</head>
<body{% if headless %} class="headless"{% endif %}>
<div growl></div>
{% block content %}
{% endblock %}
<section id="1">
<div ng-view></div>
<div ng-if="showPermissionError" class="ng-cloak container" ng-cloak>
<div class="row">
<div class="text-center">
<h1><span class="zmdi zmdi-lock"></span></h1>
<p class="text-muted">
You do not have permission to view the requested page.
</p>
</div>
</div>
</div>
{% if not headless %}
{% raw %}
<div class="visible-print">
<hr>
Source: {{location}}
</div>
</section>
{% endraw %}
{% include 'footer.html' %}
{% endif %}
{% include 'vendor_scripts.html' %}
<!-- build:js({.tmp,app}) /scripts/scripts.js -->
<script src="/scripts/app.js"></script>
<script src="/scripts/services/services.js"></script>
<script src="/scripts/services/resources.js"></script>
<script src="/scripts/services/notifications.js"></script>
<script src="/scripts/services/dashboards.js"></script>
<script src="/scripts/controllers/controllers.js"></script>
<script src="/scripts/controllers/dashboard.js"></script>
<script src="/scripts/controllers/admin_controllers.js"></script>
<script src="/scripts/controllers/data_sources.js"></script>
<script src="/scripts/controllers/query_view.js"></script>
<script src="/scripts/controllers/query_source.js"></script>
<script src="/scripts/controllers/users.js"></script>
<script src="/scripts/visualizations/base.js"></script>
<script src="/scripts/visualizations/chart.js"></script>
<script src="/scripts/visualizations/cohort.js"></script>
<script src="/scripts/visualizations/map.js"></script>
<script src="/scripts/visualizations/counter.js"></script>
<script src="/scripts/visualizations/boxplot.js"></script>
<script src="/scripts/visualizations/box.js"></script>
<script src="/scripts/visualizations/table.js"></script>
<script src="/scripts/visualizations/pivot.js"></script>
<script src="/scripts/visualizations/date_range_selector.js"></script>
<script src="/scripts/directives/directives.js"></script>
<script src="/scripts/directives/query_directives.js"></script>
<script src="/scripts/directives/data_source_directives.js"></script>
<script src="/scripts/directives/dashboard_directives.js"></script>
<script src="/scripts/filters.js"></script>
<script src="/scripts/controllers/alerts.js"></script>
<!-- endbuild -->
<script>
// TODO: move currentUser & features to be an Angular service
var clientConfig = {{ client_config|safe }};
var basePath = "{{base_href}}";
var currentUser = {{ user|safe }};
currentUser.canEdit = function(object) {
var user_id = object.user_id || (object.user && object.user.id);
return this.hasPermission('admin') || (user_id && (user_id == currentUser.id));
};
currentUser.hasPermission = function(permission) {
return this.permissions.indexOf(permission) != -1;
};
currentUser.isAdmin = currentUser.hasPermission('admin');
</script>
{% include '_includes/tail.html' %}
</body>
</html>

78
rd_ui/app/embed.html Normal file
View File

@@ -0,0 +1,78 @@
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" ng-app="redash" ng-controller='MainCtrl'> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" ng-app="redash" ng-controller='EmbedCtrl'> <!--<![endif]-->
<head>
<base href="{{base_href}}">
<title ng-bind="'{{name}} | ' + pageTitle"></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- build:css /styles/embed.css -->
<link rel="stylesheet" href="/styles/superflat_redash.css">
<link rel="stylesheet" href="/bower_components/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/bower_components/gridster/dist/jquery.gridster.css">
<link rel="stylesheet" href="/bower_components/pivottable/dist/pivot.css">
<link rel="stylesheet" href="/bower_components/cornelius/src/cornelius.css">
<link rel="stylesheet" href="/bower_components/angular-ui-select/dist/select.css">
<link rel="stylesheet" href="/bower_components/pace/themes/pace-theme-minimal.css">
<link rel="stylesheet" href="/bower_components/font-awesome/css/font-awesome.css">
<link rel="stylesheet" href="/bower_components/codemirror/addon/hint/show-hint.css">
<link rel="stylesheet" href="/bower_components/leaflet/dist/leaflet.css">
<link rel="stylesheet" href="/styles/redash.css">
<!-- endbuild -->
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/images/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
<style>
body { padding: 0; }
</style>
</head>
<body>
<div growl></div>
<div ng-view></div>
{% include 'vendor_scripts.html' %}
<!-- build:js({.tmp,app}) /scripts/embed-scripts.js -->
<script src="/scripts/embed.js"></script>
<script src="/scripts/services/services.js"></script>
<script src="/scripts/services/resources.js"></script>
<script src="/scripts/services/notifications.js"></script>
<script src="/scripts/services/dashboards.js"></script>
<script src="/scripts/controllers/controllers.js"></script>
<script src="/scripts/controllers/dashboard.js"></script>
<script src="/scripts/controllers/admin_controllers.js"></script>
<script src="/scripts/controllers/data_sources.js"></script>
<script src="/scripts/controllers/query_view.js"></script>
<script src="/scripts/controllers/query_source.js"></script>
<script src="/scripts/controllers/users.js"></script>
<script src="/scripts/visualizations/base.js"></script>
<script src="/scripts/visualizations/chart.js"></script>
<script src="/scripts/visualizations/cohort.js"></script>
<script src="/scripts/visualizations/map.js"></script>
<script src="/scripts/visualizations/counter.js"></script>
<script src="/scripts/visualizations/boxplot.js"></script>
<script src="/scripts/visualizations/box.js"></script>
<script src="/scripts/visualizations/table.js"></script>
<script src="/scripts/visualizations/pivot.js"></script>
<script src="/scripts/visualizations/date_range_selector.js"></script>
<script src="/scripts/directives/directives.js"></script>
<script src="/scripts/directives/query_directives.js"></script>
<script src="/scripts/directives/data_source_directives.js"></script>
<script src="/scripts/directives/dashboard_directives.js"></script>
<script src="/scripts/filters.js"></script>
<script src="/scripts/controllers/alerts.js"></script>
<!-- endbuild -->
<script>
var clientConfig = {{ client_config|safe }};
var visualization = {{ visualization|safe }};
var query_result = {{ query_result|safe }};
</script>
</body>
</html>

BIN
rd_ui/app/fonts/glyphicons-halflings-regular.eot Normal file → Executable file

Binary file not shown.

403
rd_ui/app/fonts/glyphicons-halflings-regular.svg Normal file → Executable file
View File

@@ -8,9 +8,10 @@
<missing-glyph horiz-adv-x="500" />
<glyph />
<glyph />
<glyph unicode="&#xd;" />
<glyph unicode=" " />
<glyph unicode="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" />
<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" />
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="652" />
<glyph unicode="&#x2001;" horiz-adv-x="1304" />
@@ -25,204 +26,204 @@
<glyph unicode="&#x200a;" horiz-adv-x="72" />
<glyph unicode="&#x202f;" horiz-adv-x="260" />
<glyph unicode="&#x205f;" horiz-adv-x="326" />
<glyph unicode="&#x20ac;" d="M800 500h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406z" />
<glyph unicode="&#x2212;" d="M1100 700h-900v-300h900v300z" />
<glyph unicode="&#x2601;" d="M178 300h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57z" />
<glyph unicode="&#x2709;" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" />
<glyph unicode="&#x270f;" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#xe001;" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" />
<glyph unicode="&#xe002;" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" />
<glyph unicode="&#xe003;" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
<glyph unicode="&#xe005;" d="M649 949q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" />
<glyph unicode="&#xe006;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" />
<glyph unicode="&#xe008;" d="M1200 143v-143h-1200v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100z" />
<glyph unicode="&#xe009;" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe010;" d="M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe011;" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z" />
<glyph unicode="&#xe012;" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe013;" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" />
<glyph unicode="&#xe014;" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" />
<glyph unicode="&#xe015;" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" />
<glyph unicode="&#xe016;" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" />
<glyph unicode="&#xe017;" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" />
<glyph unicode="&#xe018;" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" />
<glyph unicode="&#xe019;" d="M488 183l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5 q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" />
<glyph unicode="&#xe020;" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" />
<glyph unicode="&#xe022;" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" />
<glyph unicode="&#xe023;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" />
<glyph unicode="&#xe024;" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" />
<glyph unicode="&#xe025;" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" />
<glyph unicode="&#xe026;" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" />
<glyph unicode="&#xe027;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" />
<glyph unicode="&#xe028;" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" />
<glyph unicode="&#xe029;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" />
<glyph unicode="&#xe030;" d="M1177 600h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" />
<glyph unicode="&#xe031;" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122l-145 -145v400h400z" />
<glyph unicode="&#xe032;" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" />
<glyph unicode="&#xe034;" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" />
<glyph unicode="&#xe035;" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" />
<glyph unicode="&#xe036;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" />
<glyph unicode="&#xe037;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" />
<glyph unicode="&#xe039;" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" />
<glyph unicode="&#xe040;" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " />
<glyph unicode="&#xe041;" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" />
<glyph unicode="&#xe042;" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" />
<glyph unicode="&#xe043;" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" />
<glyph unicode="&#xe045;" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" />
<glyph unicode="&#xe047;" d="M1200 0v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" />
<glyph unicode="&#xe048;" d="M100 1199h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" />
<glyph unicode="&#xe049;" d="M877 1200l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" />
<glyph unicode="&#xe050;" d="M1150 1200h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" />
<glyph unicode="&#xe051;" d="M950 1201h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" />
<glyph unicode="&#xe052;" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe053;" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe058;" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe059;" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" />
<glyph unicode="&#xe060;" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" />
<glyph unicode="&#xe062;" d="M600 1213q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" />
<glyph unicode="&#xe063;" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " />
<glyph unicode="&#xe064;" d="M554 1295q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" />
<glyph unicode="&#xe065;" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" />
<glyph unicode="&#xe066;" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5z M813 431l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" />
<glyph unicode="&#xe067;" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" />
<glyph unicode="&#xe068;" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" />
<glyph unicode="&#xe069;" d="M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" />
<glyph unicode="&#xe070;" d="M1200 0l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" />
<glyph unicode="&#xe071;" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" />
<glyph unicode="&#xe072;" d="M1100 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" />
<glyph unicode="&#xe074;" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe075;" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" />
<glyph unicode="&#xe076;" d="M1050 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe078;" d="M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe079;" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" />
<glyph unicode="&#xe080;" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" />
<glyph unicode="&#xe081;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" />
<glyph unicode="&#xe082;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" />
<glyph unicode="&#xe083;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" />
<glyph unicode="&#xe084;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" />
<glyph unicode="&#xe085;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" />
<glyph unicode="&#xe086;" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" />
<glyph unicode="&#xe087;" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" />
<glyph unicode="&#xe088;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" />
<glyph unicode="&#xe089;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" />
<glyph unicode="&#xe090;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" />
<glyph unicode="&#xe092;" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" />
<glyph unicode="&#xe093;" d="M1098 600h-298v-600h-300v600h-296l450 600z" />
<glyph unicode="&#xe094;" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" />
<glyph unicode="&#xe095;" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" />
<glyph unicode="&#xe096;" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" />
<glyph unicode="&#xe097;" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" />
<glyph unicode="&#xe101;" d="M600 1177q118 0 224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" />
<glyph unicode="&#xe102;" d="M1200 900h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" />
<glyph unicode="&#xe103;" d="M0 121l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55l-201 -202 v143zM692 611q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5t86.5 76.5q55 66 367 234z" />
<glyph unicode="&#xe105;" d="M1261 600l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" />
<glyph unicode="&#xe106;" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" />
<glyph unicode="&#xe107;" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" />
<glyph unicode="&#xe108;" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" />
<glyph unicode="&#xe110;" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" />
<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
<glyph unicode="&#xe112;" d="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" />
<glyph unicode="&#xe113;" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" />
<glyph unicode="&#xe114;" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" />
<glyph unicode="&#xe115;" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" />
<glyph unicode="&#xe116;" d="M1050 1200h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z" />
<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
<glyph unicode="&#xe118;" d="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" />
<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
<glyph unicode="&#xe120;" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" />
<glyph unicode="&#xe121;" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe122;" d="M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" />
<glyph unicode="&#xe124;" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" />
<glyph unicode="&#xe125;" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" />
<glyph unicode="&#xe126;" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" />
<glyph unicode="&#xe127;" d="M364 873l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83zM208 200h-200v600h200v-600z" />
<glyph unicode="&#xe128;" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" />
<glyph unicode="&#xe129;" d="M1100 473v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" />
<glyph unicode="&#xe130;" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146l-83 86l237 339h503z" />
<glyph unicode="&#xe131;" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" />
<glyph unicode="&#xe132;" d="M597 1195q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" />
<glyph unicode="&#xe133;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" />
<glyph unicode="&#xe135;" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7 q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
<glyph unicode="&#xe138;" d="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe140;" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" />
<glyph unicode="&#xe141;" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" />
<glyph unicode="&#xe143;" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" />
<glyph unicode="&#xe144;" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" />
<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" />
<glyph unicode="&#xe148;" d="M700 1029v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" />
<glyph unicode="&#xe149;" d="M866 300l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" />
<glyph unicode="&#xe150;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" />
<glyph unicode="&#xe152;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" />
<glyph unicode="&#xe154;" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" />
<glyph unicode="&#xe155;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
<glyph unicode="&#xe156;" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
<glyph unicode="&#xe157;" d="M400 1100h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" />
<glyph unicode="&#xe158;" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" />
<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" />
<glyph unicode="&#xe160;" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" />
<glyph unicode="&#xe161;" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" />
<glyph unicode="&#xe162;" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" />
<glyph unicode="&#xe163;" d="M800 200h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" />
<glyph unicode="&#xe164;" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" />
<glyph unicode="&#xe165;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
<glyph unicode="&#xe166;" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe167;" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe168;" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe169;" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe170;" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe171;" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" />
<glyph unicode="&#xe173;" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" />
<glyph unicode="&#xe174;" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" />
<glyph unicode="&#xe175;" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" />
<glyph unicode="&#xe176;" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" />
<glyph unicode="&#xe177;" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" />
<glyph unicode="&#xe178;" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" />
<glyph unicode="&#xe179;" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" />
<glyph unicode="&#xe180;" d="M1100 106v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" />
<glyph unicode="&#xe181;" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" />
<glyph unicode="&#xe182;" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" />
<glyph unicode="&#xe183;" d="M1200 712v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" />
<glyph unicode="&#xe184;" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" />
<glyph unicode="&#xe185;" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" />
<glyph unicode="&#xe186;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe187;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe188;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" />
<glyph unicode="&#xe189;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" />
<glyph unicode="&#xe191;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" />
<glyph unicode="&#xe192;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z" />
<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" />
<glyph unicode="&#xe194;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
<glyph unicode="&#xe195;" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" />
<glyph unicode="&#xe197;" d="M800 300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" />
<glyph unicode="&#xe198;" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" />
<glyph unicode="&#xe199;" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" />
<glyph unicode="&#xe200;" d="M700 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" />
<glyph unicode="&#x1f4bc;" d="M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
<glyph unicode="&#x1f4c5;" d="M1100 900v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" />
<glyph unicode="&#x1f4cc;" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" />
<glyph unicode="&#x1f4ce;" d="M518 119l69 -60l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348 q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256z" />
<glyph unicode="&#x1f4f7;" d="M1200 200v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" />
<glyph unicode="&#x1f512;" d="M900 800h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
<glyph unicode="&#x1f514;" d="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" />
<glyph unicode="&#x1f516;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#x1f525;" d="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5z" />
<glyph unicode="&#x1f527;" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" />
<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
</font>
</defs></svg>
</defs></svg>

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

BIN
rd_ui/app/fonts/glyphicons-halflings-regular.ttf Normal file → Executable file

Binary file not shown.

BIN
rd_ui/app/fonts/glyphicons-halflings-regular.woff Normal file → Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,593 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="robotobold" horiz-adv-x="1156" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="510" />
<glyph unicode="&#xfb01;" horiz-adv-x="1249" d="M20 877v205h161v74q0 204 124.5 314.5t350.5 110.5q78 0 154 -15.5t176 -44.5l-42 -230q-73 22 -132.5 34t-136.5 12q-101 0 -151.5 -46t-50.5 -135v-74h213v-205h-213v-877h-292v877h-161zM829 0v1082h292v-1082h-292z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="510" />
<glyph unicode=" " horiz-adv-x="510" />
<glyph unicode="&#x09;" horiz-adv-x="510" />
<glyph unicode="&#xa0;" horiz-adv-x="510" />
<glyph unicode="!" horiz-adv-x="557" d="M134 0v256h292v-256h-292zM134 502v954h292v-954h-292z" />
<glyph unicode="&#x22;" horiz-adv-x="656" d="M50 1039v524h230v-275l-102 -249h-128zM376 1039v524h230v-275l-102 -249h-128z" />
<glyph unicode="#" horiz-adv-x="1219" d="M48 410v169h256l51 290h-232v171h262l73 416h183l-73 -416h192l74 416h183l-73 -416h220v-171h-250l-51 -290h225v-169h-254l-72 -410h-184l72 410h-192l-71 -410h-184l72 410h-227zM488 579h191l51 290h-192z" />
<glyph unicode="$" horiz-adv-x="1175" d="M96 449l2 5h285q0 -134 61.5 -192t156.5 -58q91 0 139.5 48.5t48.5 130.5q0 81 -46.5 132t-159.5 95q-222 81 -329.5 180.5t-107.5 280.5q0 168 107.5 275.5t289.5 126.5v215h159v-217q176 -26 276.5 -147t98.5 -314l-3 -5h-285q0 118 -48.5 182t-132.5 64 q-86 0 -128 -49.5t-42 -131.5q0 -78 44.5 -126.5t163.5 -95.5q221 -87 327.5 -186t106.5 -277q0 -174 -107 -278t-291 -123v-198h-159v197q-187 19 -309 132.5t-118 333.5z" />
<glyph unicode="%" horiz-adv-x="1513" d="M95 1099v77q0 129 83.5 215t232.5 86q151 0 234 -85.5t83 -215.5v-77q0 -129 -83 -214t-232 -85q-150 0 -234 85t-84 214zM289 1099q0 -58 32 -97.5t92 -39.5q58 0 89.5 39.5t31.5 97.5v77q0 58 -32 98.5t-91 40.5t-90.5 -40.5t-31.5 -98.5v-77zM319 184l711 1138 l142 -75l-711 -1138zM791 280v77q0 128 84 214t233 86q150 0 233.5 -85.5t83.5 -214.5v-77q0 -130 -83 -215t-232 -85q-150 0 -234.5 85.5t-84.5 214.5zM985 280q0 -57 34.5 -97.5t90.5 -40.5q65 0 93 37.5t28 100.5v77q0 57 -32 97.5t-91 40.5q-60 0 -91.5 -40.5 t-31.5 -97.5v-77z" />
<glyph unicode="&#x26;" horiz-adv-x="1346" d="M61 392q0 118 65 203.5t198 178.5q-68 92 -101.5 168t-33.5 155q0 173 108 276.5t289 103.5q159 0 258.5 -98.5t99.5 -238.5q0 -98 -49 -179t-134 -142l-93 -66l276 -322q36 60 56 130t20 148h218q0 -138 -34 -254t-104 -206l208 -244l-2 -5h-324l-77 89 q-85 -55 -175 -82.5t-193 -27.5q-218 0 -347 114.5t-129 298.5zM353 407q0 -89 55 -146.5t144 -57.5q53 0 106 13.5t102 40.5l-300 348l-19 -13q-51 -48 -69.5 -93.5t-18.5 -91.5zM450 1100q0 -43 21.5 -88.5t64.5 -100.5l86 56q56 36 75.5 74t19.5 83q0 50 -36.5 89 t-95.5 39q-65 0 -100 -43.5t-35 -108.5z" />
<glyph unicode="'" horiz-adv-x="330" d="M50 1008v552h230v-269l-102 -283h-128z" />
<glyph unicode="(" horiz-adv-x="711" d="M124 570v22q0 392 152 665.5t344 354.5h6l53 -146q-131 -98 -220 -316t-89 -556v-26q0 -339 89 -556.5t220 -318.5l-53 -143h-6q-192 81 -344 354t-152 666z" />
<glyph unicode=")" horiz-adv-x="713" d="M31 -307q129 98 219 317t90 558v26q0 336 -91 556.5t-218 319.5l54 142h6q194 -80 352.5 -359t158.5 -661v-22q0 -383 -158.5 -661.5t-352.5 -358.5h-6z" />
<glyph unicode="*" horiz-adv-x="908" d="M27 1055l57 177l297 -123l-18 347h187l-19 -353l291 120l56 -180l-306 -89l200 -265l-152 -110l-174 290l-173 -281l-153 106l209 272z" />
<glyph unicode="+" horiz-adv-x="1117" d="M56 560v252h362v394h276v-394h360v-252h-360v-414h-276v414h-362z" />
<glyph unicode="," horiz-adv-x="528" d="M63 -302l70 324v228h284v-237l-159 -315h-195z" />
<glyph unicode="-" horiz-adv-x="801" d="M113 510v225h564v-225h-564z" />
<glyph unicode="." horiz-adv-x="596" d="M144 0v256h292v-256h-292z" />
<glyph unicode="/" horiz-adv-x="825" d="M-14 -125l534 1581h284l-534 -1581h-284z" />
<glyph unicode="0" horiz-adv-x="1175" d="M95 567v321q0 288 132.5 438.5t359.5 150.5q226 0 359.5 -150.5t133.5 -438.5v-321q0 -289 -132.5 -438.5t-358.5 -149.5q-228 0 -361 149.5t-133 438.5zM386 539q0 -176 51.5 -256t151.5 -80q98 0 149 80t51 256v379q0 173 -52 253.5t-150 80.5q-99 0 -150 -80t-51 -254 v-379z" />
<glyph unicode="1" horiz-adv-x="1175" d="M171 1198v206l588 52v-1456h-292v1198h-296z" />
<glyph unicode="2" horiz-adv-x="1175" d="M76 1007q-5 197 129.5 333.5t362.5 136.5q225 0 353.5 -117t128.5 -312q0 -132 -72.5 -243.5t-239.5 -292.5l-259 -283l2 -5h612v-224h-994v191l471 505q102 117 145 197.5t43 149.5q0 92 -49.5 150.5t-140.5 58.5q-101 0 -153.5 -68.5t-52.5 -182.5h-284z" />
<glyph unicode="3" horiz-adv-x="1175" d="M70 390l2 6h283q0 -84 60 -138.5t152 -54.5q101 0 159.5 56t58.5 152q0 115 -57.5 168.5t-169.5 53.5h-164v219h164q104 0 154 54.5t50 151.5q0 88 -50 141t-145 53q-82 0 -138 -48t-56 -126h-283l-2 6q-6 171 131 282t340 111q226 0 360.5 -108t134.5 -308 q0 -95 -60 -180.5t-165 -133.5q121 -43 184.5 -132t63.5 -207q0 -200 -145.5 -314.5t-372.5 -114.5q-203 0 -348.5 107.5t-140.5 303.5z" />
<glyph unicode="4" horiz-adv-x="1175" d="M57 491l604 965h294v-914h165v-226h-165v-316h-291v316h-594zM329 542h335v524l-6 2l-23 -41z" />
<glyph unicode="5" horiz-adv-x="1175" d="M110 390l2 5l281 14q0 -97 55 -151.5t144 -54.5q102 0 150.5 72.5t48.5 189.5q0 126 -52 202t-154 76q-84 0 -128.5 -31t-63.5 -84l-257 17l84 811h812v-234h-573l-40 -336q40 30 97 49.5t126 20.5q210 3 325.5 -127t115.5 -362q0 -210 -126.5 -349t-364.5 -139 q-201 0 -344 109.5t-138 301.5z" />
<glyph unicode="6" horiz-adv-x="1175" d="M99 569v284q0 286 165 455t420 169q82 0 151.5 -15.5t139.5 -45.5l-52 -214q-66 23 -117.5 34.5t-119.5 11.5q-133 0 -213.5 -99.5t-74.5 -275.5l3 -5q49 51 124 80t169 29q195 0 305.5 -138.5t110.5 -353.5q0 -220 -136.5 -363t-353.5 -143q-231 0 -376 156.5 t-145 433.5zM391 562q0 -173 62.5 -266t166.5 -93q90 0 144.5 82.5t54.5 199.5q0 121 -55 196t-147 75q-81 0 -138 -26t-88 -71v-97z" />
<glyph unicode="7" horiz-adv-x="1175" d="M60 1231v225h1029v-225q-234 -274 -319.5 -511t-122.5 -572l-14 -148h-292l14 148q34 321 146 589.5t307 493.5h-748z" />
<glyph unicode="8" horiz-adv-x="1175" d="M91 398q0 118 66.5 208.5t183.5 140.5q-102 47 -159 130.5t-57 192.5q0 194 127 300.5t335 106.5q207 0 335 -106.5t128 -300.5q0 -109 -57.5 -193t-158.5 -131q116 -49 183 -140t67 -208q0 -202 -137 -310.5t-358 -108.5q-223 0 -360.5 108.5t-137.5 310.5zM384 418 q0 -100 56 -157.5t149 -57.5q91 0 147 58t56 157q0 98 -57 157t-148 59q-92 0 -147.5 -59t-55.5 -157zM417 1057q0 -91 45.5 -144.5t126.5 -53.5q79 0 124.5 53.5t45.5 144.5q0 88 -46.5 141.5t-125.5 53.5q-80 0 -125 -52.5t-45 -142.5z" />
<glyph unicode="9" horiz-adv-x="1175" d="M82 970q0 218 138 362.5t351 144.5q223 0 362 -153.5t139 -431.5v-344q0 -265 -155.5 -417t-396.5 -152q-76 0 -156.5 15.5t-149.5 45.5l34 211q65 -25 128.5 -36.5t143.5 -11.5q115 0 187.5 85.5t72.5 244.5v72q-49 -62 -116.5 -94t-145.5 -32q-203 0 -319.5 132.5 t-116.5 358.5zM373 970q0 -124 50.5 -200.5t143.5 -76.5q72 0 126 27t87 72v134q0 160 -56 243t-152 83q-88 0 -143.5 -82t-55.5 -200z" />
<glyph unicode=":" horiz-adv-x="582" d="M144 0v256h292v-256h-292zM144 876v256h292v-256h-292z" />
<glyph unicode=";" horiz-adv-x="562" d="M114 -302l70 324v228h284v-237l-159 -315h-195zM145 876v256h292v-256h-292z" />
<glyph unicode="&#x3c;" horiz-adv-x="1043" d="M54 436v227l862 366v-272l-577 -207v-6l577 -203v-272z" />
<glyph unicode="=" horiz-adv-x="1181" d="M136 332v229h896v-229h-896zM136 763v229h896v-229h-896z" />
<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M119 69v270l586 209v6l-586 206v269l872 -366v-227z" />
<glyph unicode="?" horiz-adv-x="1021" d="M32 1081q-3 192 126.5 294t337.5 102q224 0 351.5 -113.5t127.5 -308.5q0 -127 -74.5 -235t-186.5 -181q-61 -47 -80 -94.5t-19 -130.5h-291q1 140 41.5 205t161.5 158q71 58 113.5 125t42.5 150q0 92 -48.5 144t-138.5 52q-74 0 -125.5 -44t-52.5 -129h-284zM323 0v250 h294v-250h-294z" />
<glyph unicode="@" horiz-adv-x="1817" d="M66 478q18 427 255.5 683.5t625.5 256.5q387 0 593 -242.5t190 -662.5q-9 -218 -128 -376t-356 -158q-78 0 -135 44t-81 123q-44 -82 -109.5 -123t-153.5 -41q-141 0 -216.5 119t-55.5 315q25 254 143.5 407t287.5 153q116 0 186.5 -26t154.5 -80l-3 -4h5l-51 -573 q-7 -95 14 -130t57 -35q115 0 184.5 109t77.5 276q16 353 -136.5 551t-471.5 198q-303 0 -484 -213t-196 -571q-17 -355 146 -560t469 -205q85 0 175.5 20t155.5 50l38 -147q-67 -42 -170.5 -65.5t-202.5 -23.5q-396 0 -610.5 249t-197.5 682zM720 416q-10 -127 18.5 -192.5 t92.5 -65.5q56 0 101.5 26t81.5 96v6.5t1 6.5l44 496q-23 7 -46 11t-48 4q-111 0 -169 -96.5t-76 -291.5z" />
<glyph unicode="A" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM478 543h367l-180 572h-6z" />
<glyph unicode="B" horiz-adv-x="1314" d="M136 0v1456h492q257 0 401 -100t144 -299q0 -101 -53.5 -180.5t-155.5 -119.5q131 -28 196.5 -120t65.5 -213q0 -209 -138 -316.5t-391 -107.5h-561zM428 224h269q116 0 177 50.5t61 149.5q0 107 -52 163.5t-164 56.5h-291v-420zM428 846h210q117 0 180 48t63 140 q0 101 -63.5 149t-189.5 48h-200v-385z" />
<glyph unicode="C" horiz-adv-x="1309" d="M93 583v289q0 265 160 435t416 170q270 -1 422 -139q148 -135 148 -365v-12l-2 -6h-284q0 144 -69 220.5t-215 76.5q-131 0 -208 -106.5t-77 -271.5v-291q0 -167 81 -273.5t219 -106.5q137 0 202.5 73.5t65.5 218.5h283l2 -6v-12q1 -227 -143 -361q-148 -138 -410 -137 q-263 0 -427 169t-164 435z" />
<glyph unicode="D" horiz-adv-x="1342" d="M136 0v1456h500q267 0 440 -170.5t173 -437.5v-241q0 -268 -173 -437.5t-440 -169.5h-500zM428 224h193q157 0 246 106t89 277v243q0 169 -89 275t-246 106h-193v-1007z" />
<glyph unicode="E" horiz-adv-x="1176" d="M136 0v1456h995v-225h-703v-366h603v-225h-603v-416h705v-224h-997z" />
<glyph unicode="F" horiz-adv-x="1182" d="M136 0v1456h1004v-225h-712v-401h610v-225h-610v-605h-292z" />
<glyph unicode="G" horiz-adv-x="1369" d="M99 576v304q0 264 162.5 430.5t418.5 166.5q266 0 407.5 -129.5t144.5 -340.5l-2 -6h-275q-8 116 -74 183.5t-193 67.5q-134 0 -216 -103.5t-82 -266.5v-306q0 -166 85 -269.5t229 -103.5q102 0 164 21t94 52v270h-258v202h550v-549q-65 -86 -202.5 -153t-347.5 -67 q-267 0 -436 166t-169 431z" />
<glyph unicode="H" horiz-adv-x="1450" d="M136 0v1456h292v-626h594v626h291v-1456h-291v605h-594v-605h-292z" />
<glyph unicode="I" horiz-adv-x="601" d="M154 0v1456h292v-1456h-292z" />
<glyph unicode="J" horiz-adv-x="1169" d="M63 417l2 6h284q0 -115 55 -167.5t148 -52.5q81 0 137.5 62.5t56.5 171.5v1019h291v-1019q0 -211 -137.5 -334.5t-347.5 -123.5q-228 0 -361 111q-128 107 -128 311v16z" />
<glyph unicode="K" horiz-adv-x="1323" d="M136 0v1456h292v-595h127l386 595h357l-490 -678l529 -778h-356l-391 608h-162v-608h-292z" />
<glyph unicode="L" horiz-adv-x="1108" d="M136 0v1456h292v-1232h648v-224h-940z" />
<glyph unicode="M" horiz-adv-x="1787" d="M136 0v1456h381l371 -1073h6l374 1073h382v-1456h-292v434l28 643l-6 1l-390 -1078h-196l-388 1074l-6 -1l28 -639v-434h-292z" />
<glyph unicode="N" horiz-adv-x="1450" d="M136 0v1456h292l588 -994l6 1v993h291v-1456h-291l-588 995l-6 -1v-994h-292z" />
<glyph unicode="O" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264q0 170 -85 279t-234 109t-231 -108.5t-82 -279.5v-264z" />
<glyph unicode="P" horiz-adv-x="1334" d="M136 0v1456h580q251 0 395 -128t144 -337t-144 -336t-395 -127h-288v-528h-292zM428 753h288q122 0 185 66.5t63 169.5q0 105 -62.5 173.5t-185.5 68.5h-288v-478z" />
<glyph unicode="Q" horiz-adv-x="1433" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -132 -43 -244.5t-123 -195.5l241 -236l-191 -156l-262 254q-54 -19 -112 -29.5t-120 -10.5q-269 0 -437 175t-168 443zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264 q0 170 -85 279t-234 109t-231 -108.5t-82 -279.5v-264z" />
<glyph unicode="R" horiz-adv-x="1354" d="M136 0v1456h549q249 0 389.5 -113.5t140.5 -316.5q0 -113 -59 -194t-173 -131q129 -38 185.5 -127t56.5 -220v-107q0 -61 16.5 -127.5t56.5 -98.5v-21h-301q-40 32 -52 107t-12 142v103q0 109 -59.5 169.5t-167.5 60.5h-278v-582h-292zM428 807h252q123 0 183.5 52 t60.5 154q0 100 -60.5 159t-178.5 59h-257v-424z" />
<glyph unicode="S" horiz-adv-x="1299" d="M90 445l2 6h284q0 -130 79.5 -190.5t221.5 -60.5q119 0 182 49t63 131q0 84 -59.5 135t-208.5 96q-260 75 -393 178t-133 282t152.5 292.5t389.5 113.5q240 1 391 -127q146 -123 146 -303v-12l-2 -6h-283q0 101 -67.5 163.5t-189.5 62.5q-117 0 -181 -52t-64 -133 q0 -74 68.5 -121.5t236.5 -100.5q241 -67 365 -177t124 -289q0 -187 -147.5 -295t-389.5 -108q-238 1 -415 123q-172 119 -172 331v12z" />
<glyph unicode="T" horiz-adv-x="1169" d="M28 1231v225h1114v-225h-412v-1231h-292v1231h-410z" />
<glyph unicode="U" horiz-adv-x="1407" d="M120 490v966h293v-966q0 -144 77 -215.5t212 -71.5q137 0 215 71t78 216v966h293v-966q0 -245 -162 -378t-424 -133q-261 0 -421.5 133t-160.5 378z" />
<glyph unicode="V" horiz-adv-x="1303" d="M7 1456h308l315 -1069l18 -79h6l17 77l317 1071h308l-495 -1456h-300z" />
<glyph unicode="W" horiz-adv-x="1815" d="M24 1456h286l209 -997l6 -1l273 998h215l275 -998h6l208 998h285l-340 -1456h-271l-267 961h-6l-267 -961h-271z" />
<glyph unicode="X" horiz-adv-x="1303" d="M31 0l443 734l-432 722h338l269 -516l273 516h340l-432 -722l457 -734h-353l-281 525l-281 -525h-341z" />
<glyph unicode="Y" horiz-adv-x="1292" d="M5 1456h320l318 -671h6l318 671h320l-500 -944v-512h-291v527z" />
<glyph unicode="Z" horiz-adv-x="1206" d="M77 0v152l692 1079h-691v225h1047v-146l-695 -1086h712v-224h-1065z" />
<glyph unicode="[" horiz-adv-x="570" d="M119 -336v2027h434v-216h-141v-1595h141v-216h-434z" />
<glyph unicode="\" horiz-adv-x="863" d="M2 1456h289l608 -1581h-289z" />
<glyph unicode="]" horiz-adv-x="570" d="M13 -120h142v1595h-142v216h434v-2027h-434v216z" />
<glyph unicode="^" horiz-adv-x="896" d="M44 729l299 727h212l299 -727h-231l-165 413l-8 34h-6l-7 -34l-162 -413h-231z" />
<glyph unicode="_" horiz-adv-x="914" d="M1 0h910v-219h-910v219z" />
<glyph unicode="`" horiz-adv-x="678" d="M77 1472l2 6h309l197 -266h-237z" />
<glyph unicode="a" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6v14q0 128 119 222q126 100 331 100q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5z" />
<glyph unicode="b" d="M112 0v1560h291v-593q47 65 112.5 100t150.5 35q206 0 314 -155.5t108 -414.5v-21q0 -242 -108 -387t-312 -145q-94 0 -164.5 39.5t-119.5 115.5l-22 -134h-250zM403 307q27 -49 74.5 -75t116.5 -26q113 0 158 79.5t45 225.5v21q0 158 -46.5 250.5t-158.5 92.5 q-68 0 -115 -28.5t-74 -81.5v-458z" />
<glyph unicode="c" horiz-adv-x="1060" d="M62 525v30q0 239 130.5 393t372.5 154q201 0 323 -114q119 -110 118 -288v-12l-2 -6h-266q0 84 -46 139.5t-127 55.5q-116 0 -163.5 -90t-47.5 -232v-30q0 -145 47.5 -233.5t164.5 -88.5q78 0 125 45.5t47 121.5h265l3 -6v-10q0 -156 -124 -264q-128 -110 -316 -111 q-242 0 -373 153t-131 393z" />
<glyph unicode="d" d="M67 511v21q0 256 110.5 413t311.5 157q81 0 146 -35t114 -100v593h293v-1560h-251l-24 132q-51 -75 -120.5 -114t-159.5 -39q-199 0 -309.5 146t-110.5 386zM358 511q0 -142 48 -223.5t156 -81.5q63 0 110 25.5t77 74.5v461q-30 51 -76.5 79.5t-108.5 28.5 q-107 0 -156.5 -95t-49.5 -248v-21z" />
<glyph unicode="e" horiz-adv-x="1084" d="M77 510v40q1 241 133 397q132 155 352 155h3q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-234 0 -374 150t-140 381zM379 652l3 -5h358v26q0 93 -43.5 148.5t-131.5 55.5 q-81 0 -128 -62t-58 -163z" />
<glyph unicode="f" horiz-adv-x="732" d="M27 877v205h161v120q0 182 105 280.5t295 98.5q37 0 75.5 -5.5t84.5 -15.5l-25 -217q-24 4 -46.5 7t-52.5 3q-71 0 -107.5 -39t-36.5 -112v-120h215v-205h-215v-877h-292v877h-161z" />
<glyph unicode="g" d="M67 511v21q0 256 111.5 413t312.5 157q91 0 160 -41t118 -117l23 138h252v-1077q0 -211 -138.5 -326.5t-385.5 -115.5q-82 0 -174 22.5t-170 61.5l54 218q67 -32 136.5 -48.5t151.5 -16.5q120 0 176.5 50t56.5 156v98q-48 -61 -113 -93t-149 -32q-199 0 -310.5 146.5 t-111.5 385.5zM359 511q0 -142 48 -223.5t156 -81.5q67 0 113.5 24.5t74.5 71.5v470q-28 49 -74.5 76t-111.5 27q-107 0 -156.5 -95t-49.5 -248v-21z" />
<glyph unicode="h" d="M105 0v1560h292v-615q51 74 125 115.5t164 41.5q169 0 265.5 -112.5t96.5 -347.5v-642h-292v644q0 126 -44.5 178.5t-132.5 52.5q-60 0 -106 -21.5t-76 -60.5v-793h-292z" />
<glyph unicode="i" horiz-adv-x="547" d="M127 0v1082h292v-1082h-292zM127 1341v219h292v-219h-292z" />
<glyph unicode="j" horiz-adv-x="543" d="M-98 -420l14 223q23 -6 46 -9t49 -3q59 0 91 41.5t32 127.5v1122h293v-1122q0 -190 -101 -293.5t-281 -103.5q-40 0 -73 4t-70 13zM128 1343v217h293v-217h-293z" />
<glyph unicode="k" horiz-adv-x="1097" d="M112 0v1560h292v-885h72l251 407h338l-346 -490l399 -592h-335l-299 453h-80v-453h-292z" />
<glyph unicode="l" horiz-adv-x="547" d="M127 0v1560h292v-1560h-292z" />
<glyph unicode="m" horiz-adv-x="1772" d="M112 0v1082h271l12 -143q52 78 130.5 120.5t181.5 42.5q104 0 178 -46t112 -139q50 87 130 136t188 49q160 0 252.5 -110.5t92.5 -336.5v-655h-292v656q0 123 -40 171t-119 48q-62 0 -107.5 -27.5t-72.5 -76.5q0 -19 1 -32.5t1 -27.5v-711h-291v656q0 120 -40 169.5 t-120 49.5q-59 0 -103.5 -22.5t-73.5 -63.5v-789h-291z" />
<glyph unicode="n" d="M107 0v1082h272l13 -155q54 83 133 129t177 46q164 0 256 -103t92 -323v-676h-293v675q0 109 -44 154.5t-133 45.5q-58 0 -104 -23.5t-77 -66.5v-785h-292z" />
<glyph unicode="o" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91q-113 0 -165.5 -91.5t-52.5 -234.5 v-21z" />
<glyph unicode="p" d="M112 -416v1498h263l17 -128q48 71 115.5 109.5t157.5 38.5q201 0 312 -157t111 -413v-21q0 -240 -111 -386t-310 -146q-85 0 -151 31.5t-113 92.5v-519h-291zM403 297q27 -46 73.5 -70t114.5 -24q106 0 155.5 83t49.5 225v21q0 153 -51 248t-156 95q-66 0 -112.5 -27 t-73.5 -77v-474z" />
<glyph unicode="q" d="M67 511v21q0 256 110.5 413t311.5 157q90 0 158 -39.5t117 -113.5l27 133h248v-1498h-292v517q-48 -60 -112.5 -91t-147.5 -31q-199 0 -309.5 146t-110.5 386zM358 511q0 -142 48 -225t156 -83q64 0 110 24t75 70v480q-29 48 -74.5 74t-108.5 26q-107 0 -156.5 -96 t-49.5 -249v-21z" />
<glyph unicode="r" horiz-adv-x="717" d="M112 0v1082h271l13 -160q38 85 98.5 132.5t139.5 47.5q22 0 40.5 -3.5t37.5 -8.5l-31 -259l-107 3q-65 0 -107 -27t-64 -76v-731h-291z" />
<glyph unicode="s" horiz-adv-x="1056" d="M64 338l2 6h267q3 -87 57 -126t141 -39q81 0 123.5 32t42.5 87q0 48 -46.5 83t-172.5 62q-192 39 -289.5 115.5t-97.5 208.5q0 140 117.5 237.5t314.5 97.5q207 0 329 -97q118 -93 118 -233v-12l-2 -6h-282q0 65 -41.5 106t-121.5 41q-71 0 -111.5 -34.5t-40.5 -86.5 q0 -50 42.5 -82t172.5 -57q200 -40 297 -117.5t97 -213.5q0 -146 -125 -238.5t-330 -92.5q-215 -1 -341 109q-120 105 -120 237v13z" />
<glyph unicode="t" horiz-adv-x="715" d="M9 877v205h158v265h292v-265h182v-205h-182v-551q0 -63 26 -90t70 -27q23 0 39.5 2.5t38.5 8.5l25 -211q-44 -15 -86 -22.5t-91 -7.5q-151 0 -232.5 83t-81.5 263v552h-158z" />
<glyph unicode="u" d="M105 429v653h291v-655q0 -118 40 -169.5t118 -51.5q70 0 120 22.5t82 66.5v787h292v-1082h-249l-26 156q-50 -85 -127 -131t-177 -46q-171 0 -267.5 109.5t-96.5 340.5z" />
<glyph unicode="v" horiz-adv-x="1046" d="M16 1082h305l182 -679l19 -100h6l20 100l178 679h305l-368 -1082h-279z" />
<glyph unicode="w" horiz-adv-x="1507" d="M29 1082h274l143 -693h6l202 693h195l204 -695h6l141 695h274l-275 -1082h-244l-201 644h-6l-201 -644h-243z" />
<glyph unicode="x" horiz-adv-x="1046" d="M19 0l337 547l-327 535h328l162 -344h6l166 344h330l-326 -535l337 -547h-329l-177 359l-177 -359h-330z" />
<glyph unicode="y" horiz-adv-x="1046" d="M5 1082h314l183 -628l12 -60h6l207 688h314l-439 -1244q-46 -116 -125 -195.5t-237 -79.5q-37 0 -68.5 6t-76.5 17l34 213q13 -2 28 -4t27 -2q72 0 111 35.5t60 88.5l34 84z" />
<glyph unicode="z" horiz-adv-x="1046" d="M75 0v172l515 684h-499v226h866v-167l-519 -691h536v-224h-899z" />
<glyph unicode="{" horiz-adv-x="676" d="M48 518v201q90 0 133.5 54.5t43.5 155.5v203q0 171 82.5 290.5t277.5 174.5l56 -157q-85 -31 -120 -110.5t-35 -197.5v-203q0 -104 -44.5 -184.5t-134.5 -125.5q90 -47 134.5 -127.5t44.5 -182.5v-203q0 -118 35 -197.5t120 -110.5l-56 -158q-195 55 -277.5 175 t-82.5 291v203q0 99 -43.5 154t-133.5 55z" />
<glyph unicode="|" horiz-adv-x="519" d="M173 -270v1726h176v-1726h-176z" />
<glyph unicode="}" horiz-adv-x="676" d="M34 -202q85 31 120 110.5t35 197.5v203q0 104 46 184t140 125q-94 45 -140 125.5t-46 185.5v203q0 118 -35 197.5t-120 110.5l56 157q194 -55 277 -174.5t83 -290.5v-203q0 -101 43 -155.5t135 -54.5v-201q-92 0 -135 -55t-43 -154v-203q0 -171 -83 -291t-277 -175z" />
<glyph unicode="~" horiz-adv-x="1327" d="M105 448q0 162 86.5 269.5t223.5 107.5q83 0 158.5 -33.5t151.5 -99.5q49 -45 86.5 -64.5t81.5 -19.5q50 0 87 52t37 125l203 -27q0 -161 -88.5 -270.5t-223.5 -109.5q-85 0 -157 31.5t-150 101.5q-52 44 -89.5 64t-81.5 20q-52 0 -87.5 -51t-35.5 -122z" />
<glyph unicode="&#xa1;" horiz-adv-x="580" d="M142 -374v953h292v-953h-292zM142 825v257h292v-257h-292z" />
<glyph unicode="&#xa2;" horiz-adv-x="1181" d="M72 525v30q0 218 110.5 367.5t317.5 174.5v221h200v-229q148 -34 235 -141.5t87 -265.5h-274q0 84 -46 139.5t-127 55.5q-116 0 -163.5 -90t-47.5 -232v-30q0 -145 47.5 -233.5t164.5 -88.5q78 0 125 45.5t47 121.5h267l2 -5q3 -135 -85.5 -237t-231.5 -135v-238h-200 v229q-207 23 -317.5 172.5t-110.5 368.5z" />
<glyph unicode="&#xa3;" horiz-adv-x="1216" d="M92 588v225h155l-8 214q0 210 120.5 330t322.5 120q215 0 333.5 -111.5t114.5 -294.5l-2 -6h-284q0 96 -46 141.5t-117 45.5q-70 0 -110 -58.5t-40 -166.5l10 -214h355v-225h-345l4 -85q0 -78 -30 -150t-86 -129h713v-224h-996v224h10q47 12 70.5 95t23.5 171l-4 98h-164 z" />
<glyph unicode="&#xa4;" horiz-adv-x="1417" d="M80 118l135 137q-49 76 -74.5 165.5t-25.5 187.5q0 101 28 194t81 171l-144 147l141 144l142 -145q74 55 162.5 85t185.5 30q96 0 185 -30.5t164 -86.5l144 148l142 -145l-148 -151q51 -78 79 -169.5t28 -191.5q0 -97 -25.5 -185.5t-72.5 -163.5l139 -141l-142 -145 l-132 134q-77 -62 -169 -94.5t-192 -32.5q-101 0 -193.5 32.5t-167.5 93.5l-129 -132zM301 608q0 -185 119 -312t291 -127q170 0 289.5 127.5t119.5 311.5q0 183 -119.5 310t-289.5 127q-172 0 -291 -127t-119 -310z" />
<glyph unicode="&#xa5;" horiz-adv-x="1253" d="M22 1456h321l280 -608h6l281 608h320l-382 -714h244v-200h-324v-110h324v-200h-324v-232h-292v232h-339v200h339v110h-339v200h267z" />
<glyph unicode="&#xa6;" horiz-adv-x="517" d="M127 -270v795h262v-795h-262zM127 698v758h262v-758h-262z" />
<glyph unicode="&#xa7;" horiz-adv-x="1287" d="M94 536q0 89 42 158t121 113q-69 50 -103 120.5t-34 168.5q0 172 141.5 276.5t378.5 104.5q243 0 380.5 -111t132.5 -311l-2 -6h-283q0 88 -60 145.5t-168 57.5q-114 0 -171 -43.5t-57 -110.5q0 -75 55.5 -113.5t232.5 -86.5q247 -64 363.5 -157.5t116.5 -265.5 q0 -91 -42 -159t-121 -111q68 -51 102.5 -121t34.5 -168q0 -177 -140 -277t-377 -100q-232 0 -387.5 99.5t-150.5 317.5l2 6l283 1q0 -106 72.5 -152t180.5 -46q107 0 166.5 41.5t59.5 108.5t-61 107.5t-230 90.5q-244 64 -361 157.5t-117 265.5zM385 562q0 -80 55.5 -121.5 t232.5 -93.5q34 -10 68.5 -20t69.5 -21q39 22 60.5 59t21.5 85q0 71 -62 116t-232 97q-40 10 -74 21t-65 22q-38 -22 -56.5 -59t-18.5 -85z" />
<glyph unicode="&#xa8;" horiz-adv-x="1090" d="M156 1252v204h266v-204h-266zM656 1252v204h266v-204h-266z" />
<glyph unicode="&#xa9;" horiz-adv-x="1606" d="M86 729q0 315 207 531t503 216q295 0 502.5 -216t207.5 -531q0 -316 -208 -533t-502 -217q-296 0 -503 217t-207 533zM208 729q0 -264 171.5 -444.5t416.5 -180.5q244 0 415.5 180.5t171.5 444.5q0 263 -171.5 442.5t-415.5 179.5q-246 0 -417 -179.5t-171 -442.5z M433 669v119q0 173 94.5 280t254.5 107q157 0 245.5 -79.5t84.5 -228.5l-2 -6h-148q0 94 -45 136.5t-135 42.5q-94 0 -144 -69t-50 -182v-120q0 -115 50 -183.5t144 -68.5q90 0 134.5 41.5t44.5 137.5h148l2 -6q4 -151 -84 -229.5t-245 -78.5q-160 0 -254.5 106t-94.5 281z " />
<glyph unicode="&#xaa;" horiz-adv-x="909" d="M112 920q0 111 84.5 171t246.5 60h137v51q0 62 -29.5 94.5t-86.5 32.5q-66 0 -102 -26t-36 -73l-165 13l-1 6q-6 98 79 163t225 65q134 0 212.5 -71t78.5 -205v-314q0 -51 6 -95t20 -86h-177q-8 21 -13 44.5t-8 49.5q-33 -47 -88.5 -77.5t-133.5 -30.5q-119 0 -184 61 t-65 167zM287 924q0 -43 29 -65.5t88 -22.5q51 0 105 30t71 65v103h-136q-74 0 -115.5 -32t-41.5 -78z" />
<glyph unicode="&#xab;" horiz-adv-x="1025" d="M98 507v19l280 390h187l-240 -400l240 -399h-187zM432 507v19l280 390h187l-240 -400l240 -399h-187z" />
<glyph unicode="&#xac;" horiz-adv-x="1129" d="M126 634v171h835v-431h-200v260h-635z" />
<glyph unicode="&#xad;" horiz-adv-x="801" d="M113 510v225h564v-225h-564z" />
<glyph unicode="&#xae;" horiz-adv-x="1606" d="M86 729q0 315 207 531t503 216q295 0 502.5 -216t207.5 -531q0 -316 -208 -533t-502 -217q-296 0 -503 217t-207 533zM208 729q0 -264 171.5 -444.5t416.5 -180.5q244 0 415.5 180.5t171.5 444.5q0 263 -171.5 442.5t-415.5 179.5q-246 0 -417 -179.5t-171 -442.5z M501 316v850h281q151 0 238 -68t87 -194q0 -58 -29 -101.5t-85 -74.5q58 -30 84.5 -84.5t26.5 -128.5v-56q0 -41 3.5 -73.5t13.5 -53.5v-16h-155q-9 21 -11 61.5t-2 82.5v54q0 71 -33.5 105t-109.5 34h-158v-337h-151zM652 787h135q71 0 120.5 30t49.5 86q0 72 -39 101 t-136 29h-130v-246z" />
<glyph unicode="&#xaf;" horiz-adv-x="1028" d="M148 1292v165h731v-165h-731z" />
<glyph unicode="&#xb0;" horiz-adv-x="796" d="M126 1203q0 112 80.5 193t192.5 81q110 0 189 -81t79 -193q0 -113 -79 -192t-189 -79q-113 0 -193 79t-80 192zM273 1203q0 -53 37 -88.5t89 -35.5q51 0 86 35t35 89t-35 91t-86 37q-52 0 -89 -37t-37 -91z" />
<glyph unicode="&#xb1;" horiz-adv-x="1101" d="M90 715v232h333v363h256v-363h327v-232h-327v-383h-256v383h-333zM114 -43v228h834v-228h-834z" />
<glyph unicode="&#xb2;" horiz-adv-x="860" d="M108 1223q-6 106 82.5 181t236.5 75q144 0 223 -65t79 -183q0 -82 -53.5 -144.5t-178.5 -165.5l-109 -93l2 -6h346v-155h-622v155l309 252q60 50 77.5 83.5t17.5 74.5q0 39 -23.5 65.5t-72.5 26.5q-55 0 -83 -30t-28 -77h-201z" />
<glyph unicode="&#xb3;" horiz-adv-x="856" d="M95 893l2 6h201q0 -42 31.5 -65.5t91.5 -23.5q56 0 90 24t34 68q0 50 -35 77t-102 27h-111v133h111q62 0 92 24.5t30 70.5q0 38 -28.5 63.5t-83.5 25.5q-51 0 -79.5 -22t-28.5 -53h-200l-2 6q-6 101 82 162.5t222 61.5q152 0 240.5 -59.5t88.5 -169.5q0 -55 -35.5 -100.5 t-96.5 -70.5q70 -24 107.5 -71.5t37.5 -115.5q0 -112 -89.5 -174t-241.5 -62q-146 0 -240 62.5t-88 175.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="727" d="M108 1212l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xb5;" horiz-adv-x="1264" d="M139 -416v1498h291v-620q0 -149 45 -202.5t135 -53.5q75 0 125 27.5t78 79.5v769h292v-1082h-272l-6 67q-44 -43 -100.5 -65.5t-123.5 -22.5q-51 0 -94.5 10.5t-78.5 33.5v-439h-291z" />
<glyph unicode="&#xb6;" horiz-adv-x="1078" d="M61 988q0 207 129.5 337.5t362.5 130.5h375v-1456h-292v520h-83q-233 0 -362.5 129.5t-129.5 338.5z" />
<glyph unicode="&#xb7;" horiz-adv-x="619" d="M159 568v260h292v-260h-292z" />
<glyph unicode="&#xb8;" horiz-adv-x="549" d="M97 -136l31 142h219l-11 -57q64 -11 107 -52t43 -121q0 -107 -91.5 -171t-259.5 -64l-7 161q51 0 81 20.5t30 62.5q0 41 -32 57.5t-110 21.5z" />
<glyph unicode="&#xb9;" horiz-adv-x="573" d="M78 1295v159l338 23v-812h-211v630h-127z" />
<glyph unicode="&#xba;" horiz-adv-x="937" d="M118 1025v117q0 148 94 241.5t252 93.5t252.5 -93.5t94.5 -241.5v-117q0 -149 -94 -241.5t-251 -92.5q-159 0 -253.5 92.5t-94.5 241.5zM293 1025q0 -85 44 -136.5t129 -51.5q82 0 126 51.5t44 136.5v117q0 83 -44.5 135t-127.5 52q-84 0 -127.5 -52t-43.5 -135v-117z " />
<glyph unicode="&#xbb;" horiz-adv-x="1025" d="M102 151l239 399l-239 400h188l280 -390v-19l-280 -390h-188zM448 151l239 399l-239 400h188l280 -390v-19l-280 -390h-188z" />
<glyph unicode="&#xbc;" horiz-adv-x="1493" d="M167 1294v159l338 23v-812h-211v630h-127zM309 192l711 1138l142 -75l-711 -1138zM762 265l424 536h211v-505h101v-157h-101v-139h-211v139h-410zM978 296h208v257l-6 2l-13 -20z" />
<glyph unicode="&#xbd;" horiz-adv-x="1553" d="M167 1294v159l338 23v-812h-211v630h-127zM322 192l711 1138l142 -75l-711 -1138zM919 556q-6 106 82.5 181t236.5 75q144 0 223 -65t79 -183q0 -82 -53.5 -144.5t-178.5 -165.5l-109 -93l2 -6h346v-155h-622v155l309 252q60 50 77.5 83.5t17.5 74.5q0 39 -23.5 65.5 t-72.5 26.5q-55 0 -83 -30t-28 -77h-201z" />
<glyph unicode="&#xbe;" horiz-adv-x="1717" d="M111 894l2 6h201q0 -42 31.5 -65.5t91.5 -23.5q56 0 90 24t34 68q0 50 -35 77t-102 27h-111v133h111q62 0 92 24.5t30 70.5q0 38 -28.5 63.5t-83.5 25.5q-51 0 -79.5 -22t-28.5 -53h-200l-2 6q-6 101 82 162.5t222 61.5q152 0 240.5 -59.5t88.5 -169.5 q0 -55 -35.5 -100.5t-96.5 -70.5q70 -24 107.5 -71.5t37.5 -115.5q0 -112 -89.5 -174t-241.5 -62q-146 0 -240 62.5t-88 175.5zM492 192l711 1138l142 -75l-711 -1138zM951 265l424 536h211v-505h101v-157h-101v-139h-211v139h-410zM1167 296h208v257l-6 2l-13 -20z" />
<glyph unicode="&#xbf;" horiz-adv-x="1037" d="M75 27q0 125 74 233t187 183q60 45 79.5 92.5t19.5 132.5h291q-2 -141 -42.5 -206.5t-159.5 -157.5q-72 -58 -114.5 -125.5t-42.5 -149.5q0 -90 48.5 -142t139.5 -52q73 0 124 43t54 128h283l2 -6q2 -191 -127.5 -292.5t-335.5 -101.5q-226 0 -353 113t-127 308zM433 831 v251h294v-251h-294z" />
<glyph unicode="&#xc0;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM307 1820l2 6h309l197 -266h-237zM478 543h367l-180 572h-6z" />
<glyph unicode="&#xc1;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM478 543h367l-180 572h-6zM519 1560l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xc2;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM286 1592v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM478 543h367l-180 572h-6z" />
<glyph unicode="&#xc3;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM281 1644q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5zM478 543h367 l-180 572h-6z" />
<glyph unicode="&#xc4;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM272 1601v204h266v-204h-266zM478 543h367l-180 572h-6zM772 1601v204h266v-204h-266z" />
<glyph unicode="&#xc5;" horiz-adv-x="1311" d="M12 0l501 1456h299l499 -1456h-295l-99 314h-511l-99 -314h-295zM444 1739q0 83 61.5 139.5t151.5 56.5q88 0 149 -56.5t61 -139.5q0 -84 -60.5 -138t-149.5 -54q-90 0 -151.5 54t-61.5 138zM478 543h367l-180 572h-6zM560 1739q0 -43 28 -70.5t69 -27.5t67.5 27.5 t26.5 70.5q0 44 -26.5 72t-67.5 28q-42 0 -69.5 -28.5t-27.5 -71.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1925" d="M3 0l784 1456h1016v-228h-596l16 -366h499v-227h-490l17 -408h616v-227h-898l-14 335h-440l-168 -335h-342zM633 575h310l-23 559l-6 1z" />
<glyph unicode="&#xc7;" horiz-adv-x="1309" d="M93 583v289q0 265 160 435t416 170q270 0 422 -138.5t148 -377.5l-2 -6h-284q0 144 -69 220.5t-215 76.5q-131 0 -208 -106.5t-77 -271.5v-291q0 -167 81 -273.5t219 -106.5q137 0 202.5 73.5t65.5 218.5h283l2 -6q4 -235 -143.5 -372.5t-409.5 -137.5q-263 0 -427 169 t-164 435zM524 -137l31 142h219l-11 -57q64 -11 107 -52t43 -121q0 -107 -91.5 -171t-259.5 -64l-7 161q51 0 81 20.5t30 62.5q0 41 -32 57.5t-110 21.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1176" d="M136 0v1456h995v-225h-703v-366h603v-225h-603v-416h705v-224h-997zM244 1820l2 6h309l197 -266h-237z" />
<glyph unicode="&#xc9;" horiz-adv-x="1176" d="M136 0v1456h995v-225h-703v-366h603v-225h-603v-416h705v-224h-997zM456 1560l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xca;" horiz-adv-x="1176" d="M136 0v1456h995v-225h-703v-366h603v-225h-603v-416h705v-224h-997zM238 1592v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227z" />
<glyph unicode="&#xcb;" horiz-adv-x="1176" d="M136 0v1456h995v-225h-703v-366h603v-225h-603v-416h705v-224h-997zM221 1601v204h266v-204h-266zM721 1601v204h266v-204h-266z" />
<glyph unicode="&#xcc;" horiz-adv-x="601" d="M-58 1820l2 6h309l197 -266h-237zM154 0v1456h292v-1456h-292z" />
<glyph unicode="&#xcd;" horiz-adv-x="601" d="M152 1560l199 266h309l2 -6l-277 -260h-233zM154 0v1456h292v-1456h-292z" />
<glyph unicode="&#xce;" horiz-adv-x="601" d="M-64 1592v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM154 0v1456h292v-1456h-292z" />
<glyph unicode="&#xcf;" horiz-adv-x="601" d="M-81 1601v204h266v-204h-266zM154 0v1456h292v-1456h-292zM419 1601v204h266v-204h-266z" />
<glyph unicode="&#xd0;" horiz-adv-x="1372" d="M31 652v181h135v623h500q267 0 440 -170.5t173 -437.5v-241q0 -268 -173 -437.5t-440 -169.5h-500v652h-135zM458 224h193q157 0 246 106t89 277v243q0 169 -89 275t-246 106h-193v-398h244v-181h-244v-428z" />
<glyph unicode="&#xd1;" horiz-adv-x="1450" d="M136 0v1456h292l588 -994l6 1v993h291v-1456h-291l-588 995l-6 -1v-994h-292zM349 1644q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5z " />
<glyph unicode="&#xd2;" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM339 1820l2 6h309l197 -266h-237zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264q0 170 -85 279t-234 109 t-231 -108.5t-82 -279.5v-264z" />
<glyph unicode="&#xd3;" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264q0 170 -85 279t-234 109t-231 -108.5t-82 -279.5v-264zM551 1581 l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xd4;" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM333 1613v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282 v264q0 170 -85 279t-234 109t-231 -108.5t-82 -279.5v-264z" />
<glyph unicode="&#xd5;" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM324 1665q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5 q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264q0 170 -85 279t-234 109t-231 -108.5t-82 -279.5v-264z" />
<glyph unicode="&#xd6;" horiz-adv-x="1399" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q271 0 441 -175.5t170 -442.5v-262q0 -268 -169.5 -443t-440.5 -175q-269 0 -437 175t-168 443zM316 1622v204h266v-204h-266zM383 597q0 -173 83 -282t231 -109q150 0 234 109t84 282v264q0 170 -85 279t-234 109t-231 -108.5 t-82 -279.5v-264zM816 1622v204h266v-204h-266z" />
<glyph unicode="&#xd7;" horiz-adv-x="1088" d="M64 371l309 315l-309 315l172 164l303 -310l304 310l172 -164l-309 -315l309 -315l-172 -164l-304 309l-303 -309z" />
<glyph unicode="&#xd8;" horiz-adv-x="1410" d="M92 597v262q0 267 167.5 442.5t436.5 175.5q100 0 188.5 -26.5t162.5 -74.5l83 142h143l-130 -223q79 -83 121.5 -195t42.5 -241v-262q0 -268 -169.5 -443t-440.5 -175q-79 0 -151 16t-133 47l-80 -137h-143l119 204q-104 83 -160.5 209.5t-56.5 278.5zM383 597 q0 -74 15.5 -137.5t45.5 -107.5l6 -1l468 803q-42 45 -98 70t-124 25q-149 0 -231 -108.5t-82 -279.5v-264zM535 251q33 -22 74 -33.5t88 -11.5q150 0 234 109t84 282v264q0 45 -7 87t-18 73l-6 1z" />
<glyph unicode="&#xd9;" horiz-adv-x="1407" d="M120 490v966h293v-966q0 -144 77 -215.5t212 -71.5q137 0 215 71t78 216v966h293v-966q0 -245 -162 -378t-424 -133q-261 0 -421.5 133t-160.5 378zM344 1820l2 6h309l197 -266h-237z" />
<glyph unicode="&#xda;" horiz-adv-x="1407" d="M120 490v966h293v-966q0 -144 77 -215.5t212 -71.5q137 0 215 71t78 216v966h293v-966q0 -245 -162 -378t-424 -133q-261 0 -421.5 133t-160.5 378zM556 1560l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xdb;" horiz-adv-x="1407" d="M120 490v966h293v-966q0 -144 77 -215.5t212 -71.5q137 0 215 71t78 216v966h293v-966q0 -245 -162 -378t-424 -133q-261 0 -421.5 133t-160.5 378zM338 1592v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227z" />
<glyph unicode="&#xdc;" horiz-adv-x="1407" d="M120 490v966h293v-966q0 -144 77 -215.5t212 -71.5q137 0 215 71t78 216v966h293v-966q0 -245 -162 -378t-424 -133q-261 0 -421.5 133t-160.5 378zM321 1601v204h266v-204h-266zM821 1601v204h266v-204h-266z" />
<glyph unicode="&#xdd;" horiz-adv-x="1292" d="M5 1456h320l318 -671h6l318 671h320l-500 -944v-512h-291v527zM504 1560l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xde;" horiz-adv-x="1247" d="M132 0v1456h292v-270h221q254 0 396 -124t142 -324q0 -201 -142 -325t-396 -124h-221v-289h-292zM424 514h221q123 0 184.5 63.5t61.5 158.5t-61.5 160t-184.5 65h-221v-447z" />
<glyph unicode="&#xdf;" horiz-adv-x="1294" d="M135 0v1101q0 226 129 349t352 123q180 0 299 -95.5t119 -271.5q0 -108 -53.5 -205.5t-53.5 -165.5q0 -56 150 -197.5t150 -281.5q0 -189 -115 -283t-332 -94q-81 0 -160.5 15t-118.5 41l55 223q39 -22 96 -38.5t122 -16.5q76 0 119 38t43 103q0 71 -150 205.5 t-150 276.5q0 90 54.5 190t54.5 175q0 68 -45 113t-103 45q-76 0 -123.5 -67.5t-47.5 -184.5v-1097h-291z" />
<glyph unicode="&#xe0;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM184 1492l2 6h309l197 -266h-237zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5z" />
<glyph unicode="&#xe1;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5zM396 1232l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xe2;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM178 1270v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5z" />
<glyph unicode="&#xe3;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM169 1322q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5zM346 315q0 -54 36 -87t98 -33q77 0 137 38 t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM161 1279v204h266v-204h-266zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5zM661 1279v204h266v-204h-266z" />
<glyph unicode="&#xe5;" horiz-adv-x="1100" d="M55 305q0 159 122.5 246.5t357.5 87.5h163v86q0 78 -41 121t-121 43q-71 0 -109.5 -34.5t-38.5 -95.5l-282 1l-1 6q-7 137 119 236.5t331 99.5q194 0 315 -98.5t121 -280.5v-447q0 -76 11.5 -143t36.5 -133h-292q-16 37 -27.5 78t-16.5 84q-45 -79 -118.5 -131 t-175.5 -52q-170 0 -262 87.5t-92 238.5zM332 1417q0 83 61.5 139.5t151.5 56.5q88 0 149 -56.5t61 -139.5q0 -84 -60.5 -138t-149.5 -54q-90 0 -151.5 54t-61.5 138zM346 315q0 -54 36 -87t98 -33q77 0 137 38t81 88v153h-163q-93 0 -141 -46.5t-48 -112.5zM448 1417 q0 -43 28 -70.5t69 -27.5t67.5 27.5t26.5 70.5q0 44 -26.5 72t-67.5 28q-42 0 -69.5 -28.5t-27.5 -71.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M46 317q0 159 127 245t370 86h181v59q0 79 -41 124.5t-115 45.5q-81 0 -127 -37.5t-46 -93.5l-283 18l-2 6q-6 144 121.5 238t339.5 94q102 0 186 -27.5t143 -79.5q61 52 142.5 79.5t180.5 27.5q212 0 333 -132t121 -358v-158h-650l-2 -6q4 -112 66 -178.5t186 -66.5 q92 0 154 20t140 61l77 -184q-62 -48 -169 -84.5t-233 -36.5q-129 0 -229.5 40.5t-167.5 116.5q-60 -68 -161.5 -112.5t-240.5 -44.5q-192 0 -296.5 90.5t-104.5 247.5zM338 313q0 -59 41.5 -93.5t123.5 -34.5q58 0 121 30.5t100 72.5v176h-179q-98 0 -152.5 -44t-54.5 -107 zM1027 649l2 -5h362v28q0 94 -42.5 149.5t-125.5 55.5q-95 0 -142 -61.5t-54 -166.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1060" d="M62 525v30q0 239 130.5 393t372.5 154q200 0 322.5 -114t118.5 -300l-2 -6h-266q0 84 -46 139.5t-127 55.5q-116 0 -163.5 -90t-47.5 -232v-30q0 -145 47.5 -233.5t164.5 -88.5q78 0 125 45.5t47 121.5h265l3 -6q4 -164 -123.5 -274.5t-316.5 -110.5q-242 0 -373 153 t-131 393zM415 -137l31 142h219l-11 -57q64 -11 107 -52t43 -121q0 -107 -91.5 -171t-259.5 -64l-7 161q51 0 81 20.5t30 62.5q0 41 -32 57.5t-110 21.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1084" d="M77 510v40q0 241 132.5 397t355.5 155q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-234 0 -374 150t-140 381zM186 1498l2 6h309l197 -266h-237zM379 652l3 -5h358v26 q0 93 -43.5 148.5t-131.5 55.5q-81 0 -128 -62t-58 -163z" />
<glyph unicode="&#xe9;" horiz-adv-x="1084" d="M77 510v40q0 241 132.5 397t355.5 155q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-234 0 -374 150t-140 381zM379 652l3 -5h358v26q0 93 -43.5 148.5t-131.5 55.5 q-81 0 -128 -62t-58 -163zM398 1238l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xea;" horiz-adv-x="1084" d="M77 510v40q0 241 132.5 397t355.5 155q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-234 0 -374 150t-140 381zM180 1271v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133 h-227zM379 652l3 -5h358v26q0 93 -43.5 148.5t-131.5 55.5q-81 0 -128 -62t-58 -163z" />
<glyph unicode="&#xeb;" horiz-adv-x="1084" d="M77 510v40q0 241 132.5 397t355.5 155q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-234 0 -374 150t-140 381zM163 1280v204h266v-204h-266zM379 652l3 -5h358v26 q0 93 -43.5 148.5t-131.5 55.5q-81 0 -128 -62t-58 -163zM663 1280v204h266v-204h-266z" />
<glyph unicode="&#xec;" horiz-adv-x="562" d="M-78 1498l2 6h309l197 -266h-237zM133 0v1082h292v-1082h-292z" />
<glyph unicode="&#xed;" horiz-adv-x="562" d="M132 1217l199 266h309l2 -6l-277 -260h-233zM133 0v1082h292v-1082h-292z" />
<glyph unicode="&#xee;" horiz-adv-x="562" d="M-84 1251v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM133 0v1082h292v-1082h-292z" />
<glyph unicode="&#xef;" horiz-adv-x="562" d="M-101 1258v204h266v-204h-266zM133 0v1082h292v-1082h-292zM399 1258v204h266v-204h-266z" />
<glyph unicode="&#xf0;" horiz-adv-x="1218" d="M48 468q0 226 134.5 362.5t365.5 136.5q81 0 153 -25.5t124 -70.5l4 4q-14 83 -54 153.5t-100 125.5l-245 -136l-78 113l192 106l-1 6q-31 16 -68 30t-77 26l92 218q88 -19 168.5 -52.5t149.5 -80.5l198 109l77 -113l-162 -90q102 -106 158.5 -245t56.5 -303v-196 q0 -250 -157 -408.5t-392 -158.5q-238 0 -388.5 140.5t-150.5 348.5zM340 468q0 -112 68 -188.5t183 -76.5q116 0 184.5 96.5t68.5 246.5v118q-35 39 -99 65t-151 26q-122 0 -188 -79t-66 -208z" />
<glyph unicode="&#xf1;" d="M107 0v1082h272l13 -155q54 83 133 129t177 46q164 0 256 -103t92 -323v-676h-293v675q0 109 -44 154.5t-133 45.5q-58 0 -104 -23.5t-77 -66.5v-785h-292zM202 1322q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5 t-150.5 -67.5q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5z" />
<glyph unicode="&#xf2;" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM217 1498l2 6h309l197 -266h-237zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91 q-113 0 -165.5 -91.5t-52.5 -234.5v-21z" />
<glyph unicode="&#xf3;" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91q-113 0 -165.5 -91.5t-52.5 -234.5 v-21zM429 1238l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xf4;" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM211 1270v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90 t52.5 237v21q0 144 -53 235t-167 91q-113 0 -165.5 -91.5t-52.5 -234.5v-21z" />
<glyph unicode="&#xf5;" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM202 1322q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5 q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91q-113 0 -165.5 -91.5t-52.5 -234.5v-21z" />
<glyph unicode="&#xf6;" d="M67 530v21q0 242 135 396.5t374 154.5q240 0 376 -154t136 -397v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-240 0 -375.5 153.5t-135.5 397.5zM194 1279v204h266v-204h-266zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91 q-113 0 -165.5 -91.5t-52.5 -234.5v-21zM694 1279v204h266v-204h-266z" />
<glyph unicode="&#xf7;" horiz-adv-x="1168" d="M63 573v227h1029v-227h-1029zM432 164v233h293v-233h-293zM432 973v233h293v-233h-293z" />
<glyph unicode="&#xf8;" d="M67 530v21q0 242 135 396.5t374 154.5q50 0 96.5 -8t90.5 -22l70 143h161l-103 -211q95 -74 146 -191.5t51 -261.5v-21q0 -244 -135.5 -397.5t-374.5 -153.5q-48 0 -92 7t-84 19l-71 -146h-161l103 211q-101 71 -153.5 190.5t-52.5 269.5zM358 530q0 -62 8.5 -114 t26.5 -86l6 -1l260 531q-19 8 -39.5 12.5t-43.5 4.5q-113 0 -165.5 -91.5t-52.5 -234.5v-21zM505 215q15 -7 33.5 -9.5t39.5 -2.5q113 0 165.5 90t52.5 237v21q0 54 -8 102t-22 82l-6 1z" />
<glyph unicode="&#xf9;" d="M105 429v653h291v-655q0 -118 40 -169.5t118 -51.5q70 0 120 22.5t82 66.5v787h292v-1082h-249l-26 156q-50 -85 -127 -131t-177 -46q-171 0 -267.5 109.5t-96.5 340.5zM216 1477l2 6h309l197 -266h-237z" />
<glyph unicode="&#xfa;" d="M105 429v653h291v-655q0 -118 40 -169.5t118 -51.5q70 0 120 22.5t82 66.5v787h292v-1082h-249l-26 156q-50 -85 -127 -131t-177 -46q-171 0 -267.5 109.5t-96.5 340.5zM428 1217l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xfb;" d="M105 429v653h291v-655q0 -118 40 -169.5t118 -51.5q70 0 120 22.5t82 66.5v787h292v-1082h-249l-26 156q-50 -85 -127 -131t-177 -46q-171 0 -267.5 109.5t-96.5 340.5zM210 1251v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227z" />
<glyph unicode="&#xfc;" d="M105 429v653h291v-655q0 -118 40 -169.5t118 -51.5q70 0 120 22.5t82 66.5v787h292v-1082h-249l-26 156q-50 -85 -127 -131t-177 -46q-171 0 -267.5 109.5t-96.5 340.5zM193 1258v204h266v-204h-266zM693 1258v204h266v-204h-266z" />
<glyph unicode="&#xfd;" horiz-adv-x="1046" d="M5 1082h314l183 -628l12 -60h6l207 688h314l-439 -1244q-46 -116 -125 -195.5t-237 -79.5q-37 0 -68.5 6t-76.5 17l34 213q13 -2 28 -4t27 -2q72 0 111 35.5t60 88.5l34 84zM375 1217l199 266h309l2 -6l-277 -260h-233z" />
<glyph unicode="&#xfe;" horiz-adv-x="1162" d="M121 0v1560h292v-591q47 64 112 98.5t150 34.5q201 0 312 -157t111 -413v-21q0 -240 -111 -386t-310 -146q-85 0 -151 31.5t-113 92.5v-519h-291v416h-1zM413 297q27 -46 73.5 -70t114.5 -24q106 0 155.5 83t49.5 225v21q0 153 -51 248t-156 95q-66 0 -112.5 -27 t-73.5 -77v-474z" />
<glyph unicode="&#xff;" horiz-adv-x="1046" d="M5 1082h314l183 -628l12 -60h6l207 688h314l-439 -1244q-46 -116 -125 -195.5t-237 -79.5q-37 0 -68.5 6t-76.5 17l34 213q13 -2 28 -4t27 -2q72 0 111 35.5t60 88.5l34 84zM142 1258v204h266v-204h-266zM642 1258v204h266v-204h-266z" />
<glyph unicode="&#x152;" horiz-adv-x="1984" d="M97 576v304q0 265 167 431t437 166q69 0 140 -6t150 -15h865v-225h-703v-366h603v-225h-603v-416h705v-224h-867q-92 -10 -156.5 -15.5t-131.5 -5.5q-270 0 -438 165.5t-168 431.5zM388 576q0 -182 83.5 -277t231.5 -95q40 0 79.5 2t78.5 7v1030q-45 4 -83.5 6.5 t-76.5 2.5q-148 0 -230.5 -94.5t-82.5 -275.5v-306z" />
<glyph unicode="&#x153;" horiz-adv-x="1848" d="M67 530v21q0 242 135 396.5t374 154.5q127 0 227 -46.5t167 -129.5q65 84 159.5 130t213.5 46q219 0 340 -132t121 -357v-159h-646l-2 -6q8 -107 71.5 -176t172.5 -69q97 0 161 19.5t140 61.5l79 -180q-66 -54 -173 -89.5t-238 -35.5q-127 0 -228 46t-169 131 q-67 -85 -167 -131t-227 -46q-240 0 -375.5 153.5t-135.5 397.5zM358 530q0 -148 52 -237.5t168 -89.5q113 0 165.5 90t52.5 237v21q0 144 -53 235t-167 91q-113 0 -165.5 -91.5t-52.5 -234.5v-21zM1157 652l3 -5h358v26q0 93 -43.5 148.5t-131.5 55.5q-81 0 -128 -62 t-58 -163z" />
<glyph unicode="&#x178;" horiz-adv-x="1292" d="M5 1456h320l318 -671h6l318 671h320l-500 -944v-512h-291v527zM269 1601v204h266v-204h-266zM769 1601v204h266v-204h-266z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1016" d="M137 1252v26l282 240h169l287 -243v-23h-232l-140 133l-139 -133h-227z" />
<glyph unicode="&#x2dc;" horiz-adv-x="986" d="M119 1272q0 94 59.5 163.5t149.5 69.5q56 0 152 -43.5t148 -43.5q34 0 60 32t26 79l154 -45q0 -96 -59.5 -163.5t-150.5 -67.5q-70 0 -158.5 43.5t-140.5 43.5q-36 0 -60 -32.5t-24 -77.5z" />
<glyph unicode="&#x2000;" horiz-adv-x="967" />
<glyph unicode="&#x2001;" horiz-adv-x="1935" />
<glyph unicode="&#x2002;" horiz-adv-x="967" />
<glyph unicode="&#x2003;" horiz-adv-x="1935" />
<glyph unicode="&#x2004;" horiz-adv-x="645" />
<glyph unicode="&#x2005;" horiz-adv-x="483" />
<glyph unicode="&#x2006;" horiz-adv-x="322" />
<glyph unicode="&#x2007;" horiz-adv-x="322" />
<glyph unicode="&#x2008;" horiz-adv-x="241" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="801" d="M113 510v225h564v-225h-564z" />
<glyph unicode="&#x2011;" horiz-adv-x="801" d="M113 510v225h564v-225h-564z" />
<glyph unicode="&#x2012;" horiz-adv-x="801" d="M113 510v225h564v-225h-564z" />
<glyph unicode="&#x2013;" horiz-adv-x="1413" d="M141 601v228h1084v-228h-1084z" />
<glyph unicode="&#x2014;" horiz-adv-x="1670" d="M106 601v228h1334v-228h-1334z" />
<glyph unicode="&#x2018;" horiz-adv-x="405" d="M50 1015v192l162 353h143l-60 -352v-193h-245z" />
<glyph unicode="&#x2019;" horiz-adv-x="405" d="M57 1016l60 349v195h246v-194l-162 -350h-144z" />
<glyph unicode="&#x201a;" horiz-adv-x="406" d="M50 -263l60 266v284h246v-268l-147 -282h-159z" />
<glyph unicode="&#x201c;" horiz-adv-x="742" d="M50 1015v192l162 353h143l-60 -352v-193h-245zM379 1015v192l162 353h143l-60 -352v-193h-245z" />
<glyph unicode="&#x201d;" horiz-adv-x="750" d="M57 1016l60 349v195h246v-194l-162 -350h-144zM394 1016l60 349v195h246v-194l-162 -350h-144z" />
<glyph unicode="&#x201e;" horiz-adv-x="732" d="M50 -225l60 268v255h230v-243l-162 -280h-128zM391 -225l60 276v247h231v-243l-162 -280h-129z" />
<glyph unicode="&#x2022;" horiz-adv-x="737" d="M135 716v90q0 100 65 164t172 64q110 0 175 -63.5t65 -164.5v-90q0 -101 -64.5 -163t-173.5 -62t-174 62.5t-65 162.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1519" d="M144 0v256h292v-256h-292zM587 0v256h292v-256h-292zM1007 0v256h292v-256h-292z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="639" d="M108 541v19l280 390h187l-240 -400l240 -399h-187z" />
<glyph unicode="&#x203a;" horiz-adv-x="619" d="M80 151l239 399l-239 400h188l280 -390v-19l-280 -390h-188z" />
<glyph unicode="&#x205f;" horiz-adv-x="483" />
<glyph unicode="&#x20ac;" horiz-adv-x="1116" d="M71 455v200h146v116h-146v200h146v13q0 203 150.5 348t394.5 145q60 0 117.5 -8t125.5 -23l-21 -229q-53 16 -109.5 25.5t-112.5 9.5q-118 0 -185.5 -80.5t-67.5 -185.5v-15h428v-200h-428v-116h428v-200h-428v-8q0 -99 67.5 -171.5t187.5 -72.5q58 0 113.5 8.5 t106.5 25.5l21 -227q-57 -15 -118 -23t-123 -8q-245 0 -396 137.5t-151 330.5v8h-146z" />
<glyph unicode="&#x2122;" horiz-adv-x="1294" d="M96 1351v105h398v-105h-128v-434h-144v434h-126zM565 915v541h159l119 -362h6l120 362h154v-541h-129v282l-6 1l-105 -283h-73l-110 298l-6 -1v-297h-129z" />
<glyph unicode="&#xe000;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1279" d="M27 877v205h161v120q0 182 105 280.5t295 98.5q37 0 75.5 -5.5t84.5 -15.5l-25 -217q-24 4 -46.5 7t-52.5 3q-71 0 -107.5 -39t-36.5 -112v-120h215v-205h-215v-877h-292v877h-161zM859 0v1560h292v-1560h-292z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1981" d="M27 877v205h161v120q0 182 105 280.5t295 98.5q37 0 75.5 -5.5t84.5 -15.5l-25 -217q-24 4 -46.5 7t-52.5 3q-71 0 -107.5 -39t-36.5 -112v-120h215v-205h-215v-877h-292v877h-161zM752 877v205h161v74q0 204 124.5 314.5t350.5 110.5q78 0 154 -15.5t176 -44.5l-42 -230 q-73 22 -132.5 34t-136.5 12q-101 0 -151.5 -46t-50.5 -135v-74h213v-205h-213v-877h-292v877h-161zM1561 0v1082h292v-1082h-292z" />
<glyph unicode="&#xfb04;" horiz-adv-x="2011" d="M27 877v205h161v120q0 182 105 280.5t295 98.5q37 0 75.5 -5.5t84.5 -15.5l-25 -217q-24 4 -46.5 7t-52.5 3q-71 0 -107.5 -39t-36.5 -112v-120h215v-205h-215v-877h-292v877h-161zM759 877v205h161v120q0 182 105 280.5t295 98.5q37 0 75.5 -5.5t84.5 -15.5l-25 -217 q-24 4 -46.5 7t-52.5 3q-71 0 -107.5 -39t-36.5 -112v-120h215v-205h-215v-877h-292v877h-161zM1591 0v1560h292v-1560h-292z" />
<hkern u1="&#x22;" u2="w" k="-12" />
<hkern u1="&#x27;" u2="w" k="-12" />
<hkern u1="&#x28;" u2="&#x178;" k="-25" />
<hkern u1="&#x28;" u2="&#xdd;" k="-25" />
<hkern u1="&#x28;" u2="Y" k="-25" />
<hkern u1="&#x28;" u2="W" k="-26" />
<hkern u1="&#x28;" u2="V" k="-23" />
<hkern u1="A" u2="w" k="39" />
<hkern u1="A" u2="t" k="20" />
<hkern u1="A" u2="&#x3f;" k="77" />
<hkern u1="C" u2="&#x29;" k="30" />
<hkern u1="D" u2="&#xc6;" k="61" />
<hkern u1="E" u2="w" k="25" />
<hkern u1="F" u2="&#x2026;" k="325" />
<hkern u1="F" u2="&#x201e;" k="325" />
<hkern u1="F" u2="&#x201a;" k="325" />
<hkern u1="F" u2="&#x153;" k="52" />
<hkern u1="F" u2="&#xff;" k="28" />
<hkern u1="F" u2="&#xfd;" k="28" />
<hkern u1="F" u2="&#xfc;" k="25" />
<hkern u1="F" u2="&#xfb;" k="25" />
<hkern u1="F" u2="&#xfa;" k="25" />
<hkern u1="F" u2="&#xf9;" k="25" />
<hkern u1="F" u2="&#xf6;" k="54" />
<hkern u1="F" u2="&#xf5;" k="54" />
<hkern u1="F" u2="&#xf4;" k="54" />
<hkern u1="F" u2="&#xf3;" k="54" />
<hkern u1="F" u2="&#xf2;" k="54" />
<hkern u1="F" u2="&#xeb;" k="52" />
<hkern u1="F" u2="&#xea;" k="52" />
<hkern u1="F" u2="&#xe9;" k="52" />
<hkern u1="F" u2="&#xe8;" k="52" />
<hkern u1="F" u2="&#xe7;" k="52" />
<hkern u1="F" u2="&#xe5;" k="68" />
<hkern u1="F" u2="&#xe4;" k="68" />
<hkern u1="F" u2="&#xe3;" k="68" />
<hkern u1="F" u2="&#xe2;" k="68" />
<hkern u1="F" u2="&#xe1;" k="68" />
<hkern u1="F" u2="&#xe0;" k="68" />
<hkern u1="F" u2="&#xc5;" k="163" />
<hkern u1="F" u2="&#xc4;" k="163" />
<hkern u1="F" u2="&#xc3;" k="163" />
<hkern u1="F" u2="&#xc2;" k="163" />
<hkern u1="F" u2="&#xc1;" k="163" />
<hkern u1="F" u2="&#xc0;" k="163" />
<hkern u1="F" u2="y" k="28" />
<hkern u1="F" u2="v" k="28" />
<hkern u1="F" u2="u" k="25" />
<hkern u1="F" u2="r" k="30" />
<hkern u1="F" u2="q" k="52" />
<hkern u1="F" u2="o" k="54" />
<hkern u1="F" u2="g" k="52" />
<hkern u1="F" u2="e" k="52" />
<hkern u1="F" u2="d" k="52" />
<hkern u1="F" u2="c" k="52" />
<hkern u1="F" u2="a" k="68" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="A" k="163" />
<hkern u1="F" u2="&#x3a;" k="325" />
<hkern u1="F" u2="&#x2e;" k="325" />
<hkern u1="F" u2="&#x2c;" k="325" />
<hkern u1="K" u2="w" k="74" />
<hkern u1="L" u2="w" k="104" />
<hkern u1="O" u2="&#xc6;" k="61" />
<hkern u1="P" u2="&#xc6;" k="165" />
<hkern u1="P" u2="t" k="-16" />
<hkern u1="Q" u2="&#x178;" k="71" />
<hkern u1="Q" u2="&#xdd;" k="71" />
<hkern u1="Q" u2="Y" k="71" />
<hkern u1="Q" u2="W" k="23" />
<hkern u1="Q" u2="V" k="33" />
<hkern u1="Q" u2="T" k="39" />
<hkern u1="R" u2="&#x178;" k="57" />
<hkern u1="R" u2="&#xdd;" k="57" />
<hkern u1="R" u2="Y" k="57" />
<hkern u1="R" u2="V" k="22" />
<hkern u1="R" u2="T" k="31" />
<hkern u1="T" u2="&#xf8;" k="112" />
<hkern u1="T" u2="&#xe6;" k="99" />
<hkern u1="T" u2="&#xc6;" k="195" />
<hkern u1="T" u2="&#xbb;" k="173" />
<hkern u1="T" u2="&#xab;" k="175" />
<hkern u1="T" u2="w" k="55" />
<hkern u1="T" u2="r" k="77" />
<hkern u1="V" u2="&#x7d;" k="-22" />
<hkern u1="V" u2="r" k="35" />
<hkern u1="V" u2="]" k="-20" />
<hkern u1="V" u2="&#x29;" k="-23" />
<hkern u1="W" u2="&#x7d;" k="-16" />
<hkern u1="W" u2="r" k="24" />
<hkern u1="W" u2="]" k="-14" />
<hkern u1="W" u2="&#x29;" k="-17" />
<hkern u1="Y" u2="&#x2022;" k="105" />
<hkern u1="Y" u2="&#xf8;" k="91" />
<hkern u1="Y" u2="&#xe6;" k="89" />
<hkern u1="Y" u2="&#xc6;" k="136" />
<hkern u1="Y" u2="&#xbb;" k="60" />
<hkern u1="Y" u2="&#xab;" k="119" />
<hkern u1="Y" u2="&#x7d;" k="-22" />
<hkern u1="Y" u2="t" k="33" />
<hkern u1="Y" u2="r" k="62" />
<hkern u1="Y" u2="f" k="40" />
<hkern u1="Y" u2="]" k="-21" />
<hkern u1="Y" u2="&#x2a;" k="88" />
<hkern u1="Y" u2="&#x29;" k="-23" />
<hkern u1="Y" u2="&#x26;" k="57" />
<hkern u1="Z" u2="w" k="31" />
<hkern u1="[" u2="&#xdc;" k="21" />
<hkern u1="[" u2="&#xdb;" k="21" />
<hkern u1="[" u2="&#xda;" k="21" />
<hkern u1="[" u2="&#xd9;" k="21" />
<hkern u1="[" u2="U" k="21" />
<hkern u1="[" u2="J" k="21" />
<hkern u1="f" u2="&#x201d;" k="-34" />
<hkern u1="f" u2="&#x201c;" k="-34" />
<hkern u1="f" u2="&#x2019;" k="-34" />
<hkern u1="f" u2="&#x2018;" k="-34" />
<hkern u1="f" u2="&#x7d;" k="-37" />
<hkern u1="f" u2="]" k="-66" />
<hkern u1="f" u2="&#x29;" k="-53" />
<hkern u1="f" u2="&#x27;" k="-34" />
<hkern u1="f" u2="&#x22;" k="-34" />
<hkern u1="k" u2="&#x153;" k="23" />
<hkern u1="k" u2="&#xeb;" k="23" />
<hkern u1="k" u2="&#xea;" k="23" />
<hkern u1="k" u2="&#xe9;" k="23" />
<hkern u1="k" u2="&#xe8;" k="23" />
<hkern u1="k" u2="&#xe7;" k="23" />
<hkern u1="k" u2="q" k="23" />
<hkern u1="k" u2="g" k="23" />
<hkern u1="k" u2="e" k="23" />
<hkern u1="k" u2="d" k="23" />
<hkern u1="k" u2="c" k="23" />
<hkern u1="r" u2="w" k="-27" />
<hkern u1="r" u2="t" k="-27" />
<hkern u1="r" u2="f" k="-24" />
<hkern u1="v" u2="f" k="-15" />
<hkern u1="w" u2="&#x2026;" k="72" />
<hkern u1="w" u2="&#x201e;" k="72" />
<hkern u1="w" u2="&#x201a;" k="72" />
<hkern u1="w" u2="&#x3a;" k="72" />
<hkern u1="w" u2="&#x2e;" k="72" />
<hkern u1="w" u2="&#x2c;" k="72" />
<hkern u1="y" u2="f" k="-15" />
<hkern u1="&#x7b;" u2="&#xdc;" k="23" />
<hkern u1="&#x7b;" u2="&#xdb;" k="23" />
<hkern u1="&#x7b;" u2="&#xda;" k="23" />
<hkern u1="&#x7b;" u2="&#xd9;" k="23" />
<hkern u1="&#x7b;" u2="U" k="23" />
<hkern u1="&#x7b;" u2="J" k="23" />
<hkern u1="&#xc0;" u2="w" k="39" />
<hkern u1="&#xc0;" u2="t" k="20" />
<hkern u1="&#xc0;" u2="&#x3f;" k="77" />
<hkern u1="&#xc1;" u2="w" k="39" />
<hkern u1="&#xc1;" u2="t" k="20" />
<hkern u1="&#xc1;" u2="&#x3f;" k="77" />
<hkern u1="&#xc2;" u2="w" k="39" />
<hkern u1="&#xc2;" u2="t" k="20" />
<hkern u1="&#xc2;" u2="&#x3f;" k="77" />
<hkern u1="&#xc3;" u2="w" k="39" />
<hkern u1="&#xc3;" u2="t" k="20" />
<hkern u1="&#xc3;" u2="&#x3f;" k="77" />
<hkern u1="&#xc4;" u2="w" k="39" />
<hkern u1="&#xc4;" u2="t" k="20" />
<hkern u1="&#xc4;" u2="&#x3f;" k="77" />
<hkern u1="&#xc5;" u2="w" k="39" />
<hkern u1="&#xc5;" u2="t" k="20" />
<hkern u1="&#xc5;" u2="&#x3f;" k="77" />
<hkern u1="&#xc7;" u2="&#x29;" k="30" />
<hkern u1="&#xc8;" u2="w" k="25" />
<hkern u1="&#xc9;" u2="w" k="25" />
<hkern u1="&#xca;" u2="w" k="25" />
<hkern u1="&#xcb;" u2="w" k="25" />
<hkern u1="&#xd0;" u2="&#xc6;" k="61" />
<hkern u1="&#xd2;" u2="&#xc6;" k="61" />
<hkern u1="&#xd3;" u2="&#xc6;" k="61" />
<hkern u1="&#xd4;" u2="&#xc6;" k="61" />
<hkern u1="&#xd5;" u2="&#xc6;" k="61" />
<hkern u1="&#xd6;" u2="&#xc6;" k="61" />
<hkern u1="&#xdd;" u2="&#x2022;" k="105" />
<hkern u1="&#xdd;" u2="&#xf8;" k="91" />
<hkern u1="&#xdd;" u2="&#xe6;" k="89" />
<hkern u1="&#xdd;" u2="&#xc6;" k="136" />
<hkern u1="&#xdd;" u2="&#xbb;" k="60" />
<hkern u1="&#xdd;" u2="&#xab;" k="119" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-22" />
<hkern u1="&#xdd;" u2="t" k="33" />
<hkern u1="&#xdd;" u2="r" k="62" />
<hkern u1="&#xdd;" u2="f" k="40" />
<hkern u1="&#xdd;" u2="]" k="-21" />
<hkern u1="&#xdd;" u2="&#x2a;" k="88" />
<hkern u1="&#xdd;" u2="&#x29;" k="-23" />
<hkern u1="&#xdd;" u2="&#x26;" k="57" />
<hkern u1="&#xfd;" u2="f" k="-15" />
<hkern u1="&#xff;" u2="f" k="-15" />
<hkern u1="&#x178;" u2="&#x2022;" k="105" />
<hkern u1="&#x178;" u2="&#xf8;" k="91" />
<hkern u1="&#x178;" u2="&#xe6;" k="89" />
<hkern u1="&#x178;" u2="&#xc6;" k="136" />
<hkern u1="&#x178;" u2="&#xbb;" k="60" />
<hkern u1="&#x178;" u2="&#xab;" k="119" />
<hkern u1="&#x178;" u2="&#x7d;" k="-22" />
<hkern u1="&#x178;" u2="t" k="33" />
<hkern u1="&#x178;" u2="r" k="62" />
<hkern u1="&#x178;" u2="f" k="40" />
<hkern u1="&#x178;" u2="]" k="-21" />
<hkern u1="&#x178;" u2="&#x2a;" k="88" />
<hkern u1="&#x178;" u2="&#x29;" k="-23" />
<hkern u1="&#x178;" u2="&#x26;" k="57" />
<hkern u1="&#x2018;" u2="w" k="-12" />
<hkern u1="&#x2019;" u2="w" k="-12" />
<hkern u1="&#x201c;" u2="w" k="-12" />
<hkern u1="&#x201d;" u2="w" k="-12" />
<hkern g1="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
<hkern g1="B" g2="T" k="31" />
<hkern g1="B" g2="V" k="28" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="130" />
<hkern g1="C,Ccedilla" g2="T" k="34" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="24" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="31" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="25" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="50" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="88" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="25" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="22" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="30" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="25" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="30" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="26" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="47" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="168" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="58" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="298" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-22" />
<hkern g1="L" g2="T" k="213" />
<hkern g1="L" g2="V" k="215" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="267" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="16" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="140" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="59" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="28" />
<hkern g1="L" g2="W" k="117" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="168" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="12" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="15" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="P" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="382" />
<hkern g1="P" g2="X" k="77" />
<hkern g1="P" g2="Z" k="39" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-17" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="100" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="98" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="105" />
<hkern g1="T" g2="m,n,p,ntilde" k="83" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="93" />
<hkern g1="T" g2="s" k="90" />
<hkern g1="T" g2="T" k="-19" />
<hkern g1="T" g2="V" k="-19" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-19" />
<hkern g1="T" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="203" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="77" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="97" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="200" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="33" />
<hkern g1="T" g2="W" k="-17" />
<hkern g1="T" g2="S" k="19" />
<hkern g1="T" g2="x" k="91" />
<hkern g1="T" g2="z" k="71" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="141" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="54" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="52" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="54" />
<hkern g1="V" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="215" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="33" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="12" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="73" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="30" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="73" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="39" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="36" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
<hkern g1="W" g2="T" k="-16" />
<hkern g1="W" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="169" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="22" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="101" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="30" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="32" />
<hkern g1="X" g2="V" k="-16" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="24" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="51" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="186" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="37" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="159" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="129" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="77" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="144" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="121" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-20" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-21" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-21" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="247" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="75" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="131" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="34" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="61" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-20" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="19" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="34" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="42" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="159" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-15" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="24" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="24" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="22" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="30" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="50" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="17" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="49" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="12" />
<hkern g1="b,p,thorn" g2="x" k="17" />
<hkern g1="b,p,thorn" g2="z" k="17" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="42" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="38" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="56" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="61" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="17" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="32" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="19" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-19" />
<hkern g1="r" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="146" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-28" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="17" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="17" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,colon,quotesinglbase,quotedblbase,ellipsis" k="140" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="23" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="28" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,641 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="robotolight" horiz-adv-x="1140" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="498" />
<glyph unicode="&#xfb01;" horiz-adv-x="1100" d="M48 984v98h180v138q0 172 95 266.5t264 94.5q67 0 136 -15t140 -44l-20 -103q-61 25 -118 39t-130 14q-122 0 -184.5 -65t-62.5 -187v-138h253v-98h-253v-984h-120v984h-180zM808 0v1082h120v-1082h-120z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="498" />
<glyph unicode=" " horiz-adv-x="498" />
<glyph unicode="&#x09;" horiz-adv-x="498" />
<glyph unicode="&#xa0;" horiz-adv-x="498" />
<glyph unicode="!" horiz-adv-x="462" d="M158 0v167h142v-167h-142zM169 478v978h119v-978h-119z" />
<glyph unicode="&#x22;" horiz-adv-x="588" d="M127 1083l3 255v222h102v-216l-33 -261h-72zM366 1083l4 258v219h101v-216l-33 -261h-72z" />
<glyph unicode="#" horiz-adv-x="1270" d="M67 410v93h272l83 441h-279v96h297l79 416h100l-79 -416h314l79 416h100l-79 -416h229v-96h-247l-83 -441h255v-93h-273l-77 -410h-100l77 410h-313l-77 -410h-100l77 410h-255zM439 503h314l83 441h-314z" />
<glyph unicode="$" horiz-adv-x="1135" d="M120 412l3 6h112q0 -177 101 -255t244 -78q148 0 234.5 77.5t86.5 196.5q0 110 -72 180t-254 135q-208 66 -308 159t-100 262q0 162 100 264t272 116v202h102v-202q175 -16 271 -131t94 -311l-3 -5h-112q0 152 -80 247t-224 95q-148 0 -224.5 -77.5t-76.5 -195.5 q0 -114 68 -183.5t261 -133.5q207 -69 306.5 -160.5t99.5 -258.5q0 -166 -104 -265.5t-280 -113.5v-190h-101v189q-181 11 -300.5 115.5t-115.5 315.5z" />
<glyph unicode="%" horiz-adv-x="1514" d="M110 1099v77q0 127 78.5 214t206.5 87q127 0 205.5 -87t78.5 -214v-77q0 -126 -78 -212.5t-204 -86.5q-129 0 -208 86.5t-79 212.5zM206 1099q0 -88 49.5 -150t141.5 -62q89 0 137.5 62t48.5 150v77q0 88 -49 151t-139 63t-139.5 -63t-49.5 -151v-77zM386 169l711 1138 l74 -48l-711 -1138zM842 278v78q0 126 78.5 213t206.5 87q127 0 206 -87t79 -213v-78q0 -126 -78.5 -212.5t-204.5 -86.5q-129 0 -208 86.5t-79 212.5zM939 278q0 -88 49 -150t141 -62q89 0 137.5 62t48.5 150v78q0 91 -49 152t-139 61t-139 -61.5t-49 -151.5v-78z" />
<glyph unicode="&#x26;" horiz-adv-x="1260" d="M91 371q0 120 72.5 216.5t209.5 196.5l15 11q-81 100 -120 182.5t-39 169.5q0 158 89 244t244 86q144 0 228.5 -81t84.5 -204q0 -90 -45 -155t-130 -130l-159 -122l412 -481q49 71 76 159t27 188h110q0 -128 -36.5 -235.5t-105.5 -194.5l185 -216l-2 -5h-137l-122 141 q-85 -78 -186 -120t-218 -42q-209 0 -331 107t-122 285zM211 371q0 -124 85.5 -207.5t247.5 -83.5q92 0 179.5 36t157.5 103l-414 482l-8.5 8.5t-5.5 7.5l-47 -36q-116 -94 -155.5 -170t-39.5 -140zM349 1149q0 -66 31.5 -137t96.5 -151l177 132q58 45 82.5 94t24.5 105 q0 79 -52.5 131t-146.5 52q-102 0 -157.5 -65t-55.5 -161z" />
<glyph unicode="'" horiz-adv-x="348" d="M116 1090l8 266v204h102v-195l-38 -275h-72z" />
<glyph unicode="(" horiz-adv-x="640" d="M140 573v15q0 363 139 651t310 386l6 -1l26 -73q-145 -103 -253 -366t-108 -594v-20q0 -331 108 -594t253 -370l-26 -70h-6q-173 100 -311 382t-138 654z" />
<glyph unicode=")" horiz-adv-x="652" d="M18 -393q144 102 252.5 367t108.5 597v20q0 329 -110.5 595.5t-250.5 368.5l26 70h6q170 -98 309 -386t139 -651v-15q0 -372 -138 -654t-310 -382h-6z" />
<glyph unicode="*" horiz-adv-x="869" d="M29 1108l32 101l332 -123l-4 370h104l-8 -373l324 127l33 -101l-333 -115l223 -294l-85 -63l-214 305l-204 -303l-85 61l217 300z" />
<glyph unicode="+" horiz-adv-x="1156" d="M75 628v112h434v466h121v-466h443v-112h-443v-482h-121v482h-434z" />
<glyph unicode="," horiz-adv-x="392" d="M83 -258l69 279v167h119v-170l-106 -276h-82z" />
<glyph unicode="-" horiz-adv-x="586" d="M49 570v101h479v-101h-479z" />
<glyph unicode="." horiz-adv-x="489" d="M167 0v164h137v-164h-137z" />
<glyph unicode="/" horiz-adv-x="813" d="M30 -125l608 1581h108l-607 -1581h-109z" />
<glyph unicode="0" horiz-adv-x="1194" d="M135 565v325q0 281 122 434t339 153t340 -153t123 -434v-325q0 -282 -122 -434t-339 -152q-216 0 -339.5 152.5t-123.5 433.5zM255 547q0 -222 88.5 -344.5t254.5 -122.5t253.5 122t87.5 345v363q0 224 -88 344.5t-255 120.5t-254 -120.5t-87 -344.5v-363z" />
<glyph unicode="1" horiz-adv-x="1135" d="M188 1288v84l490 88v-1467h-120v1338z" />
<glyph unicode="2" horiz-adv-x="1135" d="M111 1043q-5 182 118 308t333 126q188 0 301 -108t113 -290q0 -120 -75.5 -243.5t-210.5 -275.5l-401 -454l2 -5h750v-101h-904v92l477 541q132 149 186.5 249.5t54.5 192.5q0 136 -76.5 218t-216.5 82q-166 0 -252 -92t-86 -246h-111z" />
<glyph unicode="3" horiz-adv-x="1135" d="M104 389l2 6h112q0 -139 96.5 -227t249.5 -88q155 0 242 80.5t87 230.5q0 153 -91 226.5t-260 73.5h-139v102h139q159 0 241 79.5t82 204.5q0 136 -77 217t-229 81q-140 0 -229.5 -82.5t-89.5 -217.5h-112l-2 6q-5 170 119 283t314 113q195 0 310.5 -107t115.5 -297 q0 -103 -64 -193.5t-180 -134.5q136 -39 203.5 -131.5t67.5 -218.5q0 -194 -125.5 -305t-322.5 -111q-191 0 -328 108.5t-132 301.5z" />
<glyph unicode="4" horiz-adv-x="1135" d="M69 368v68l671 1020h131v-987h228v-101h-228v-368h-119v368h-683zM211 469h541v830l-6 2l-51 -109z" />
<glyph unicode="5" horiz-adv-x="1135" d="M174 377l2 6h107q0 -147 83.5 -225t222.5 -78q162 0 242.5 98t80.5 284q0 163 -80.5 261.5t-225.5 98.5q-140 0 -213.5 -44.5t-106.5 -134.5l-97 16l81 797h707v-111h-605l-54 -519q55 50 121 77t179 30q186 3 300 -125t114 -344q0 -221 -110.5 -353t-332.5 -132 q-180 0 -300 100.5t-115 297.5z" />
<glyph unicode="6" horiz-adv-x="1135" d="M152 540v367q0 252 143 411t352 159q75 0 148 -17t130 -49l-31 -98q-57 32 -113 47t-134 15q-162 0 -268.5 -126t-106.5 -331v-129q60 78 153 125t206 47q196 0 310 -135t114 -352q0 -215 -122.5 -355t-318.5 -140q-201 0 -331.5 150t-130.5 411zM272 531q0 -209 96 -330 t246 -121q146 0 233.5 114.5t87.5 279.5q0 175 -85 282t-243 107q-121 0 -211.5 -63t-123.5 -162v-107z" />
<glyph unicode="7" horiz-adv-x="1135" d="M77 1354v102h955v-102q-236 -280 -361 -568.5t-167 -663.5l-11 -122h-120l11 122q42 370 174 669.5t350 562.5h-831z" />
<glyph unicode="8" horiz-adv-x="1135" d="M100 386q0 129 79 224.5t212 136.5q-115 40 -182.5 128t-67.5 206q0 188 118.5 292t307.5 104q188 0 308.5 -104.5t120.5 -291.5q0 -118 -69 -206.5t-184 -128.5q133 -41 213.5 -136.5t80.5 -223.5q0 -196 -131 -301.5t-337 -105.5q-210 0 -339.5 105t-129.5 302z M219 385q0 -143 97 -224t253 -81q152 0 250 81.5t98 223.5q0 138 -100 224.5t-250 86.5q-152 0 -250 -86.5t-98 -224.5zM260 1082q0 -129 86.5 -206.5t222.5 -77.5q133 0 220 77.5t87 206.5q0 126 -88.5 209.5t-220.5 83.5q-135 0 -221 -80t-86 -213z" />
<glyph unicode="9" horiz-adv-x="1135" d="M89 958q0 221 127.5 370t315.5 149q211 0 338 -137.5t127 -399.5v-429q0 -253 -134 -392.5t-352 -139.5q-78 0 -156.5 15t-149.5 46l22 100q68 -32 134.5 -46t149.5 -14q166 0 264 111t98 318v146q-53 -92 -142.5 -142t-199.5 -50q-199 0 -320.5 138t-121.5 357zM213 958 q0 -168 86 -281t232 -113q130 0 217.5 66.5t124.5 164.5v154q0 207 -90.5 316.5t-245.5 109.5q-141 0 -232.5 -122t-91.5 -295z" />
<glyph unicode=":" horiz-adv-x="434" d="M154 0v164h137v-164h-137zM154 916v164h137v-164h-137z" />
<glyph unicode=";" horiz-adv-x="438" d="M106 -258l69 279v167h119v-170l-106 -276h-82zM158 918v164h137v-164h-137z" />
<glyph unicode="&#x3c;" horiz-adv-x="1047" d="M77 501v97l827 378v-126l-614 -272l-108 -28v-6l108 -28l614 -268v-126z" />
<glyph unicode="=" horiz-adv-x="1147" d="M149 422v106h834v-106h-834zM149 833v106h834v-106h-834z" />
<glyph unicode="&#x3e;" horiz-adv-x="1061" d="M124 122v124l632 274l108 27v6l-108 29l-632 271v123l845 -378v-97z" />
<glyph unicode="?" horiz-adv-x="930" d="M81 1122q-3 165 104 260t273 95q179 0 280.5 -101t101.5 -273q0 -135 -66.5 -239.5t-188.5 -218.5q-62 -53 -75.5 -99t-13.5 -142h-119q1 131 22 182.5t114 136.5q108 112 157.5 187.5t49.5 191.5q0 128 -68 198t-194 70q-118 0 -190 -68.5t-73 -185.5h-112zM373 0v154 h139v-154h-139z" />
<glyph unicode="@" horiz-adv-x="1870" d="M122 478q18 424 252.5 683t609.5 259q391 0 587.5 -241.5t179.5 -665.5q-10 -216 -117 -375t-313 -159q-78 0 -130.5 51t-69.5 142q-53 -96 -131 -144.5t-180 -48.5q-131 0 -199 120t-49 317q23 254 141 407.5t286 153.5q94 0 151 -26.5t126 -81.5l-2 -2h3l-50 -574 q-10 -132 30 -180t95 -48q142 0 224.5 124.5t93.5 323.5q18 389 -150 604.5t-530 215.5q-323 0 -533 -235.5t-227 -619.5q-19 -379 163.5 -612.5t519.5 -233.5q88 0 178 22t152 57l31 -75q-64 -41 -167 -65t-198 -24q-380 0 -588 249.5t-189 681.5zM672 416 q-16 -155 26 -247t138 -92q86 0 156.5 43t122.5 157v8.5t1 7.5l47 544q-32 23 -71 36t-87 13q-134 0 -222 -119t-111 -351z" />
<glyph unicode="A" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM346 513h588l-290 788h-6z" />
<glyph unicode="B" horiz-adv-x="1269" d="M191 0v1456h425q227 0 353.5 -95.5t126.5 -287.5q0 -112 -63.5 -195t-172.5 -115q133 -24 216 -125t83 -233q0 -195 -126.5 -300t-338.5 -105h-503zM310 101h384q161 0 253 79.5t92 222.5q0 131 -83.5 215t-242.5 84h-403v-601zM310 803h335q158 0 244.5 69.5t86.5 204.5 q0 138 -92 207.5t-268 69.5h-306v-551z" />
<glyph unicode="C" horiz-adv-x="1313" d="M132 609v237q0 278 149 454.5t392 176.5q232 0 368 -123t155 -346l-2 -6h-112q-24 181 -124.5 277t-284.5 96q-191 0 -306.5 -148t-115.5 -379v-239q0 -234 115.5 -381.5t306.5 -147.5q184 0 285 94t124 281h112l2 -6q-19 -219 -156 -344.5t-367 -125.5 q-243 0 -392 175.5t-149 454.5z" />
<glyph unicode="D" horiz-adv-x="1344" d="M191 0v1456h423q267 0 441 -178t174 -457v-187q0 -280 -174 -457t-441 -177h-423zM310 101h304q216 0 355.5 151t139.5 382v190q0 228 -140 379t-355 151h-304v-1253z" />
<glyph unicode="E" horiz-adv-x="1180" d="M191 0v1456h917v-102h-798v-547h701v-102h-701v-604h803v-101h-922z" />
<glyph unicode="F" horiz-adv-x="1181" d="M191 0v1456h929v-102h-810v-569h708v-103h-708v-682h-119z" />
<glyph unicode="G" horiz-adv-x="1401" d="M146 600v267q0 270 154.5 440t400.5 170q235 0 367.5 -117.5t153.5 -305.5l-2 -6h-111q-26 146 -123 236.5t-285 90.5q-196 0 -315.5 -142t-119.5 -364v-269q0 -228 127 -374t332 -146q145 0 246.5 40.5t138.5 88.5v380h-387v102h507v-518q-49 -71 -178.5 -132.5 t-326.5 -61.5q-254 0 -416.5 173t-162.5 448z" />
<glyph unicode="H" horiz-adv-x="1448" d="M191 0v1456h119v-684h828v684h119v-1456h-119v670h-828v-670h-119z" />
<glyph unicode="I" horiz-adv-x="554" d="M217 0v1456h120v-1456h-120z" />
<glyph unicode="J" horiz-adv-x="1127" d="M82 395l2 6h112q0 -158 84 -239.5t240 -81.5q133 0 219 90.5t86 242.5v1043h120v-1043q0 -199 -118.5 -316.5t-306.5 -117.5q-205 0 -324 106q-114 102 -114 294v16z" />
<glyph unicode="K" horiz-adv-x="1308" d="M191 0v1456h119v-670h199l573 670h135l2 -5l-602 -711l645 -735l-2 -5h-142l-608 685h-200v-685h-119z" />
<glyph unicode="L" horiz-adv-x="1079" d="M191 0v1456h120v-1355h720v-101h-840z" />
<glyph unicode="M" horiz-adv-x="1775" d="M191 0v1456h157l535 -1282h6l537 1282h158v-1456h-119v643l10 637l-6 2l-541 -1282h-83l-540 1276l-6 -1l11 -632v-643h-119z" />
<glyph unicode="N" horiz-adv-x="1454" d="M191 0v1456h120l827 -1250l6 1v1249h119v-1456h-119l-827 1252l-6 -1v-1251h-120z" />
<glyph unicode="O" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239z" />
<glyph unicode="P" horiz-adv-x="1267" d="M191 0v1456h501q229 0 354.5 -116.5t125.5 -308.5q0 -194 -125.5 -310t-354.5 -116h-382v-605h-119zM310 707h382q180 0 270.5 91.5t90.5 230.5q0 140 -90 232.5t-271 92.5h-382v-647z" />
<glyph unicode="Q" horiz-adv-x="1379" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -164 -54.5 -295.5t-155.5 -214.5l250 -236l-83 -75l-264 249q-59 -29 -124.5 -43.5t-137.5 -14.5q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5 t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380v-239z" />
<glyph unicode="R" horiz-adv-x="1348" d="M188 0v1455h493q234 0 359 -102.5t125 -299.5q0 -116 -67 -207.5t-189 -133.5q135 -34 194.5 -121.5t59.5 -219.5v-137q0 -68 16 -122t53 -88v-24h-122q-37 36 -52 101t-15 135v133q0 134 -86.5 211.5t-241.5 77.5h-408v-658h-119zM307 760h359q197 0 288 79.5t91 214.5 q0 144 -90.5 221.5t-273.5 77.5h-374v-593z" />
<glyph unicode="S" horiz-adv-x="1231" d="M100 408l2 6h110q0 -170 127 -252t299 -82q173 0 279.5 76t106.5 201q0 119 -89 194.5t-310 133.5q-239 60 -362 156t-123 259q0 167 137.5 272t353.5 105q225 0 363 -125q134 -121 134 -295v-10l-3 -6h-110q0 146 -103.5 240t-280.5 94q-175 0 -273.5 -78t-98.5 -194 q0 -110 91 -183.5t314 -129.5q235 -60 357.5 -162t122.5 -269q0 -174 -142.5 -277t-363.5 -103q-218 -1 -380 109q-158 106 -158 308v12z" />
<glyph unicode="T" horiz-adv-x="1213" d="M45 1354v102h1122v-102h-501v-1354h-120v1354h-501z" />
<glyph unicode="U" horiz-adv-x="1374" d="M167 469v987h120v-987q0 -186 110 -287.5t287 -101.5q180 0 293 101t113 288v987h119v-987q0 -238 -145.5 -364t-379.5 -126q-231 0 -374 126.5t-143 363.5z" />
<glyph unicode="V" horiz-adv-x="1263" d="M32 1456h130l438 -1210l29 -97h6l29 97l437 1210h130l-543 -1456h-113z" />
<glyph unicode="W" horiz-adv-x="1834" d="M57 1456h123l265 -1044l44 -223l6 -1l55 224l308 1044h113l308 -1044l53 -225l6 1l47 224l263 1044h122l-374 -1456h-113l-327 1117l-38 153h-6l-37 -153l-330 -1117h-114z" />
<glyph unicode="X" horiz-adv-x="1256" d="M59 0l500 738l-485 718h145l409 -622l411 622h145l-484 -718l500 -738h-143l-427 642l-426 -642h-145z" />
<glyph unicode="Y" horiz-adv-x="1244" d="M33 1456h139l448 -809l451 809h139l-531 -924v-532h-119v539z" />
<glyph unicode="Z" horiz-adv-x="1224" d="M95 0v92l858 1262h-831v102h977v-87l-861 -1268h893v-101h-1036z" />
<glyph unicode="[" horiz-adv-x="491" d="M163 -312v1976h330v-102h-210v-1772h210v-102h-330z" />
<glyph unicode="\" horiz-adv-x="807" d="M48 1456h117l608 -1581h-117z" />
<glyph unicode="]" horiz-adv-x="491" d="M0 -210h211v1772h-211v102h331v-1976h-331v102z" />
<glyph unicode="^" horiz-adv-x="852" d="M77 729l299 727h90l298 -727h-116l-196 484l-30 106h-6l-30 -106l-193 -484h-116z" />
<glyph unicode="_" horiz-adv-x="884" d="M1 0h881v-101h-881v101z" />
<glyph unicode="`" horiz-adv-x="585" d="M93 1471l2 5h154l202 -266h-117z" />
<glyph unicode="a" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6v12q0 114 110 204q116 96 297 96q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5z" />
<glyph unicode="b" d="M157 0v1560h120v-648q54 91 138 140.5t200 49.5q195 0 305 -155.5t110 -414.5v-21q0 -243 -110 -387.5t-303 -144.5q-119 0 -205 47.5t-139 136.5l-13 -163h-103zM277 288q40 -94 119.5 -149.5t197.5 -55.5q157 0 236 116t79 312v21q0 207 -80 336.5t-237 129.5 q-125 0 -201.5 -62t-113.5 -159v-489z" />
<glyph unicode="c" horiz-adv-x="1061" d="M97 520v42q0 236 121 388t340 152q178 0 296 -105q115 -102 115 -265v-11l-2 -6h-107q0 130 -87.5 207.5t-214.5 77.5q-174 0 -257.5 -124.5t-83.5 -313.5v-42q0 -192 83 -316t259 -124q119 0 210 68t91 189h106l2 -6v-11q0 -142 -120 -240q-125 -101 -289 -101 q-221 0 -341.5 151.5t-120.5 389.5z" />
<glyph unicode="d" d="M111 511v21q0 259 109.5 414.5t305.5 155.5q113 0 196 -48t138 -136v642h119v-1560h-106l-10 157q-54 -86 -139 -132t-200 -46q-194 0 -303.5 144.5t-109.5 387.5zM231 511q0 -196 78.5 -312t236.5 -116q116 0 193.5 52t120.5 144v508q-41 94 -116 152.5t-196 58.5 q-158 0 -237.5 -129.5t-79.5 -336.5v-21z" />
<glyph unicode="e" horiz-adv-x="1055" d="M92 509v55q0 232 133.5 385t323.5 153q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 191 31t135 89l51 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-203 0 -337.5 150t-134.5 380zM221 644l2 -5h634v30q0 141 -83 236t-225 95q-133 0 -223 -101.5 t-105 -254.5z" />
<glyph unicode="f" horiz-adv-x="673" d="M66 984v98h179v158q0 163 81.5 252t228.5 89q33 0 67 -5t69 -14l-15 -99q-24 6 -49.5 9.5t-59.5 3.5q-98 0 -150 -62t-52 -174v-158h258v-98h-258v-984h-120v984h-179z" />
<glyph unicode="g" horiz-adv-x="1141" d="M111 511v21q0 259 110.5 414.5t307.5 155.5q115 0 199 -50.5t139 -142.5l14 173h101v-1068q0 -209 -115.5 -330t-321.5 -121q-78 0 -166 19t-154 52l31 101q64 -32 135 -48.5t152 -16.5q158 0 238.5 91t80.5 253v136q-55 -82 -139 -126.5t-196 -44.5q-195 0 -305.5 145 t-110.5 387zM231 511q0 -195 80 -311.5t238 -116.5q116 0 193.5 53t119.5 146v502q-39 94 -114.5 154t-196.5 60q-158 0 -239 -130t-81 -336v-21z" />
<glyph unicode="h" d="M158 0v1560h120v-663q54 97 144 151t210 54q171 0 262.5 -106t91.5 -329v-667h-120v669q0 176 -69.5 252.5t-191.5 76.5q-123 0 -205.5 -64.5t-121.5 -171.5v-762h-120z" />
<glyph unicode="i" horiz-adv-x="465" d="M173 0v1082h119v-1082h-119zM173 1392v168h119v-168h-119z" />
<glyph unicode="j" horiz-adv-x="484" d="M-115 -418l13 101q16 -5 44 -10t49 -5q89 0 139 61.5t50 181.5v1171h119v-1171q0 -167 -80 -257.5t-222 -90.5q-30 0 -56.5 5t-55.5 14zM174 1396v164h119v-164h-119z" />
<glyph unicode="k" horiz-adv-x="1006" d="M159 0v1560h120v-930h126l402 452h140l2 -5l-433 -488l478 -584l-3 -5h-137l-437 527h-138v-527h-120z" />
<glyph unicode="l" horiz-adv-x="465" d="M173 0v1560h119v-1560h-119z" />
<glyph unicode="m" horiz-adv-x="1815" d="M152 0v1082h107l11 -179q52 95 138.5 147t206.5 52q124 0 207.5 -60t119.5 -183q49 114 139.5 178.5t220.5 64.5q173 0 267 -115t94 -356v-631h-120v633q0 200 -70.5 282.5t-196.5 82.5q-139 0 -215 -87t-94 -223q0 -7 0.5 -20t0.5 -19v-649h-121v633q0 196 -71.5 280.5 t-196.5 84.5q-127 0 -201.5 -64.5t-104.5 -173.5v-760h-121z" />
<glyph unicode="n" d="M158 0v1082h106l11 -189q52 100 140.5 154.5t209.5 54.5q176 0 268 -107.5t92 -335.5v-659h-120v658q0 186 -69.5 263t-197.5 77q-126 0 -205.5 -66.5t-114.5 -176.5v-755h-120z" />
<glyph unicode="o" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33z" />
<glyph unicode="p" d="M157 -416v1498h101l15 -168q54 90 139.5 139t201.5 49q195 0 305 -155.5t110 -414.5v-21q0 -243 -110 -387.5t-303 -144.5q-114 0 -199.5 43t-139.5 123v-561h-120zM277 271q41 -89 118.5 -140t193.5 -51q157 0 238.5 118t81.5 313v21q0 206 -82 336t-240 130 q-121 0 -196.5 -57.5t-113.5 -149.5v-520z" />
<glyph unicode="q" d="M111 511v21q0 259 109.5 414.5t305.5 155.5q111 0 194.5 -46.5t137.5 -132.5l12 159h104v-1498h-119v558q-55 -79 -138 -121t-193 -42q-194 0 -303.5 144.5t-109.5 387.5zM231 511q0 -196 78.5 -313.5t236.5 -117.5q112 0 188.5 50.5t120.5 137.5v530 q-41 89 -116.5 145.5t-190.5 56.5q-158 0 -237.5 -130.5t-79.5 -337.5v-21z" />
<glyph unicode="r" horiz-adv-x="697" d="M158 0v1082h105l15 -180v-12q47 100 126 156t188 56q23 0 44.5 -3.5t35.5 -7.5l-16 -112l-89 6q-113 0 -185.5 -63.5t-103.5 -174.5v-747h-120z" />
<glyph unicode="s" horiz-adv-x="1043" d="M110 297l2 6h110q7 -117 95.5 -170t208.5 -53q130 0 205 57t75 138q0 76 -62.5 133t-225.5 93q-194 42 -286.5 111t-92.5 195q0 124 104.5 209.5t276.5 85.5q183 0 290 -90q102 -86 102 -215v-12l-2 -6h-111q0 89 -75.5 155t-203.5 66q-131 0 -196.5 -56.5t-65.5 -132.5 q0 -75 56.5 -124t225.5 -86q193 -43 289 -117.5t96 -202.5q0 -135 -109.5 -218.5t-289.5 -83.5q-198 0 -310 94q-107 89 -106 211v13z" />
<glyph unicode="t" horiz-adv-x="680" d="M38 984v98h187v277h121v-277h238v-98h-238v-705q0 -106 38.5 -150.5t102.5 -44.5q29 0 56.5 2.5t63.5 8.5l18 -89q-30 -13 -73 -20t-86 -7q-114 0 -177.5 72t-63.5 228v705h-187z" />
<glyph unicode="u" d="M154 455v627h120v-629q0 -198 67.5 -284t191.5 -86q136 0 217 61t113 168v770h120v-1082h-106l-10 177q-52 -95 -140 -146.5t-208 -51.5q-171 0 -268 116t-97 360z" />
<glyph unicode="v" horiz-adv-x="1002" d="M44 1082h124l298 -811l35 -127h6l38 127l294 811h124l-411 -1082h-96z" />
<glyph unicode="w" horiz-adv-x="1550" d="M65 1082h124l202 -731l41 -193h6l51 193l230 731h103l230 -731l52 -198h6l45 198l197 731h124l-315 -1082h-102l-240 740l-47 187h-6l-48 -187l-236 -740h-103z" />
<glyph unicode="x" horiz-adv-x="1002" d="M50 0l383 551l-367 531h141l291 -442l293 442h142l-367 -531l382 -551h-140l-308 461l-308 -461h-142z" />
<glyph unicode="y" horiz-adv-x="1002" d="M35 1082h133l297 -789l38 -129h6l327 918h134l-470 -1255q-42 -110 -109 -187t-196 -77q-21 0 -51 4.5t-44 9.5l14 100q12 -2 38.5 -4.5t38.5 -2.5q78 0 125 55.5t80 142.5l57 146z" />
<glyph unicode="z" horiz-adv-x="1002" d="M90 0v88l652 891h-632v103h783v-89l-655 -892h703v-101h-851z" />
<glyph unicode="{" horiz-adv-x="676" d="M68 543v104q118 0 174.5 67t56.5 190v228q0 171 77.5 290.5t260.5 174.5l26 -79q-127 -41 -185.5 -142t-58.5 -244v-228q0 -110 -45.5 -191t-138.5 -118q93 -39 138.5 -120.5t45.5 -190.5v-226q0 -143 59.5 -241.5t187.5 -140.5l-29 -80q-183 55 -260.5 173.5 t-77.5 288.5v226q0 122 -56.5 190.5t-174.5 68.5z" />
<glyph unicode="|" horiz-adv-x="452" d="M178 -270v1726h101v-1726h-101z" />
<glyph unicode="}" horiz-adv-x="676" d="M9 -324q127 42 187 140.5t60 241.5v226q0 112 47 193t146 117q-99 35 -146 116t-47 194v228q0 144 -58.5 244.5t-185.5 141.5l26 79q182 -55 260 -174.5t78 -290.5v-228q0 -122 56 -189.5t175 -67.5v-104q-119 0 -175 -68.5t-56 -190.5v-226q0 -170 -77.5 -288.5 t-260.5 -173.5z" />
<glyph unicode="~" horiz-adv-x="1402" d="M143 474q0 131 79 222t202 91q87 0 160.5 -37t162.5 -113q63 -57 116.5 -82.5t110.5 -25.5q77 0 131 64t54 162l98 -15q0 -129 -81 -223t-202 -94q-88 0 -160.5 35.5t-160.5 114.5q-64 54 -118.5 80.5t-110.5 26.5q-79 0 -131.5 -60.5t-52.5 -160.5z" />
<glyph unicode="&#xa1;" horiz-adv-x="452" d="M145 898v184h142v-184h-142zM156 -374v978h120v-978h-120z" />
<glyph unicode="&#xa2;" horiz-adv-x="1115" d="M122 520v42q0 217 103 364.5t292 171.5v220h120v-219q158 -17 259.5 -119t98.5 -259l-3 -6h-107q0 130 -87.5 207.5t-214.5 77.5q-174 0 -257.5 -124.5t-83.5 -313.5v-42q0 -192 83 -316t259 -124q119 0 210 68t91 189h107l2 -6q4 -137 -102 -234t-255 -115v-227h-120 v228q-190 23 -292.5 170.5t-102.5 366.5z" />
<glyph unicode="&#xa3;" horiz-adv-x="1170" d="M67 642v102h203l-11 296q0 204 106 320.5t284 116.5q187 0 281 -103.5t91 -277.5l-3 -6h-112q0 148 -68.5 216.5t-188.5 68.5q-125 0 -197.5 -88t-72.5 -247l11 -296h450v-102h-447l7 -176q0 -107 -25.5 -204t-71.5 -161h769v-101h-941v101h10q70 15 105 130t35 235 l-7 176h-207z" />
<glyph unicode="&#xa4;" horiz-adv-x="1481" d="M109 60l159 161q-60 81 -92 179t-32 208q0 112 34.5 214t98.5 184l-168 171l85 87l167 -170q78 67 175 103.5t204 36.5q106 0 203 -37.5t176 -104.5l170 173l86 -88l-171 -175q62 -82 96 -182.5t34 -211.5q0 -108 -32 -206t-90 -178l163 -164l-86 -87l-158 160 q-80 -74 -180.5 -113.5t-210.5 -39.5q-111 0 -211.5 39.5t-179.5 112.5l-155 -158zM257 608q0 -215 141.5 -366t341.5 -151q198 0 339.5 151t141.5 366q0 213 -141.5 363.5t-339.5 150.5q-200 0 -341.5 -150.5t-141.5 -363.5z" />
<glyph unicode="&#xa5;" horiz-adv-x="1223" d="M45 1456h139l423 -723l424 723h139l-455 -751h371v-102h-421v-175h421v-102h-421v-326h-119v326h-416v102h416v175h-416v102h370z" />
<glyph unicode="&#xa6;" horiz-adv-x="444" d="M159 -270v771h120v-771h-120zM159 698v758h120v-758h-120z" />
<glyph unicode="&#xa7;" horiz-adv-x="1239" d="M108 -70l2 6l112 2q0 -173 113 -252t271 -79q163 0 255.5 70.5t92.5 181.5q0 106 -77 166t-292 121q-243 61 -360 149.5t-117 255.5q0 98 58.5 169t164.5 105q-90 49 -134 119.5t-44 175.5q0 161 128 259t343 98q222 0 346.5 -111.5t120.5 -313.5l-2 -6h-112 q0 141 -94 235t-259 94q-173 0 -262 -71t-89 -181q0 -114 74 -173t299 -122q247 -65 360 -148.5t113 -248.5q0 -98 -61 -168.5t-171 -103.5q94 -50 141 -120.5t47 -177.5q0 -166 -127.5 -261t-341.5 -95q-213 0 -358 102.5t-140 322.5zM228 553q0 -116 79 -175t323 -127 q34 -10 65 -19t60 -18q115 13 179.5 71.5t64.5 142.5q0 108 -85 170.5t-318 130.5q-40 9 -75.5 19.5t-66.5 22.5q-112 -14 -169 -73t-57 -145z" />
<glyph unicode="&#xa8;" horiz-adv-x="959" d="M162 1299v157h174v-157h-174zM632 1299v157h173v-157h-173z" />
<glyph unicode="&#xa9;" horiz-adv-x="1637" d="M107 729q0 315 207 531t503 216q295 0 502 -216t207 -531q0 -316 -207.5 -533t-501.5 -217q-296 0 -503 217t-207 533zM192 729q0 -279 182.5 -471.5t442.5 -192.5q257 0 440.5 192.5t183.5 471.5q0 277 -183 468.5t-441 191.5q-260 0 -442.5 -191.5t-182.5 -468.5z M474 669v119q0 172 91 279.5t242 107.5q147 0 230 -79t79 -228l-2 -6h-91q0 113 -55 168t-161 55q-110 0 -172 -83.5t-62 -212.5v-120q0 -132 61.5 -214.5t172.5 -82.5q107 0 161 54t54 170h91l2 -6q4 -150 -78.5 -229t-229.5 -79q-151 0 -242 106.5t-91 280.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="906" d="M135 920q0 105 79 163t229 58h182v61q0 85 -41 131.5t-120 46.5q-92 0 -142.5 -37.5t-50.5 -108.5l-99 9l-2 6q-5 98 77 163t217 65q123 0 196.5 -71.5t73.5 -204.5v-314q0 -48 6 -92.5t20 -88.5h-111q-9 25 -14.5 52.5t-7.5 55.5q-37 -53 -98.5 -87.5t-144.5 -34.5 q-119 0 -184 61t-65 167zM243 924q0 -66 39.5 -101.5t121.5 -35.5q70 0 135.5 38t85.5 85v147h-181q-96 0 -148.5 -38.5t-52.5 -94.5z" />
<glyph unicode="&#xab;" horiz-adv-x="933" d="M123 541v19l295 379h105l-276 -389l276 -388h-105zM432 541v19l295 379h105l-276 -389l276 -388h-105z" />
<glyph unicode="&#xac;" horiz-adv-x="1117" d="M124 670v106h812v-390h-120v284h-692z" />
<glyph unicode="&#xad;" horiz-adv-x="586" d="M49 570v101h479v-101h-479z" />
<glyph unicode="&#xae;" horiz-adv-x="1642" d="M102 729q0 315 207 531t503 216q295 0 502.5 -216t207.5 -531q0 -316 -207.5 -533t-502.5 -217q-296 0 -503 217t-207 533zM187 729q0 -279 183 -471.5t442 -192.5q258 0 441 192.5t183 471.5q0 277 -183 468.5t-441 191.5q-259 0 -442 -191.5t-183 -468.5zM552 316v850 h258q147 0 226 -63t79 -185q0 -68 -36.5 -117.5t-104.5 -79.5q68 -25 98 -78t30 -128v-56q0 -40 4 -73t13 -54v-16h-102q-10 21 -12 61.5t-2 82.5v54q0 84 -38 121t-127 37h-188v-356h-98zM650 763h181q79 0 132.5 40.5t53.5 112.5q0 85 -46 122t-161 37h-160v-312z" />
<glyph unicode="&#xaf;" horiz-adv-x="874" d="M106 1359v97h670v-97h-670z" />
<glyph unicode="&#xb0;" horiz-adv-x="774" d="M143 1227q0 102 72 176t173 74q99 0 170.5 -74t71.5 -176q0 -104 -71 -175.5t-171 -71.5q-101 0 -173 72t-72 175zM233 1227q0 -68 44.5 -112t110.5 -44q65 0 108.5 44t43.5 112t-43.5 113.5t-108.5 45.5q-66 0 -110.5 -46t-44.5 -113z" />
<glyph unicode="&#xb1;" horiz-adv-x="1086" d="M85 728v101h414v438h110v-438h392v-101h-392v-439h-110v439h-414zM193 48v102h835v-102h-835z" />
<glyph unicode="&#xb2;" horiz-adv-x="835" d="M118 667v90l315 282q77 71 104 115.5t27 91.5q0 64 -39 103t-118 39q-87 0 -134 -42t-47 -108h-100l-2 6q-6 97 72.5 166t210.5 69q124 0 195 -60.5t71 -173.5q0 -75 -47 -136t-150 -158l-214 -188l2 -6h423v-90h-569z" />
<glyph unicode="&#xb3;" horiz-adv-x="852" d="M120 882l2 6h101q0 -63 51 -103t135 -40q90 0 140.5 38t50.5 103q0 75 -46.5 109.5t-139.5 34.5h-122v89h122q88 0 130.5 35t42.5 99q0 59 -45 96.5t-133 37.5q-75 0 -124.5 -35.5t-49.5 -93.5h-99l-2 6q-6 94 74.5 154t200.5 60q132 0 209 -58.5t77 -166.5 q0 -58 -35.5 -105t-98.5 -72q72 -22 110 -70.5t38 -119.5q0 -109 -83.5 -170t-216.5 -61q-121 0 -207.5 58.5t-81.5 168.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="576" d="M116 1212l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xb5;" d="M162 -416v1498h119v-633q0 -207 71 -288t192 -81q137 0 212 59.5t103 170.5v772h120v-1082h-103l-11 155q-48 -85 -126 -130.5t-187 -45.5q-88 0 -157 30t-114 96v-521h-119z" />
<glyph unicode="&#xb6;" horiz-adv-x="973" d="M82 988q0 207 129.5 337.5t362.5 130.5h226v-1456h-120v520h-106q-233 0 -362.5 129.5t-129.5 338.5z" />
<glyph unicode="&#xb7;" horiz-adv-x="503" d="M166 624v180h155v-180h-155z" />
<glyph unicode="&#xb8;" horiz-adv-x="498" d="M98 -357q90 0 151.5 30.5t61.5 89.5q0 57 -41.5 79.5t-145.5 30.5l29 127h93l-12 -64q79 -9 127.5 -48.5t48.5 -122.5q0 -91 -79 -145.5t-226 -54.5z" />
<glyph unicode="&#xb9;" horiz-adv-x="511" d="M87 1361v93l257 23v-812h-109v703z" />
<glyph unicode="&#xba;" horiz-adv-x="922" d="M135 1026v116q0 148 87.5 241.5t235.5 93.5t236 -93.5t88 -241.5v-116q0 -149 -87.5 -241.5t-234.5 -92.5q-149 0 -237 92.5t-88 241.5zM243 1026q0 -107 54.5 -173t162.5 -66q103 0 158.5 66.5t55.5 172.5v116q0 104 -56 171t-160 67t-159.5 -67t-55.5 -171v-116z" />
<glyph unicode="&#xbb;" horiz-adv-x="928" d="M130 162l276 388l-276 389h105l295 -379v-19l-295 -379h-105zM445 162l276 388l-276 389h105l295 -379v-19l-295 -379h-105z" />
<glyph unicode="&#xbc;" horiz-adv-x="1561" d="M160 1360v93l257 23v-812h-109v703zM326 177l711 1138l74 -48l-711 -1138zM771 237l429 564h113v-541h153v-90h-153v-170h-108v170h-430zM900 260h305v402l-6 1l-25 -43z" />
<glyph unicode="&#xbd;" horiz-adv-x="1567" d="M160 1360v93l257 23v-812h-109v703zM338 177l711 1138l74 -48l-711 -1138zM912 0v90l315 282q77 71 104 115.5t27 91.5q0 64 -39 103t-118 39q-87 0 -134 -42t-47 -108h-100l-2 6q-6 97 72.5 166t210.5 69q124 0 195 -60.5t71 -173.5q0 -75 -47 -136t-150 -158l-214 -188 l2 -6h423v-90h-569z" />
<glyph unicode="&#xbe;" horiz-adv-x="1712" d="M145 883l2 6h101q0 -63 51 -103t135 -40q90 0 140.5 38t50.5 103q0 75 -46.5 109.5t-139.5 34.5h-122v89h122q88 0 130.5 35t42.5 99q0 59 -45 96.5t-133 37.5q-75 0 -124.5 -35.5t-49.5 -93.5h-99l-2 6q-6 94 74.5 154t200.5 60q132 0 209 -58.5t77 -166.5 q0 -58 -35.5 -105t-98.5 -72q72 -22 110 -70.5t38 -119.5q0 -109 -83.5 -170t-216.5 -61q-121 0 -207.5 58.5t-81.5 168.5zM533 177l711 1138l74 -48l-711 -1138zM980 237l429 564h113v-541h153v-90h-153v-170h-108v170h-430zM1109 260h305v402l-6 1l-25 -43z" />
<glyph unicode="&#xbf;" horiz-adv-x="958" d="M108 -20q0 133 66 237.5t189 219.5q61 52 75 98.5t14 142.5h120q-2 -131 -23.5 -183t-113.5 -136q-109 -113 -158 -188.5t-49 -189.5q0 -128 67.5 -198t194.5 -70q117 0 189 68.5t74 185.5h112l2 -6q2 -165 -105 -260t-272 -95q-180 0 -281 101t-101 273zM436 928v155 h139v-155h-139z" />
<glyph unicode="&#xc0;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM346 513h588l-290 788h-6zM370 1822l2 5h154l202 -266h-117z" />
<glyph unicode="&#xc1;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM346 513h588l-290 788h-6zM583 1557l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xc2;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM346 513h588l-290 788h-6zM382 1601v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xc3;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM313 1622q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89zM346 513h588l-290 788h-6z" />
<glyph unicode="&#xc4;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM341 1641v157h174v-157h-174zM346 513h588l-290 788h-6zM811 1641v157h173v-157h-173z" />
<glyph unicode="&#xc5;" horiz-adv-x="1279" d="M32 0l553 1456h113l549 -1456h-124l-150 406h-667l-150 -406h-124zM346 513h588l-290 788h-6zM487 1730q0 69 49.5 117.5t119.5 48.5q68 0 117 -48.5t49 -117.5q0 -71 -48.5 -117t-117.5 -46q-71 0 -120 46t-49 117zM565 1730q0 -39 26.5 -65t64.5 -26q37 0 62.5 25.5 t25.5 65.5t-25.5 66.5t-62.5 26.5q-38 0 -64.5 -27t-26.5 -66z" />
<glyph unicode="&#xc6;" horiz-adv-x="1865" d="M17 0l881 1456h864v-102h-694l23 -545h589v-102h-585l26 -606h702v-101h-817l-17 389h-597l-229 -389h-146zM459 502h526l-35 839l-6 1l-15 -44z" />
<glyph unicode="&#xc7;" horiz-adv-x="1313" d="M132 609v237q0 278 149 454.5t392 176.5q232 0 368 -123t155 -346l-2 -6h-112q-24 181 -124.5 277t-284.5 96q-191 0 -306.5 -148t-115.5 -379v-239q0 -234 115.5 -381.5t306.5 -147.5q184 0 285 94t124 281h112l2 -6q-19 -219 -156 -344.5t-367 -125.5 q-243 0 -392 175.5t-149 454.5zM580 -365q90 0 151.5 30.5t61.5 89.5q0 57 -41.5 79.5t-145.5 30.5l29 127h93l-12 -64q79 -9 127.5 -48.5t48.5 -122.5q0 -91 -79 -145.5t-226 -54.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1180" d="M191 0v1456h917v-102h-798v-547h701v-102h-701v-604h803v-101h-922zM335 1822l2 5h154l202 -266h-117z" />
<glyph unicode="&#xc9;" horiz-adv-x="1180" d="M191 0v1456h917v-102h-798v-547h701v-102h-701v-604h803v-101h-922zM548 1557l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xca;" horiz-adv-x="1180" d="M191 0v1456h917v-102h-798v-547h701v-102h-701v-604h803v-101h-922zM347 1601v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xcb;" horiz-adv-x="1180" d="M191 0v1456h917v-102h-798v-547h701v-102h-701v-604h803v-101h-922zM306 1641v157h174v-157h-174zM776 1641v157h173v-157h-173z" />
<glyph unicode="&#xcc;" horiz-adv-x="554" d="M-9 1822l2 5h154l202 -266h-117zM217 0v1456h120v-1456h-120z" />
<glyph unicode="&#xcd;" horiz-adv-x="554" d="M202 1557l207 266h147l3 -6l-249 -260h-108zM217 0v1456h120v-1456h-120z" />
<glyph unicode="&#xce;" horiz-adv-x="554" d="M3 1601v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110zM217 0v1456h120v-1456h-120z" />
<glyph unicode="&#xcf;" horiz-adv-x="554" d="M-38 1641v157h174v-157h-174zM217 0v1456h120v-1456h-120zM432 1641v157h173v-157h-173z" />
<glyph unicode="&#xd0;" horiz-adv-x="1374" d="M68 689v102h153v665h423q267 0 441 -178t174 -457v-187q0 -280 -174 -457t-441 -177h-423v689h-153zM340 101h304q216 0 355.5 151t139.5 382v190q0 228 -140 379t-355 151h-304v-563h340v-102h-340v-588z" />
<glyph unicode="&#xd1;" horiz-adv-x="1454" d="M191 0v1456h120l827 -1250l6 1v1249h119v-1456h-119l-827 1252l-6 -1v-1251h-120zM382 1622q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89z" />
<glyph unicode="&#xd2;" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239zM398 1843l2 5h154l202 -266h-117z" />
<glyph unicode="&#xd3;" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239zM611 1578l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xd4;" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239zM410 1622v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xd5;" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239zM341 1643q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89z" />
<glyph unicode="&#xd6;" horiz-adv-x="1378" d="M124 609v237q0 281 152 456t408 175q260 0 415 -175t155 -456v-237q0 -282 -154.5 -456t-414.5 -174q-256 0 -408.5 174t-152.5 456zM244 609q0 -238 116.5 -382t324.5 -144q213 0 331.5 143.5t118.5 382.5v239q0 236 -119.5 380t-331.5 144q-208 0 -324 -144t-116 -380 v-239zM369 1662v157h174v-157h-174zM839 1662v157h173v-157h-173z" />
<glyph unicode="&#xd7;" horiz-adv-x="1072" d="M93 318l358 365l-343 350l79 80l342 -350l343 350l79 -80l-343 -350l358 -365l-79 -79l-358 364l-357 -364z" />
<glyph unicode="&#xd8;" horiz-adv-x="1379" d="M124 609v237q0 281 152 456t408 175q109 0 201.5 -33t165.5 -95l96 156h104l-136 -222q67 -84 103 -195.5t36 -241.5v-237q0 -282 -154.5 -456t-414.5 -174q-92 0 -171.5 23.5t-144.5 68.5l-96 -155h-104l131 212q-86 84 -131 207.5t-45 273.5zM244 609 q0 -118 29.5 -214.5t85.5 -160.5l6 -1l627 1021q-58 57 -135.5 87.5t-172.5 30.5q-208 0 -324 -144t-116 -380v-239zM426 164q51 -40 116.5 -60.5t142.5 -20.5q213 0 331.5 143.5t118.5 382.5v239q0 97 -21.5 180.5t-60.5 144.5h-6z" />
<glyph unicode="&#xd9;" horiz-adv-x="1374" d="M167 469v987h120v-987q0 -186 110 -287.5t287 -101.5q180 0 293 101t113 288v987h119v-987q0 -238 -145.5 -364t-379.5 -126q-231 0 -374 126.5t-143 363.5zM409 1822l2 5h154l202 -266h-117z" />
<glyph unicode="&#xda;" horiz-adv-x="1374" d="M167 469v987h120v-987q0 -186 110 -287.5t287 -101.5q180 0 293 101t113 288v987h119v-987q0 -238 -145.5 -364t-379.5 -126q-231 0 -374 126.5t-143 363.5zM622 1557l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xdb;" horiz-adv-x="1374" d="M167 469v987h120v-987q0 -186 110 -287.5t287 -101.5q180 0 293 101t113 288v987h119v-987q0 -238 -145.5 -364t-379.5 -126q-231 0 -374 126.5t-143 363.5zM421 1601v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xdc;" horiz-adv-x="1374" d="M167 469v987h120v-987q0 -186 110 -287.5t287 -101.5q180 0 293 101t113 288v987h119v-987q0 -238 -145.5 -364t-379.5 -126q-231 0 -374 126.5t-143 363.5zM380 1641v157h174v-157h-174zM850 1641v157h173v-157h-173z" />
<glyph unicode="&#xdd;" horiz-adv-x="1244" d="M33 1456h139l448 -809l451 809h139l-531 -924v-532h-119v539zM545 1550l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xde;" horiz-adv-x="1214" d="M183 0v1456h120v-304h324q221 0 345 -115.5t124 -298.5q0 -185 -124 -299.5t-345 -114.5h-324v-324h-120zM303 425h324q173 0 261 92t88 219q0 130 -88 222.5t-261 92.5h-324v-626z" />
<glyph unicode="&#xdf;" horiz-adv-x="1200" d="M151 0v1082q0 204 102.5 317t273.5 113q140 0 232 -79.5t92 -222.5q0 -109 -61.5 -215.5t-61.5 -184.5q0 -86 184 -228t184 -287q0 -153 -110 -234.5t-266 -81.5q-86 0 -176.5 23.5t-129.5 56.5l34 101q41 -31 114.5 -55.5t143.5 -24.5q125 0 197.5 60t72.5 155 q0 99 -184 240.5t-184 276.5q0 93 63 201.5t63 190.5q0 92 -60 149.5t-137 57.5q-121 0 -193.5 -85.5t-72.5 -243.5v-1082h-120z" />
<glyph unicode="&#xe0;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5zM255 1501l2 5h154l202 -266h-117z" />
<glyph unicode="&#xe1;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5zM468 1236l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xe2;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5zM267 1280v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xe3;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM198 1301q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241 q-163 0 -260.5 -69.5t-97.5 -172.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5zM226 1320v157h174v-157h-174zM696 1320v157h173v-157h-173z" />
<glyph unicode="&#xe5;" horiz-adv-x="1101" d="M103 288q0 150 129.5 240t349.5 90h239v134q0 116 -74.5 182t-208.5 66q-125 0 -207.5 -63t-82.5 -154l-110 1l-2 6q-6 121 110.5 216.5t296.5 95.5q179 0 288 -91t109 -261v-532q0 -57 6.5 -111t21.5 -107h-125q-12 55 -17 95t-5 81q-60 -85 -160 -141t-225 -56 q-158 0 -245.5 84t-87.5 225zM222 284q0 -88 60.5 -143.5t167.5 -55.5q129 0 228 60.5t143 154.5v226h-241q-163 0 -260.5 -69.5t-97.5 -172.5zM372 1409q0 69 49.5 117.5t119.5 48.5q68 0 117 -48.5t49 -117.5q0 -71 -48.5 -117t-117.5 -46q-71 0 -120 46t-49 117z M450 1409q0 -39 26.5 -65t64.5 -26q37 0 62.5 25.5t25.5 65.5t-25.5 66.5t-62.5 26.5q-38 0 -64.5 -27t-26.5 -66z" />
<glyph unicode="&#xe6;" horiz-adv-x="1732" d="M77 293q0 158 113 248.5t326 90.5h262v88q0 134 -63 207t-187 73q-135 0 -213.5 -67t-78.5 -168l-110 12l-2 6q-5 138 106.5 228.5t297.5 90.5q124 0 212.5 -54t128.5 -157q61 99 156.5 155t209.5 56q200 0 311.5 -124t111.5 -340v-100h-754v-29q0 -191 89.5 -310 t271.5 -119q103 0 181.5 32.5t142.5 86.5l47 -87q-60 -55 -148.5 -94t-222.5 -39q-138 0 -241 55.5t-163 157.5q-49 -87 -159.5 -150t-269.5 -63q-170 0 -262.5 84.5t-92.5 229.5zM197 289q0 -97 65 -153.5t187 -56.5q102 0 197.5 53.5t131.5 115.5v288h-260 q-155 0 -238 -71t-83 -176zM912 641l2 -5h625v31q0 146 -77.5 239.5t-226.5 93.5q-138 0 -224 -101.5t-99 -257.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1061" d="M97 520v42q0 236 121 388t340 152q178 0 296.5 -105t114.5 -276l-2 -6h-107q0 130 -87.5 207.5t-214.5 77.5q-174 0 -257.5 -124.5t-83.5 -313.5v-42q0 -192 83 -316t259 -124q119 0 210 68t91 189h106l2 -6q5 -150 -120 -251t-289 -101q-221 0 -341.5 151.5 t-120.5 389.5zM444 -365q90 0 151.5 30.5t61.5 89.5q0 57 -41.5 79.5t-145.5 30.5l29 127h93l-12 -64q79 -9 127.5 -48.5t48.5 -122.5q0 -91 -79 -145.5t-226 -54.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1055" d="M92 509v55q0 232 133.5 385t323.5 153q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 191 31t135 89l51 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-203 0 -337.5 150t-134.5 380zM221 644l2 -5h634v30q0 141 -83 236t-225 95q-133 0 -223 -101.5 t-105 -254.5zM274 1501l2 5h154l202 -266h-117z" />
<glyph unicode="&#xe9;" horiz-adv-x="1055" d="M92 509v55q0 232 133.5 385t323.5 153q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 191 31t135 89l51 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-203 0 -337.5 150t-134.5 380zM221 644l2 -5h634v30q0 141 -83 236t-225 95q-133 0 -223 -101.5 t-105 -254.5zM487 1236l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xea;" horiz-adv-x="1055" d="M92 509v55q0 232 133.5 385t323.5 153q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 191 31t135 89l51 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-203 0 -337.5 150t-134.5 380zM221 644l2 -5h634v30q0 141 -83 236t-225 95q-133 0 -223 -101.5 t-105 -254.5zM286 1280v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xeb;" horiz-adv-x="1055" d="M92 509v55q0 232 133.5 385t323.5 153q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 191 31t135 89l51 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-203 0 -337.5 150t-134.5 380zM221 644l2 -5h634v30q0 141 -83 236t-225 95q-133 0 -223 -101.5 t-105 -254.5zM245 1320v157h174v-157h-174zM715 1320v157h173v-157h-173z" />
<glyph unicode="&#xec;" horiz-adv-x="456" d="M-58 1479l2 5h154l202 -266h-117zM168 0v1082h120v-1082h-120z" />
<glyph unicode="&#xed;" horiz-adv-x="456" d="M153 1214l207 266h147l3 -6l-249 -260h-108zM168 0v1082h120v-1082h-120z" />
<glyph unicode="&#xee;" horiz-adv-x="456" d="M-46 1258v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110zM168 0v1082h120v-1082h-120z" />
<glyph unicode="&#xef;" horiz-adv-x="456" d="M-87 1299v157h174v-157h-174zM168 0v1082h120v-1082h-120zM383 1299v157h173v-157h-173z" />
<glyph unicode="&#xf0;" horiz-adv-x="1191" d="M99 455q0 235 130 372.5t348 137.5q104 0 193 -40t143 -107l4 5q-18 131 -68 234t-126 182l-308 -176l-50 74l287 164q-45 33 -94.5 61t-103.5 51l39 104q77 -30 144 -68t124 -85l257 147l51 -74l-241 -138q111 -120 169 -288.5t58 -387.5v-88q0 -245 -137 -400.5 t-344 -155.5q-208 0 -341.5 137t-133.5 339zM219 455q0 -149 97 -261t262 -112q158 0 257.5 127.5t99.5 325.5v90q0 9 -0.5 27.5t-0.5 28.5q-38 76 -128 128t-229 52q-173 0 -265.5 -115t-92.5 -291z" />
<glyph unicode="&#xf1;" d="M158 0v1082h106l11 -189q52 100 140.5 154.5t209.5 54.5q176 0 268 -107.5t92 -335.5v-659h-120v658q0 186 -69.5 263t-197.5 77q-126 0 -205.5 -66.5t-114.5 -176.5v-755h-120zM233 1300q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20 q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89z" />
<glyph unicode="&#xf2;" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33zM294 1500l2 5h154 l202 -266h-117z" />
<glyph unicode="&#xf3;" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33zM507 1235l207 266 h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xf4;" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33zM306 1279v21 l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xf5;" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33zM237 1300 q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89z" />
<glyph unicode="&#xf6;" d="M91 524v33q0 239 131 392t347 153q217 0 348 -153t131 -392v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-218 0 -349 152.5t-131 392.5zM211 524q0 -188 95 -316t265 -128q167 0 262.5 128t95.5 316v33q0 185 -96 314t-264 129t-263 -129t-95 -314v-33zM265 1319v157h174 v-157h-174zM735 1319v157h173v-157h-173z" />
<glyph unicode="&#xf7;" horiz-adv-x="1164" d="M72 644v116h998v-116h-998zM506 212v160h142v-160h-142zM506 1010v160h142v-160h-142z" />
<glyph unicode="&#xf8;" horiz-adv-x="1141" d="M91 524v33q0 239 131 392t347 153q60 0 114 -12.5t102 -36.5l79 161h93l-101 -207q91 -72 141.5 -189t50.5 -261v-33q0 -240 -130.5 -392.5t-346.5 -152.5q-55 0 -104.5 10.5t-94.5 30.5l-78 -160h-93l99 202q-100 70 -154.5 190.5t-54.5 271.5zM211 524q0 -112 35 -206 t100 -149h6l385 787q-36 21 -78.5 32.5t-89.5 11.5q-168 0 -263 -129t-95 -314v-33zM418 114q33 -17 71.5 -25.5t81.5 -8.5q167 0 262.5 128t95.5 316v33q0 102 -32 192t-89 147h-6z" />
<glyph unicode="&#xf9;" d="M154 455v627h120v-629q0 -198 67.5 -284t191.5 -86q136 0 217 61t113 168v770h120v-1082h-106l-10 177q-52 -95 -140 -146.5t-208 -51.5q-171 0 -268 116t-97 360zM292 1479l2 5h154l202 -266h-117z" />
<glyph unicode="&#xfa;" d="M154 455v627h120v-629q0 -198 67.5 -284t191.5 -86q136 0 217 61t113 168v770h120v-1082h-106l-10 177q-52 -95 -140 -146.5t-208 -51.5q-171 0 -268 116t-97 360zM505 1214l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xfb;" d="M154 455v627h120v-629q0 -198 67.5 -284t191.5 -86q136 0 217 61t113 168v770h120v-1082h-106l-10 177q-52 -95 -140 -146.5t-208 -51.5q-171 0 -268 116t-97 360zM304 1258v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#xfc;" d="M154 455v627h120v-629q0 -198 67.5 -284t191.5 -86q136 0 217 61t113 168v770h120v-1082h-106l-10 177q-52 -95 -140 -146.5t-208 -51.5q-171 0 -268 116t-97 360zM263 1299v157h174v-157h-174zM733 1299v157h173v-157h-173z" />
<glyph unicode="&#xfd;" horiz-adv-x="1002" d="M35 1082h133l297 -789l38 -129h6l327 918h134l-470 -1255q-42 -110 -109 -187t-196 -77q-21 0 -51 4.5t-44 9.5l14 100q12 -2 38.5 -4.5t38.5 -2.5q78 0 125 55.5t80 142.5l57 146zM439 1214l207 266h147l3 -6l-249 -260h-108z" />
<glyph unicode="&#xfe;" horiz-adv-x="1151" d="M161 -416v1976h120v-640q54 87 138.5 134.5t198.5 47.5q195 0 305 -155.5t110 -414.5v-21q0 -243 -110 -387.5t-303 -144.5q-114 0 -199.5 43t-139.5 123v-561h-120zM281 271q41 -89 118.5 -140t193.5 -51q157 0 238.5 118t81.5 313v21q0 206 -82 336t-240 130 q-121 0 -196.5 -57.5t-113.5 -149.5v-520z" />
<glyph unicode="&#xff;" horiz-adv-x="1002" d="M35 1082h133l297 -789l38 -129h6l327 918h134l-470 -1255q-42 -110 -109 -187t-196 -77q-21 0 -51 4.5t-44 9.5l14 100q12 -2 38.5 -4.5t38.5 -2.5q78 0 125 55.5t80 142.5l57 146zM197 1299v157h174v-157h-174zM667 1299v157h173v-157h-173z" />
<glyph unicode="&#x152;" horiz-adv-x="1913" d="M108 576v304q0 264 148.5 430.5t387.5 166.5q75 0 152 -6t161 -15h862v-102h-798v-547h701v-102h-701v-604h803v-101h-867q-97 -10 -167.5 -15.5t-143.5 -5.5q-239 0 -388.5 166t-149.5 431zM228 576q0 -228 113.5 -361.5t304.5 -133.5q66 0 131.5 3.5t124.5 11.5v1264 q-60 7 -125 11t-133 4q-192 0 -304 -132t-112 -361v-306z" />
<glyph unicode="&#x153;" horiz-adv-x="1892" d="M94 524v33q0 239 131 392t347 153q146 0 255.5 -72.5t168.5 -199.5q59 125 166 198.5t234 73.5q199 0 313 -126t114 -336v-102h-764v-29q0 -183 97 -306t255 -123q112 0 190.5 31t134.5 89l52 -82q-61 -64 -154.5 -101.5t-222.5 -37.5q-139 0 -248.5 71.5t-168.5 197.5 q-58 -126 -167 -197.5t-253 -71.5q-218 0 -349 152.5t-131 392.5zM214 524q0 -188 95 -316t265 -128q167 0 262 128t95 316v33q0 185 -95.5 314t-263.5 129t-263 -129t-95 -314v-33zM1068 644l2 -5h633v30q0 141 -82.5 236t-224.5 95q-133 0 -223 -101.5t-105 -254.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1244" d="M33 1456h139l448 -809l451 809h139l-531 -924v-532h-119v539zM303 1634v157h174v-157h-174zM773 1634v157h173v-157h-173z" />
<glyph unicode="&#x2c6;" horiz-adv-x="880" d="M160 1252v21l227 221h98l230 -224v-18h-112l-167 168l-166 -168h-110z" />
<glyph unicode="&#x2dc;" horiz-adv-x="892" d="M102 1281q0 86 54 144.5t137 58.5q65 0 147 -55t135 -55q46 0 79 36t33 91l80 -20q0 -88 -55 -146t-137 -58q-74 0 -151 55t-131 55q-47 0 -79 -35t-32 -89z" />
<glyph unicode="&#x2000;" horiz-adv-x="948" />
<glyph unicode="&#x2001;" horiz-adv-x="1896" />
<glyph unicode="&#x2002;" horiz-adv-x="948" />
<glyph unicode="&#x2003;" horiz-adv-x="1896" />
<glyph unicode="&#x2004;" horiz-adv-x="632" />
<glyph unicode="&#x2005;" horiz-adv-x="474" />
<glyph unicode="&#x2006;" horiz-adv-x="316" />
<glyph unicode="&#x2007;" horiz-adv-x="316" />
<glyph unicode="&#x2008;" horiz-adv-x="237" />
<glyph unicode="&#x2009;" horiz-adv-x="379" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="586" d="M49 570v101h479v-101h-479z" />
<glyph unicode="&#x2011;" horiz-adv-x="586" d="M49 570v101h479v-101h-479z" />
<glyph unicode="&#x2012;" horiz-adv-x="586" d="M49 570v101h479v-101h-479z" />
<glyph unicode="&#x2013;" horiz-adv-x="1414" d="M165 686v102h1086v-102h-1086z" />
<glyph unicode="&#x2014;" horiz-adv-x="1667" d="M136 686v102h1336v-102h-1336z" />
<glyph unicode="&#x2018;" horiz-adv-x="364" d="M91 1074v174l111 312h71l-63 -312v-174h-119z" />
<glyph unicode="&#x2019;" horiz-adv-x="364" d="M91 1074l63 304v182h119v-179l-111 -307h-71z" />
<glyph unicode="&#x201a;" horiz-adv-x="353" d="M91 -211l52 266v204h119v-194l-100 -276h-71z" />
<glyph unicode="&#x201c;" horiz-adv-x="612" d="M91 1074v174l111 312h71l-63 -312v-174h-119zM338 1074v174l111 312h71l-63 -312v-174h-119z" />
<glyph unicode="&#x201d;" horiz-adv-x="617" d="M91 1074l63 304v182h119v-179l-111 -307h-71zM343 1074l63 304v182h119v-179l-111 -307h-71z" />
<glyph unicode="&#x201e;" horiz-adv-x="593" d="M91 -202l51 295v181h120v-175l-100 -301h-71zM330 -202l52 299v177h120v-175l-100 -301h-72z" />
<glyph unicode="&#x2022;" horiz-adv-x="662" d="M146 717v65q0 78 50.5 128.5t134.5 50.5q85 0 135.5 -50.5t50.5 -128.5v-65q0 -79 -50.5 -128t-134.5 -49q-85 0 -135.5 49t-50.5 128z" />
<glyph unicode="&#x2026;" horiz-adv-x="1313" d="M188 0v164h137v-164h-137zM598 0v164h137v-164h-137zM990 0v164h137v-164h-137z" />
<glyph unicode="&#x202f;" horiz-adv-x="379" />
<glyph unicode="&#x2039;" horiz-adv-x="609" d="M108 541v19l295 379h105l-276 -389l276 -388h-105z" />
<glyph unicode="&#x203a;" horiz-adv-x="609" d="M101 162l276 388l-276 389h105l295 -379v-19l-295 -379h-105z" />
<glyph unicode="&#x205f;" horiz-adv-x="474" />
<glyph unicode="&#x20ac;" horiz-adv-x="1073" d="M80 533v102h169v168h-169v102h169v37q0 244 135.5 389.5t355.5 145.5q57 0 112.5 -8t119.5 -23l-9 -106q-54 16 -110.5 25.5t-112.5 9.5q-172 0 -272 -116t-100 -315v-39h547v-102h-547v-168h547v-102h-547v-19q0 -198 101.5 -316t272.5 -118q57 0 113 8.5t108 25.5 l9 -104q-54 -15 -112.5 -23t-117.5 -8q-220 0 -356.5 145t-136.5 390v19h-169z" />
<glyph unicode="&#x2122;" horiz-adv-x="1264" d="M96 1387v69h384v-69h-152v-468h-74v468h-158zM558 919v537h94l171 -423h6l174 423h88v-537h-73v383l-6 1l-160 -384h-51l-165 399l-6 -1v-398h-72z" />
<glyph unicode="&#xe000;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1138" d="M66 984v98h179v158q0 163 81.5 252t228.5 89q33 0 67 -5t69 -14l-15 -99q-24 6 -49.5 9.5t-59.5 3.5q-98 0 -150 -62t-52 -174v-158h258v-98h-258v-984h-120v984h-179zM846 0v1560h119v-1560h-119z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1773" d="M66 984v98h179v158q0 163 81.5 252t228.5 89q33 0 67 -5t69 -14l-15 -99q-24 6 -49.5 9.5t-59.5 3.5q-98 0 -150 -62t-52 -174v-158h258v-98h-258v-984h-120v984h-179zM721 984v98h180v138q0 172 95 266.5t264 94.5q67 0 136 -15t140 -44l-20 -103q-61 25 -118 39 t-130 14q-122 0 -184.5 -65t-62.5 -187v-138h253v-98h-253v-984h-120v984h-180zM1481 0v1082h120v-1082h-120z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1811" d="M66 984v98h179v158q0 163 81.5 252t228.5 89q33 0 67 -5t69 -14l-15 -99q-24 6 -49.5 9.5t-59.5 3.5q-98 0 -150 -62t-52 -174v-158h258v-98h-258v-984h-120v984h-179zM739 984v98h179v158q0 163 81.5 252t228.5 89q33 0 67 -5t69 -14l-15 -99q-24 6 -49.5 9.5t-59.5 3.5 q-98 0 -150 -62t-52 -174v-158h258v-98h-258v-984h-120v984h-179zM1519 0v1560h119v-1560h-119z" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-18" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="224" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="61" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="234" />
<hkern u1="F" u2="&#x201e;" k="234" />
<hkern u1="F" u2="&#x201a;" k="234" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="59" />
<hkern u1="F" u2="&#xc4;" k="59" />
<hkern u1="F" u2="&#xc3;" k="59" />
<hkern u1="F" u2="&#xc2;" k="59" />
<hkern u1="F" u2="&#xc1;" k="59" />
<hkern u1="F" u2="&#xc0;" k="59" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="264" />
<hkern u1="F" u2="A" k="59" />
<hkern u1="F" u2="&#x2e;" k="234" />
<hkern u1="F" u2="&#x2c;" k="234" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="92" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="97" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="43" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="80" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="114" />
<hkern u1="T" u2="&#xc6;" k="179" />
<hkern u1="T" u2="&#xbb;" k="216" />
<hkern u1="T" u2="&#xab;" k="328" />
<hkern u1="T" u2="w" k="57" />
<hkern u1="T" u2="r" k="75" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-32" />
<hkern u1="r" u2="f" k="-15" />
<hkern u1="t" u2="&#xf6;" k="20" />
<hkern u1="t" u2="&#xf5;" k="20" />
<hkern u1="t" u2="&#xf4;" k="20" />
<hkern u1="t" u2="&#xf3;" k="20" />
<hkern u1="t" u2="&#xf2;" k="20" />
<hkern u1="t" u2="o" k="20" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="61" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="61" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="61" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="61" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="61" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="61" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="170" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="120" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="12" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="11" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="T" k="129" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="17" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="V" k="87" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="W" k="69" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="Y,Yacute,Ydieresis" k="94" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="u,ugrave,uacute,ucircumflex,udieresis" k="11" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="v,y,yacute,ydieresis" k="50" />
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" g2="z" k="-12" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="27" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="102" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="m,n,p,ntilde" k="23" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="64" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="138" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="65" />
<hkern g1="L" g2="T" k="275" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="54" />
<hkern g1="L" g2="V" k="175" />
<hkern g1="L" g2="W" k="143" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="239" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="44" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="133" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="138" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="324" />
<hkern g1="P" g2="X" k="31" />
<hkern g1="P" g2="Z" k="26" />
<hkern g1="P" g2="J" k="200" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="79" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="113" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="99" />
<hkern g1="T" g2="m,n,p,ntilde" k="109" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="99" />
<hkern g1="T" g2="s" k="116" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="95" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="72" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="218" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="232" />
<hkern g1="T" g2="J" k="240" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="225" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="37" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="46" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="94" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="73" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="211" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="52" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="67" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="20" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="107" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More