Compare commits
454 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8010e6220d | ||
|
09e6a6a4ad | ||
|
da772e6649 | ||
|
65b8f78ca1 | ||
|
23bcac2e55 | ||
|
e6a88eef35 | ||
|
6654c461a6 | ||
|
a48cb052c2 | ||
|
809d932087 | ||
|
19d906c5e4 | ||
|
2f933a90fd | ||
|
3607875714 | ||
|
fec8829041 | ||
|
f58e758a41 | ||
|
cebed0824f | ||
|
97120bd1f1 | ||
|
4237d0c7e3 | ||
|
243cdfefa2 | ||
|
a12a4cd8f2 | ||
|
989dca5792 | ||
|
c9eb06bb70 | ||
|
af89906b81 | ||
|
de71b1b397 | ||
|
2decee1d87 | ||
|
6a184b069b | ||
|
48db615ac8 | ||
|
bb9caa4838 | ||
|
3c11c3fc16 | ||
|
6c1dbc5e61 | ||
|
21bf1dd1a3 | ||
|
78aa2b491c | ||
|
53d2c7e89f | ||
|
cdf78db629 | ||
|
15c5725829 | ||
|
96653170a2 | ||
|
eade89da48 | ||
|
9b86049964 | ||
|
9e2bbd50b6 | ||
|
0d18266ad1 | ||
|
83ee0534f2 | ||
|
8ad00025ad | ||
|
7d08a7c9cd | ||
|
c8d5a5319e | ||
|
a08fa721cf | ||
|
89bc3137ba | ||
|
4d8d30f897 | ||
|
d67e9468c0 | ||
|
7dda36ab97 | ||
|
32df3e80b1 | ||
|
3c33969d23 | ||
|
c2aec5ae36 | ||
|
7afc908c32 | ||
|
c66ecbdd29 | ||
|
e61bccab36 | ||
|
cfeef98261 | ||
|
c949548150 | ||
|
829ccfca88 | ||
|
950fa84d1c | ||
|
5666729fcf | ||
|
3a13886af9 | ||
|
db6e0ccf63 | ||
|
35f2ebc2aa | ||
|
60ac4a3e86 | ||
|
c966d34b07 | ||
|
a05d7059fb | ||
|
facc1dc944 | ||
|
df2ebbf384 | ||
|
e210471c7a | ||
|
f42d552dad | ||
|
edfd9e46b6 | ||
|
27644776f3 | ||
|
a4797dcc73 | ||
|
677312648b | ||
|
ace460c69b | ||
|
b922fe35ab | ||
|
222e2166ff | ||
|
7dc25ec425 | ||
|
980835981f | ||
|
e425adc230 | ||
|
2ea7ef327e | ||
|
6c9d33f05c | ||
|
c584b51726 | ||
|
3c8fa3382b | ||
|
e5c75259e0 | ||
|
f78e437a42 | ||
|
8f61b1d320 | ||
|
84f3c6f7e6 | ||
|
bfb6c001a0 | ||
|
f0fa9f2033 | ||
|
c82cc30968 | ||
|
b0cb14b515 | ||
|
7f86d2aa0a | ||
|
482dd4db76 | ||
|
0f44fd2290 | ||
|
690d461693 | ||
|
f1ca72aee9 | ||
|
a3a6fc0d15 | ||
|
4f4fe5f06b | ||
|
c59f47f4b5 | ||
|
0ae810b8c6 | ||
|
ac9f42a8fe | ||
|
eab7e56ece | ||
|
7329515a4d | ||
|
6d6bf2df3a | ||
|
3008bfbe0a | ||
|
9399517cfb | ||
|
b117fe222d | ||
|
62567264f0 | ||
|
c054b3b0de | ||
|
83fb5b4d1b | ||
|
07a86800c9 | ||
|
688b5f29b6 | ||
|
e311f17062 | ||
|
b4cdb22e24 | ||
|
b63194c0aa | ||
|
0bab32315c | ||
|
7e881dd850 | ||
|
d6aaafb069 | ||
|
731fcb8829 | ||
|
af0e94a4b7 | ||
|
deda869cc5 | ||
|
434089395a | ||
|
048985bdf4 | ||
|
70d6d4246d | ||
|
70befe900c | ||
|
9fd81bf6c7 | ||
|
a388fe3acb | ||
|
d4946d931a | ||
|
9812654bfa | ||
|
557426246c | ||
|
d0a3e8f789 | ||
|
50b37f2ddd | ||
|
e4197012f6 | ||
|
df00a1e0a3 | ||
|
41327bfb03 | ||
|
66ef72a040 | ||
|
af660bc631 | ||
|
18edb13e76 | ||
|
e05431c847 | ||
|
5c61f95093 | ||
|
9a407c727a | ||
|
cad655a15b | ||
|
1fa5c53b72 | ||
|
d01b1a706c | ||
|
678d5fc532 | ||
|
c4e01fa566 | ||
|
e694622b83 | ||
|
1d16c96ca4 | ||
|
ab1f34726b | ||
|
c9f201755e | ||
|
094ef592a7 | ||
|
e7493c38d1 | ||
|
6fd0fcfdb5 | ||
|
6da534a961 | ||
|
f26e43144e | ||
|
427529171c | ||
|
cd146cf822 | ||
|
ced412372c | ||
|
2f6e650c1b | ||
|
5c125ca9b4 | ||
|
89c0939d58 | ||
|
8ea955fb23 | ||
|
73a297f23f | ||
|
95f1382fbf | ||
|
80df01c8ee | ||
|
c2df864119 | ||
|
2cc9356c32 | ||
|
89234c0163 | ||
|
1b7fe286a6 | ||
|
7c2d797ed0 | ||
|
4d2eedc56b | ||
|
ece0d9301f | ||
|
cc10cd88d3 | ||
|
b9f308c832 | ||
|
6816bd8bad | ||
|
0e026de5bd | ||
|
a419ad201d | ||
|
a66a4f62bd | ||
|
e721d2204b | ||
|
f293cf6e81 | ||
|
0cde1d4969 | ||
|
bd49bd6e33 | ||
|
84dc1fa151 | ||
|
5858e862d9 | ||
|
8b004a549a | ||
|
4a53e4207c | ||
|
6510de5d29 | ||
|
a6191320a1 | ||
|
a75ff0c061 | ||
|
0d45eb91db | ||
|
95edbc16bb | ||
|
15a5e3c779 | ||
|
0433432e62 | ||
|
e7ca73bbad | ||
|
8d8374b8e2 | ||
|
4dc5bbe601 | ||
|
55371f9c78 | ||
|
af63f4098f | ||
|
2b4939a875 | ||
|
d5d22844ab | ||
|
7dab00be87 | ||
|
67582d388a | ||
|
0671e7d456 | ||
|
c9e6af96d0 | ||
|
ee48a56603 | ||
|
4c03f39437 | ||
|
d8d425c963 | ||
|
ec64ac9f1d | ||
|
7ed682c186 | ||
|
9dcb579741 | ||
|
19f837aa41 | ||
|
b267491934 | ||
|
a369dddde8 | ||
|
29d87d7c48 | ||
|
4847f50093 | ||
|
7c848b1253 | ||
|
607aa46032 | ||
|
430193891f | ||
|
cbb82ed635 | ||
|
1dfb72703a | ||
|
5edf377f4b | ||
|
43a33d267a | ||
|
c4048f4c7b | ||
|
501c89ae3a | ||
|
5899497aa7 | ||
|
2c758a9981 | ||
|
66eb99e506 | ||
|
b583140077 | ||
|
f378c93dd3 | ||
|
5d29fa5e62 | ||
|
54f04c9141 | ||
|
fc0c706100 | ||
|
02ac9fa0d7 | ||
|
ca95c75df3 | ||
|
4ff86795b9 | ||
|
30eaec29d3 | ||
|
742d38c9ec | ||
|
56a4597784 | ||
|
b2a7d3584b | ||
|
b8167f89e5 | ||
|
c916472b22 | ||
|
bdfe7c5e69 | ||
|
749475799a | ||
|
daf9c807b5 | ||
|
5dfecfdee3 | ||
|
d267c03ee2 | ||
|
864e3c7a50 | ||
|
747e1a818d | ||
|
f468dbf427 | ||
|
88572e90d4 | ||
|
41fc7dd73d | ||
|
c87c588c79 | ||
|
5ab4b57411 | ||
|
3c936c6957 | ||
|
0ca903a146 | ||
|
4e91919990 | ||
|
e023a68780 | ||
|
17452cd5b6 | ||
|
c76f2c8483 | ||
|
90207f9b68 | ||
|
0ec5371b61 | ||
|
8549aeb466 | ||
|
504d3cd131 | ||
|
83ed298eba | ||
|
a90f2cb156 | ||
|
1a54bafdd5 | ||
|
3cc186f7e4 | ||
|
a2497d7564 | ||
|
c01c882081 | ||
|
af279df5c9 | ||
|
1ea7ce2589 | ||
|
476c577bc1 | ||
|
e3b91c4d71 | ||
|
1e2d7acf4a | ||
|
1def120616 | ||
|
25ddf2c651 | ||
|
e5d384e808 | ||
|
63351553d8 | ||
|
4630740ac7 | ||
|
0ff4884d3a | ||
|
2dfdedf7b0 | ||
|
e1fa5fb180 | ||
|
4e47f9eb68 | ||
|
c4c8955bc2 | ||
|
f47b808478 | ||
|
493367da5e | ||
|
4ca185cf45 | ||
|
8f4effbb8d | ||
|
a4ba7f277e | ||
|
c3f97a0cf1 | ||
|
c1b8fc1233 | ||
|
a481638c03 | ||
|
c12dfc7b4d | ||
|
34bc527709 | ||
|
ee134d0d7c | ||
|
f795ee7fd9 | ||
|
1bba75881f | ||
|
34db2d9efa | ||
|
91dd308952 | ||
|
3d97e26cde | ||
|
104c1ecbec | ||
|
88266ec4e3 | ||
|
f5be159187 | ||
|
1194d86460 | ||
|
76d6dca63f | ||
|
1b69e62e2e | ||
|
e89839359f | ||
|
177d113cd9 | ||
|
853fa87012 | ||
|
a592ca25ff | ||
|
a8c9926fa7 | ||
|
bf5587fe09 | ||
|
7c8a27e894 | ||
|
d248b11ffc | ||
|
1282e010ee | ||
|
d5d1ca948e | ||
|
a08704e8ed | ||
|
2a8c0c0c08 | ||
|
2ae0c98b4c | ||
|
c427050a92 | ||
|
43a0829f44 | ||
|
e9b8b91861 | ||
|
6f104f5056 | ||
|
e720efabdc | ||
|
45cb770e41 | ||
|
3f1cc66767 | ||
|
d1f5118bb5 | ||
|
b90f1f786e | ||
|
c6f424201b | ||
|
a7db8cf7cd | ||
|
e2ed0f5e55 | ||
|
d000e3c8a9 | ||
|
cf465a1184 | ||
|
f3119824f4 | ||
|
ef069c1689 | ||
|
68e5a9dfda | ||
|
fd1a31afb6 | ||
|
6d7d4a15d9 | ||
|
518a7d0dcc | ||
|
a4bdfe6b7d | ||
|
281269aa0d | ||
|
33521ebd31 | ||
|
18ae08de8f | ||
|
3d3c4ba02f | ||
|
89917c1582 | ||
|
90c6758562 | ||
|
5be8084473 | ||
|
8a066a4ec0 | ||
|
b98237fa44 | ||
|
c4f9388668 | ||
|
0f44b27e54 | ||
|
10d05e1870 | ||
|
921557161d | ||
|
eb092b9f20 | ||
|
28ca8a9f9f | ||
|
d7be56df7a | ||
|
ce2c163f4b | ||
|
5272462368 | ||
|
42354a6728 | ||
|
754fe3df91 | ||
|
a7a0350c1a | ||
|
a8b2ca7cfe | ||
|
e82867820b | ||
|
13305d111e | ||
|
ae37fa2bc5 | ||
|
c81db752f6 | ||
|
5d9d71dee8 | ||
|
1f558d46a4 | ||
|
36eb899c3b | ||
|
e223d752cb | ||
|
fcb503e885 | ||
|
c1055234d8 | ||
|
35ec98cf13 | ||
|
66a9138666 | ||
|
279582ff21 | ||
|
a9540ffabe | ||
|
8f02cb83ed | ||
|
5e94c8be7b | ||
|
ea6e9af5da | ||
|
1bb72262ba | ||
|
61ace7bd97 | ||
|
1a417cc36f | ||
|
00a11f4343 | ||
|
491bbacddd | ||
|
1b9daa0adb | ||
|
ccdc981756 | ||
|
b44dcc9f30 | ||
|
479ceb14e4 | ||
|
50e41d1999 | ||
|
f6e2073de0 | ||
|
271aab9746 | ||
|
8d9bf5cf17 | ||
|
ceb7ed093e | ||
|
abdbcbb741 | ||
|
51ac07cd34 | ||
|
4b29698c6c | ||
|
f93285846a | ||
|
44347db52e | ||
|
f2749ff17f | ||
|
3735342dfa | ||
|
fed6e1e82f | ||
|
58a59b624a | ||
|
1338918a89 | ||
|
831e7cdb3f | ||
|
2b8583e652 | ||
|
b0220e4200 | ||
|
0d94ef10ce | ||
|
544a1381fc | ||
|
bc17ef896e | ||
|
0bcbf999fb | ||
|
0c4c44f4b6 | ||
|
486956b762 | ||
|
8d1ef5291f | ||
|
611627ca97 | ||
|
732225b781 | ||
|
58f88075c8 | ||
|
e17ef5eccf | ||
|
70c697f094 | ||
|
4b5625e0b4 | ||
|
7df48870df | ||
|
4a309c49e5 | ||
|
b45899bf90 | ||
|
5ae3c8acfe | ||
|
ef5df5f01b | ||
|
9af7451a61 | ||
|
7048c550b7 | ||
|
f035627f42 | ||
|
7659ff1f77 | ||
|
3df4062a55 | ||
|
02bbbe668b | ||
|
2b82c8fdc9 | ||
|
93abaed0c2 | ||
|
b7fff6d452 | ||
|
d09f01db90 | ||
|
e0c1a58b84 | ||
|
1b82649cca | ||
|
9317e2a36b | ||
|
51aff8ccdc | ||
|
bdd3ea45af | ||
|
3eb5c77ac4 | ||
|
ccc85784c6 | ||
|
46806e8607 | ||
|
95f914d6bd | ||
|
0f86011106 | ||
|
acdd3c0602 | ||
|
05b7237add | ||
|
51f4e9e160 | ||
|
7bbac35d6b | ||
|
d280fe457c | ||
|
b5772af4c3 | ||
|
7ab79bb76e | ||
|
00e3cc26de | ||
|
4b491c43ff | ||
|
41233a933e |
@@ -1,6 +1,5 @@
|
||||
vendor/
|
||||
!/vendor/vendor.js
|
||||
/modules/**
|
||||
!/modules/default/**
|
||||
!/modules/node_helper
|
||||
!/modules/node_helper/**
|
||||
|
@@ -4,11 +4,13 @@
|
||||
"quotes": ["error", "double"],
|
||||
"max-len": ["error", 250],
|
||||
"curly": "error",
|
||||
"camelcase": ["error", {"properties": "never"}]
|
||||
"camelcase": ["error", {"properties": "never"}],
|
||||
"no-trailing-spaces": ["error"],
|
||||
"no-irregular-whitespace": ["error"]
|
||||
},
|
||||
"env": {
|
||||
"browser": true,
|
||||
"node": true,
|
||||
"es6": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
46
.github/CONTRIBUTING.md
vendored
@@ -3,31 +3,47 @@ Contribution Policy for MagicMirror²
|
||||
|
||||
Thanks for contributing to MagicMirror²!
|
||||
|
||||
We hold our code to standard, and these standards are documented below.
|
||||
We hold our code to standard, and these standards are documented below.
|
||||
|
||||
First, before you run the linters, you will need to install them all **and** install the development dependencies:
|
||||
If you wish to run both linters, use `grunt` without any arguments.
|
||||
|
||||
```bash
|
||||
(sudo) npm install -g jscs stylelint html-validator-cli
|
||||
npm install
|
||||
```
|
||||
### JavaScript: Run ESLint
|
||||
|
||||
### JavaScript: Run JSCS
|
||||
We use [ESLint](http://eslint.org) on our JavaScript files.
|
||||
|
||||
We use [JSCS](http://jscs.info) on our JavaScript files.
|
||||
Our ESLint configuration is in our .eslintrc.json and .eslintignore files.
|
||||
|
||||
Our JSCS configuration is in our .jscsrc file.
|
||||
|
||||
To run JSCS, use `npm run jscs`.
|
||||
To run ESLint, use `grunt eslint`.
|
||||
|
||||
### CSS: Run StyleLint
|
||||
|
||||
We use [StyleLint](http://stylelint.io) to lint our CSS. Our configuration is in our .stylelintrc file.
|
||||
|
||||
To run StyleLint, use `npm run stylelint`.
|
||||
To run StyleLint, use `grunt stylelint`.
|
||||
|
||||
### HTML: Run HTML Validator
|
||||
### Submitting Issues
|
||||
|
||||
We use [NU Validator](https://validator.w3.org/nu) to validate our HTML. The configuration is in the command in the package.json file.
|
||||
Please only submit reproducible issues.
|
||||
|
||||
To run HTML Validator, use `npm run htmlvalidator`.
|
||||
If you're not sure if it's a real bug or if it's just you, please open a topic on the forum: [https://forum.magicmirror.builders/category/15/bug-hunt](https://forum.magicmirror.builders/category/15/bug-hunt)
|
||||
Problems installing or configuring your MagicMirror? Check out: [https://forum.magicmirror.builders/category/10/troubleshooting](https://forum.magicmirror.builders/category/10/troubleshooting)
|
||||
|
||||
When submitting a new issue, please supply the following information:
|
||||
|
||||
**Platform**: Place your platform here... give us your web browser/Electron version *and* your hardware (Raspberry Pi 2/3, Windows, Mac, Linux, System V UNIX).
|
||||
|
||||
**Node Version**: Make sure it's version 0.12.13 or later.
|
||||
|
||||
**MagicMirror Version**: Now that the versions have split, tell us if you are using the PHP version (v1) or the newer JavaScript version (v2).
|
||||
|
||||
**Description**: Provide a detailed description about the issue and include specific details to help us understand the problem. Adding screenshots will help describing the problem.
|
||||
|
||||
**Steps to Reproduce**: List the step by step process to reproduce the issue.
|
||||
|
||||
**Expected Results**: Describe what you expected to see.
|
||||
|
||||
**Actual Results**: Describe what you actually saw.
|
||||
|
||||
**Configuration**: What does the used config.js file look like? Don't forget to remove any sensitive information!
|
||||
|
||||
**Additional Notes**: Provide any other relevant notes not previously mentioned. This is optional.
|
||||
|
26
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,2 +1,24 @@
|
||||
* **Platform** [ Raspberry Pi 2/3, Windows, Mac OS X, Linux]:
|
||||
* **Node Version** [ 0.12.13 or later ]:
|
||||
Please only submit reproducible issues.
|
||||
|
||||
If you're not sure if it's a real bug or if it's just you, please open a topic on the forum: [https://forum.magicmirror.builders/category/15/bug-hunt](https://forum.magicmirror.builders/category/15/bug-hunt)
|
||||
Problems installing or configuring your MagicMirror? Check out: [https://forum.magicmirror.builders/category/10/troubleshooting](https://forum.magicmirror.builders/category/10/troubleshooting)
|
||||
|
||||
When submitting a new issue, please supply the following information:
|
||||
|
||||
**Platform**: Place your platform here... give us your web browser/Electron version *and* your hardware (Raspberry Pi 2/3, Windows, Mac, Linux, System V UNIX).
|
||||
|
||||
**Node Version**: Make sure it's version 0.12.13 or later.
|
||||
|
||||
**MagicMirror Version**: Now that the versions have split, tell us if you are using the PHP version (v1) or the newer JavaScript version (v2).
|
||||
|
||||
**Description**: Provide a detailed description about the issue and include specific details to help us understand the problem. Adding screenshots will help describing the problem.
|
||||
|
||||
**Steps to Reproduce**: List the step by step process to reproduce the issue.
|
||||
|
||||
**Expected Results**: Describe what you expected to see.
|
||||
|
||||
**Actual Results**: Describe what you actually saw.
|
||||
|
||||
**Configuration**: What does the used config.js file look like? Don't forget to remove any sensitive information!
|
||||
|
||||
**Additional Notes**: Provide any other relevant notes not previously mentioned. This is optional.
|
||||
|
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,5 +1,7 @@
|
||||
* Does the pull request solve a **related** issue? [yes | no]
|
||||
> Please send your pull requests the develop branch.
|
||||
> Don't forget to add the change to CHANGELOG.md.
|
||||
|
||||
* Does the pull request solve a **related** issue?
|
||||
* If so, can you reference the issue?
|
||||
|
||||
* What does the pull request accomplish? (please list)
|
||||
* What does the pull request accomplish? Use a list if needed.
|
||||
* If it includes major visual changes please add screenshots.
|
||||
|
15
.snyk
@@ -1 +1,14 @@
|
||||
version: v1
|
||||
version: v1.5.2
|
||||
ignore: {}
|
||||
patch:
|
||||
'npm:minimatch:20160620':
|
||||
- snyk > recursive-readdir > minimatch:
|
||||
patched: '2016-07-30T14:02:31.280Z'
|
||||
'npm:negotiator:20160616':
|
||||
- socket.io > engine.io > accepts > negotiator:
|
||||
patched: '2016-07-30T14:02:31.280Z'
|
||||
'npm:ws:20160624':
|
||||
- socket.io > engine.io > ws:
|
||||
patched: '2016-07-30T14:02:31.280Z'
|
||||
- socket.io > socket.io-client > engine.io-client > ws:
|
||||
patched: '2016-07-30T14:02:31.280Z'
|
||||
|
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"extends": "stylelint-config-standard",
|
||||
"font-family-name-quotes": "double-where-recommended"
|
||||
}
|
||||
"font-family-name-quotes": "double-where-recommended",
|
||||
"block-no-empty": false
|
||||
}
|
||||
|
@@ -2,8 +2,6 @@ language: node_js
|
||||
node_js:
|
||||
- "6"
|
||||
- "5.1"
|
||||
- "4"
|
||||
- "0.12"
|
||||
before_script:
|
||||
- npm install grunt-cli -g
|
||||
script: grunt
|
||||
script: grunt
|
||||
|
145
CHANGELOG.md
Normal file
@@ -0,0 +1,145 @@
|
||||
# MagicMirror² Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [2.1.0] - 2016-12-31
|
||||
|
||||
**Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`
|
||||
|
||||
### Added
|
||||
- Finnish translation.
|
||||
- Danish translation.
|
||||
- Turkish translation.
|
||||
- Option to limit access to certain IP addresses based on the value of `ipWhitelist` in the `config.js`, default is access from localhost only (Issue [#456](https://github.com/MichMich/MagicMirror/issues/456)).
|
||||
- Added ability to change the point of time when calendar events get relative.
|
||||
- Add Splash screen on boot.
|
||||
- Add option to show humidity in currentWeather module.
|
||||
- Add VSCode IntelliSense support.
|
||||
- Module API: Add Visibility locking to module system. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#visibility-locking) for more information.
|
||||
- Module API: Method to overwrite the module's header. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#getheader) for more information.
|
||||
- Module API: Option to define the minimum MagicMirror version to run a module. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules#requiresversion) for more information.
|
||||
- Calendar module now broadcasts the event list to all other modules using the notification system. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/calendar) for more information.
|
||||
- Possibility to use the the calendar feed as the source for the weather (currentweather & weatherforecast) location data. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/weatherforecast) for more information.
|
||||
- Added option to show rain amount in the weatherforecast default module
|
||||
- Add module `updatenotification` to get an update whenever a new version is availabe. [See documentation](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/updatenotification) for more information.
|
||||
- Add the abilty to set timezone on the date display in the Clock Module
|
||||
- Ability to set date format in calendar module
|
||||
- Possibility to use currentweather for the compliments
|
||||
- Added option `disabled` for modules.
|
||||
- Added option `address` to set bind address.
|
||||
- Added option `onlyTemp` for currentweather module to show show only current temperature and weather icon.
|
||||
- Added option `remoteFile` to compliments module to load compliment array from filesystem.
|
||||
- Added option `zoom` to scale the whole mirror display with a given factor.
|
||||
- Added option `roundTemp` for currentweather and weatherforecast modules to display temperatures rounded to nearest integer.
|
||||
- Added abilty set the classes option to compliments module for style and text size of compliments.
|
||||
- Added ability to configure electronOptions
|
||||
- Calendar module: option to hide private events
|
||||
- Add root_path for global vars
|
||||
|
||||
### Updated
|
||||
- Modified translations for Frysk.
|
||||
- Modified core English translations.
|
||||
- Updated package.json as a result of Snyk security update.
|
||||
- Improve object instantiation to prevent reference errors.
|
||||
- Improve logger. `Log.log()` now accepts multiple arguments.
|
||||
- Remove extensive logging in newsfeed node helper.
|
||||
- Calendar times are now uniformly capitalized.
|
||||
- Modules are now secure, and Helmet is now used to prevent abuse of the Mirror's API.
|
||||
|
||||
### Fixed
|
||||
- Solve an issue where module margins would appear when the first module of a section was hidden.
|
||||
- Solved visual display errors on chrome, if all modules in one of the right sections are hidden.
|
||||
- Global and Module default config values are no longer modified when setting config values.
|
||||
- Hide a region if all modules in a region are hidden. Prevention unwanted margins.
|
||||
- Replaced `electron-prebuilt` package with `electron` in order to fix issues that would happen after 2017.
|
||||
- Documentation of alert module
|
||||
|
||||
## [2.0.5] - 2016-09-20
|
||||
|
||||
### Added
|
||||
- Added ability to remove tags from the beginning or end of newsfeed items in 'newsfeed.js'.
|
||||
- Added ability to define "the day after tomorrow" for calendar events (Definition for German and Dutch already included).
|
||||
- Added CII Badge (we are compliant with the CII Best Practices)
|
||||
- Add support for doing http basic auth when loading calendars
|
||||
- Add the abilty to turn off and on the date display in the Clock Module
|
||||
|
||||
### Fixed
|
||||
- Fix typo in installer.
|
||||
- Add message to unsupported Pi error to mention that Pi Zeros must use server only mode, as ARMv6 is unsupported. Closes #374.
|
||||
- Fix API url for weather API.
|
||||
|
||||
### Updated
|
||||
- Force fullscreen when kioskmode is active.
|
||||
- Update the .github templates and information with more modern information.
|
||||
- Update the Gruntfile with a more functional StyleLint implementation.
|
||||
|
||||
## [2.0.4] - 2016-08-07
|
||||
|
||||
### Added
|
||||
- Brazilian Portuguese Translation.
|
||||
- Option to enable Kiosk mode.
|
||||
- Added ability to start the app with Dev Tools.
|
||||
- Added ability to turn off the date display in `clock.js` when in analog mode.
|
||||
- Greek Translation
|
||||
|
||||
### Fixed
|
||||
- Prevent `getModules()` selectors from returning duplicate entries.
|
||||
- Append endpoints of weather modules with `/` to retreive the correct data. (Issue [#337](https://github.com/MichMich/MagicMirror/issues/337))
|
||||
- Corrected grammer in `module.js` from 'suspend' to 'suspended'.
|
||||
- Fixed openweathermap.org URL in config sample.
|
||||
- Prevent currentweather module from crashing when received data object is incorrect.
|
||||
- Fix issue where translation loading prevented the UI start-up when the language was set to 'en'. (Issue [#388](https://github.com/MichMich/MagicMirror/issues/388))
|
||||
|
||||
### Updated
|
||||
- Updated package.json to fix possible vulnerabilities. (Using Snyk)
|
||||
- Updated weathericons
|
||||
- Updated default weatherforecast to work with the new icons.
|
||||
- More detailed error message in case config file couldn't be loaded.
|
||||
|
||||
## [2.0.3] - 2016-07-12
|
||||
### Added
|
||||
- Add max newsitems parameter to the newsfeed module.
|
||||
- Translations for Simplified Chinese, Traditional Chinese and Japanese.
|
||||
- Polish Translation
|
||||
- Add an analog clock in addition to the digital one.
|
||||
|
||||
### Fixed
|
||||
- Edit Alert Module to display title & message if they are provided in the notification (Issue [#300](https://github.com/MichMich/MagicMirror/issues/300))
|
||||
- Removed 'null' reference from updateModuleContent(). This fixes recent Edge and Internet Explorer browser displays (Issue [#319](https://github.com/MichMich/MagicMirror/issues/319))
|
||||
|
||||
### Changed
|
||||
- Added default string to calendar titleReplace.
|
||||
|
||||
## [2.0.2] - 2016-06-05
|
||||
### Added
|
||||
- Norwegian Translations (nb and nn)
|
||||
- Portuguese Translation
|
||||
- Swedish Translation
|
||||
|
||||
### Fixed
|
||||
- Added reference to Italian Translation.
|
||||
- Added the missing NE translation to all languages. [#334](https://github.com/MichMich/MagicMirror/issues/344)
|
||||
- Added proper User-Agent string to calendar call.
|
||||
|
||||
### Changed
|
||||
- Add option to use locationID in weather modules.
|
||||
|
||||
## [2.0.1] - 2016-05-18
|
||||
### Added
|
||||
- Changelog
|
||||
- Italian Translation
|
||||
|
||||
### Changed
|
||||
- Improve the installer by fetching the latest Node.js without any 3rd party interferences.
|
||||
|
||||
## [2.0.0] - 2016-05-03
|
||||
### Initial release of MagicMirror²
|
||||
It includes (but is not limited to) the following features:
|
||||
- Modular system allowing 3rd party plugins.
|
||||
- An Node/Electron based application taking away the need for external servers or browsers.
|
||||
- A complete development API documentation.
|
||||
- Small cute fairies that kiss you while you sleep.
|
||||
|
||||
## [1.0.0] - 2014-02-16
|
||||
### Initial release of MagicMirror.
|
||||
This was part of the blogpost: [http://michaelteeuw.nl/post/83916869600/magic-mirror-part-vi-production-of-the](http://michaelteeuw.nl/post/83916869600/magic-mirror-part-vi-production-of-the)
|
65
Gruntfile.js
@@ -6,23 +6,64 @@ module.exports = function(grunt) {
|
||||
options: {
|
||||
configFile: ".eslintrc.json"
|
||||
},
|
||||
target: ["js/*.js", "modules/default/*.js", "serveronly/*.js", "*.js"]
|
||||
target: ["js/*.js", "modules/default/*.js", "modules/default/*/*.js",
|
||||
"serveronly/*.js", "*.js", "!modules/default/alert/notificationFx.js",
|
||||
"!modules/default/alert/modernizr.custom.js", "!modules/default/alert/classie.js"
|
||||
]
|
||||
},
|
||||
postcss: {
|
||||
lint: {
|
||||
stylelint: {
|
||||
simple: {
|
||||
options: {
|
||||
processors: [
|
||||
require("stylelint")({"extends": "stylelint-config-standard", "font-family-name-quotes": "double-where-recommended"}),
|
||||
require("postcss-reporter")({ clearMessages: true })
|
||||
]
|
||||
configFile: ".stylelintrc"
|
||||
},
|
||||
dist: {
|
||||
src: "**/**/**/**/**/**/**/**.css"
|
||||
src: ["css/main.css", "modules/default/calendar/calendar.css", "modules/default/clock/clock_styles.css", "modules/default/currentweather/currentweather.css", "modules/default/weatherforcast/weatherforcast.css"]
|
||||
}
|
||||
},
|
||||
jsonlint: {
|
||||
main: {
|
||||
src: ["package.json", ".eslintrc.json", ".stylelint"],
|
||||
options: {
|
||||
reporter: "jshint"
|
||||
}
|
||||
}
|
||||
},
|
||||
markdownlint: {
|
||||
all: {
|
||||
options: {
|
||||
config: {
|
||||
"default": true,
|
||||
"line-length": false,
|
||||
"blanks-around-headers": false,
|
||||
"no-duplicate-header": false,
|
||||
"no-inline-html": false,
|
||||
"MD010": false,
|
||||
"MD001": false,
|
||||
"MD031": false,
|
||||
"MD040": false,
|
||||
"MD002": false,
|
||||
"MD029": false,
|
||||
"MD041": false,
|
||||
"MD032": false,
|
||||
"MD036": false,
|
||||
"MD037": false,
|
||||
"MD009": false,
|
||||
"MD018": false,
|
||||
"MD012": false,
|
||||
"MD026": false,
|
||||
"MD038": false
|
||||
}
|
||||
},
|
||||
src: ["README.md", "CHANGELOG.md", "LICENSE.md", "modules/README.md", "modules/default/**/*.md", "!modules/default/calendar/vendor/ical.js/readme.md"]
|
||||
}
|
||||
},
|
||||
yamllint: {
|
||||
all: [".travis.yml"]
|
||||
}
|
||||
});
|
||||
grunt.loadNpmTasks("grunt-eslint");
|
||||
grunt.loadNpmTasks("grunt-postcss");
|
||||
grunt.registerTask("default", ["eslint", "postcss:lint"]);
|
||||
};
|
||||
grunt.loadNpmTasks("grunt-stylelint");
|
||||
grunt.loadNpmTasks("grunt-jsonlint");
|
||||
grunt.loadNpmTasks("grunt-yamllint");
|
||||
grunt.loadNpmTasks("grunt-markdownlint");
|
||||
grunt.registerTask("default", ["eslint", "stylelint", "jsonlint", "markdownlint", "yamllint"]);
|
||||
};
|
||||
|
49
README.md
@@ -3,18 +3,16 @@
|
||||
<p align="center">
|
||||
<a href="https://david-dm.org/MichMich/MagicMirror"><img src="https://david-dm.org/MichMich/MagicMirror.svg" alt="Dependency Status"></a>
|
||||
<a href="https://david-dm.org/MichMich/MagicMirror#info=devDependencies"><img src="https://david-dm.org/MichMich/MagicMirror/dev-status.svg" alt="devDependency Status"></a>
|
||||
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-v5.10.1-brightgreen.svg" alt="Node Version"></a>
|
||||
<a href="https://bestpractices.coreinfrastructure.org/projects/347"><img src="https://bestpractices.coreinfrastructure.org/projects/347/badge"></a>
|
||||
<a href="http://choosealicense.com/licenses/mit"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License"></a>
|
||||
<a href="https://travis-ci.org/MichMich/MagicMirror"><img src="https://travis-ci.org/MichMich/MagicMirror.svg" alt="Travis"></a>
|
||||
<a href="https://snyk.io/test/github/MichMich/MagicMirror"><img src="https://snyk.io/test/github/MichMich/MagicMirror/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/MichMich/MagicMirror" style="max-width:100%;"></a>
|
||||
</p>
|
||||
|
||||
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
|
||||
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
|
||||
|
||||
MagicMirror² focuses on a modular plugin system and uses [Electron](http://electron.atom.io/) as an application wrapper. So no more web server or browser installs necessary!
|
||||
|
||||
**NOTE:** This version is in currently in beta stage. Please use the master branch if you need a thoroughly tested version.
|
||||
|
||||
## Table Of Contents
|
||||
|
||||
- [Usage](#usage)
|
||||
@@ -24,19 +22,19 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec
|
||||
- [community](#community)
|
||||
- [Contributing Guidelines](#contributing-guidelines)
|
||||
|
||||
## Usage
|
||||
## Usage
|
||||
|
||||
#### Raspberry Pi Support
|
||||
### Raspberry Pi Support
|
||||
Electron, the app wrapper around MagicMirror², only supports the Raspberry Pi 2 & 3. The Raspberry Pi 1 is currently **not** supported. If you want to run this on a Raspberry Pi 1, use the [server only](#server-only) feature and setup a fullscreen browser yourself.
|
||||
|
||||
#### Automatic Installer (Raspberry Pi Only!)
|
||||
### Automatic Installer (Raspberry Pi Only!)
|
||||
|
||||
Execute the following command on your Raspberry Pi to install MagicMirror²:
|
||||
````
|
||||
curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/installers/raspberry.sh | bash
|
||||
curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh | bash
|
||||
````
|
||||
|
||||
#### Manual Installation
|
||||
### Manual Installation
|
||||
|
||||
1. Download and install the latest Node.js version.
|
||||
2. Clone the repository and check out the beta branch: `git clone https://github.com/MichMich/MagicMirror`
|
||||
@@ -45,25 +43,27 @@ curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/installers/raspb
|
||||
|
||||
**Important:** `npm start` does **not** work via SSH, use `DISPLAY=:0 nohup npm start &` instead. This starts the mirror on the remote display.
|
||||
|
||||
#### Server Only
|
||||
**Note:** if you want to debug on Raspberry Pi you can use `npm start dev` which will start the MagicMirror app with Dev Tools enabled.
|
||||
|
||||
### Server Only
|
||||
|
||||
In some cases, you want to start the application without an actual app window. In this case, execute the following command from the MagicMirror folder: `node serveronly`. This will start the server, after which you can open the application in your browser of choice.
|
||||
|
||||
#### Raspberry Configuration & Auto Start.
|
||||
### Raspberry Configuration & Auto Start.
|
||||
|
||||
The following wiki links are helpful in the configuration of your MagicMirror² operating system:
|
||||
- [Configuring the Raspberry Pi](https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi)
|
||||
- [Auto Starting MagicMirror](https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror)
|
||||
|
||||
#### Updating you MagicMirror²
|
||||
### Updating your MagicMirror²
|
||||
|
||||
If you want to update your MagicMirror² to the latest version, use your terminal to go to your Magic Mirror folder and type the following command:
|
||||
|
||||
````
|
||||
git pull
|
||||
````
|
||||
```bash
|
||||
git pull && npm install
|
||||
```
|
||||
|
||||
If you changed nothing more than the config or the modules, this should work without any problems.
|
||||
If you changed nothing more than the config or the modules, this should work without any problems.
|
||||
Type `git status` to see your changes, if there are any, you can reset them with `git reset --hard`. After that, git pull should be possible.
|
||||
|
||||
## Configuration
|
||||
@@ -73,14 +73,18 @@ Type `git status` to see your changes, if there are any, you can reset them with
|
||||
|
||||
The following properties can be configured:
|
||||
|
||||
|
||||
| **Option** | **Description** |
|
||||
| --- | --- |
|
||||
| `port` | The port on which the MagicMirror² server will run on. The default value is `8080`. |
|
||||
| `address` | The ip address the accept connections. The default open bind `::` is IPv6 is available or `0.0.0.0` IPv4 run on. Example config: `192.168.10.100`. |
|
||||
| `ipWhitelist` | The list of IPs from which you are allowed to access the MagicMirror². The default value is `["127.0.0.1", "::ffff:127.0.0.1", "::1"]`. It is possible to specify IPs with subnet masks (`["127.0.0.1", "127.0.0.1/24"]`) or define ip ranges (`["127.0.0.1", ["192.168.0.1", "192.168.0.100"]]`).|
|
||||
| `zoom` | This allows to scale the mirror contents with a given zoom factor. The default value is `1.0`|
|
||||
| `language` | The language of the interface. (Note: Not all elements will be localized.) Possible values are `en`, `nl`, `ru`, `fr`, etc., but the default value is `en`. |
|
||||
| `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. |
|
||||
| `units` | The units that will be used in the default weather modules. Possible values are `metric` or `imperial`. The default is `metric`. |
|
||||
| `modules` | An array of active modules. **The array must contain objects. See the next table below for more information.** |
|
||||
| `electronOptions` | An optional array of Electron (browser) options. This allows configuration of e.g. the browser screen size and position (defaults `.width = 800` & `.height = 600`). Kiosk mode can be enabled by setting `.kiosk = true`, `.autoHideMenuBar = false`, `.fullscreen = false`. More options can be found [here](https://github.com/electron/electron/blob/master/docs/api/browser-window.md). |
|
||||
|
||||
|
||||
Module configuration:
|
||||
|
||||
@@ -90,6 +94,7 @@ Module configuration:
|
||||
| `position` | The location of the module in which the module will be loaded. Possible values are `top_ bar`, `top_left`, `top_center`, `top_right`, `upper_third`, `middle_center`, `lower_third`, `bottom_left`, `bottom_center`, `bottom_right`, `bottom_bar`, `fullscreen_above`, and `fullscreen_below`. This field is optional but most modules require this field to set. Check the documentation of the module for more information. Multiple modules with the same position will be ordered based on the order in the configuration file. |
|
||||
| `classes` | Additional classes which are passed to the module. The field is optional. |
|
||||
| `header` | To display a header text above the module, add the header property. This field is optional. |
|
||||
| `disabled` | Set disabled to `true` to skip creating the module. This field is optional. |
|
||||
| `config` | An object with the module configuration properties. Check the documentation of the module for more information. This field is optional, unless the module requires extra configuration. |
|
||||
|
||||
## Modules
|
||||
@@ -110,7 +115,7 @@ For more available modules, check out out the wiki page: [MagicMirror² Modules]
|
||||
## Known issues
|
||||
|
||||
- Electron seems to have some issues on certain Raspberry Pi 2's. See [#145](https://github.com/MichMich/MagicMirror/issues/145).
|
||||
- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150).
|
||||
- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150).
|
||||
|
||||
## Community
|
||||
|
||||
@@ -122,10 +127,14 @@ Contributions of all kinds are welcome, not only in the form of code but also wi
|
||||
|
||||
Please keep the following in mind:
|
||||
|
||||
- **Bug Reports**: Make sure you're running the latest version. If the issue(s) still persist: please open a clearly documented issue with a clear title.
|
||||
- **Bug Reports**: Make sure you're running the latest version. If the issue(s) still persist: please open a clearly documented issue with a clear title.
|
||||
- **Minor Bug Fixes**: Please send a pull request with a clear explanation of the issue or a link to the issue it solves.
|
||||
- **Major Bug Fixes**: please discuss your approach in an GitHub issue before you start to alter a big part of the code.
|
||||
- **New Features**: please please discuss in a GitHub issue before you start to alter a big part of the code. Without discussion upfront, the pull request will not be accepted / merged.
|
||||
|
||||
Thanks for your help in making MagicMirror² better!
|
||||
Thanks for your help in making MagicMirror² better!
|
||||
|
||||
<p align="center">
|
||||
<br>
|
||||
<a href="https://forum.magicmirror.builders/topic/728/magicmirror-is-voted-number-1-in-the-magpi-top-50"><img src="https://magicmirror.builders/img/magpi-best-watermark-custom.png" width="150" alt="MagPi Top 50"></a>
|
||||
</p>
|
||||
|
@@ -6,6 +6,7 @@
|
||||
|
||||
var config = {
|
||||
port: 8080,
|
||||
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
|
||||
|
||||
language: 'en',
|
||||
timeFormat: 24,
|
||||
@@ -15,6 +16,10 @@ var config = {
|
||||
{
|
||||
module: 'alert',
|
||||
},
|
||||
{
|
||||
module: "updatenotification",
|
||||
position: "top_bar"
|
||||
},
|
||||
{
|
||||
module: 'clock',
|
||||
position: 'top_left'
|
||||
@@ -41,6 +46,7 @@ var config = {
|
||||
position: 'top_right',
|
||||
config: {
|
||||
location: 'New York',
|
||||
locationID: '', //ID from http://www.openweathermap.org
|
||||
appid: 'YOUR_OPENWEATHER_API_KEY'
|
||||
}
|
||||
},
|
||||
@@ -49,8 +55,9 @@ var config = {
|
||||
position: 'top_right',
|
||||
header: 'Weather Forecast',
|
||||
config: {
|
||||
location: 'New York',
|
||||
appid: 'YOUR_OPENWEATHER_API_KEY'
|
||||
location: 'New York',
|
||||
locationID: '5128581', //ID from http://www.openweathermap.org
|
||||
appid: 'YOUR_OPENWEATHER_API_KEY'
|
||||
}
|
||||
},
|
||||
{
|
||||
|
13
css/main.css
@@ -1,10 +1,10 @@
|
||||
html {
|
||||
cursor: none;
|
||||
overflow:hidden;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body {
|
||||
@@ -113,11 +113,12 @@ sup {
|
||||
*/
|
||||
|
||||
.module {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.module:first-child {
|
||||
margin-top: 0;
|
||||
.region.bottom .module {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -8,6 +8,10 @@
|
||||
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||
<link rel="stylesheet" type="text/css" href="fonts/roboto.css">
|
||||
<!-- custom.css is loaded by the loader.js to make sure it's loaded after the module css files. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
var version = "#VERSION#";
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="region fullscreen below"><div class="container"></div></div>
|
||||
|
@@ -18,7 +18,7 @@ echo ' \$$$$$$ |'
|
||||
echo ' \______/'
|
||||
echo -e "\e[0m"
|
||||
|
||||
# Define the tested version of node.
|
||||
# Define the tested version of Node.js.
|
||||
NODE_TESTED="v5.1.0"
|
||||
|
||||
#Determine which Pi is running.
|
||||
@@ -28,6 +28,7 @@ ARM=$(uname -m)
|
||||
if [ "$ARM" != "armv7l" ]; then
|
||||
echo -e "\e[91mSorry, your Raspberry Pi is not supported."
|
||||
echo -e "\e[91mPlease run MagicMirror on a Raspberry Pi 2 or 3."
|
||||
echo -e "\e[91mIf this is a Pi Zero, you are in the same boat as the original Raspberry Pi. You must run in server only mode."
|
||||
exit;
|
||||
fi
|
||||
|
||||
@@ -39,7 +40,7 @@ function command_exists () { type "$1" &> /dev/null ;}
|
||||
echo -e "\e[96mInstalling helper tools ...\e[90m"
|
||||
sudo apt-get install curl wget git build-essential unzip || exit
|
||||
|
||||
# Check if we need to install or upgrade node.
|
||||
# Check if we need to install or upgrade Node.js.
|
||||
echo -e "\e[96mCheck current Node installation ...\e[0m"
|
||||
NODE_INSTALL=false
|
||||
if command_exists node; then
|
||||
@@ -48,75 +49,45 @@ if command_exists node; then
|
||||
echo -e "\e[0mMinimum Node version: \e[1m$NODE_TESTED\e[0m"
|
||||
echo -e "\e[0mInstalled Node version: \e[1m$NODE_CURRENT\e[0m"
|
||||
if version_gt $NODE_TESTED $NODE_CURRENT; then
|
||||
echo -e "\e[96mNode should be upgraded.\e[0m"
|
||||
NODE_INSTALL=true
|
||||
echo -e "\e[96mNode should be upgraded.\e[0m"
|
||||
NODE_INSTALL=true
|
||||
|
||||
#Check if a node process is currenlty running.
|
||||
#If so abort installation.
|
||||
if pgrep "node" > /dev/null; then
|
||||
echo -e "\e[91mA Node process is currently running. Can't upgrade."
|
||||
echo "Please quit all Node processes and restart the installer."
|
||||
exit;
|
||||
#Check if a node process is currenlty running.
|
||||
#If so abort installation.
|
||||
if pgrep "node" > /dev/null; then
|
||||
echo -e "\e[91mA Node process is currently running. Can't upgrade."
|
||||
echo "Please quit all Node processes and restart the installer."
|
||||
exit;
|
||||
fi
|
||||
|
||||
else
|
||||
echo -e "\e[92mNo Node upgrade nessecery.\e[0m"
|
||||
else
|
||||
echo -e "\e[92mNo Node.js upgrade nessecery.\e[0m"
|
||||
fi
|
||||
|
||||
else
|
||||
echo -e "\e[93mNode is not installed.\e[0m";
|
||||
echo -e "\e[93mNode.js is not installed.\e[0m";
|
||||
NODE_INSTALL=true
|
||||
fi
|
||||
|
||||
# Install or upgare node if nessecery.
|
||||
# Install or upgrade node if necessary.
|
||||
if $NODE_INSTALL; then
|
||||
|
||||
echo -e "\e[96mInstalling Node.js ...\e[90m"
|
||||
|
||||
echo -e "\e[96mStart Node download ...\e[0m"
|
||||
|
||||
#Fetch the latest version of Node.js.
|
||||
#TODO: Is there a native way to fetch the latest node version?
|
||||
echo -e "\e[39mRetrieving latest node version."
|
||||
NODE_LATEST=$(curl -l http://api.jordidepoortere.com/nodejs-latest/ 2> /dev/null)
|
||||
|
||||
if [ "$NODE_LATEST" == "" ]; then
|
||||
echo -e "\e[91mCould not retreive latest node version."
|
||||
echo -e "\e[91mPlease try again or open an issue on GitHub."
|
||||
exit
|
||||
fi
|
||||
|
||||
echo -e "Latest node version: \e[1m$NODE_LATEST\e[0m"
|
||||
|
||||
#Construct the download URL.
|
||||
DOWNLOAD_URL="https://nodejs.org/dist/latest/node-$NODE_LATEST-linux-$ARM.tar.gz"
|
||||
|
||||
#Create Download Directory
|
||||
rm -Rf ~/.MagicMirrorNodeInstaller || exit
|
||||
mkdir ~/.MagicMirrorNodeInstaller || exit
|
||||
cd ~/.MagicMirrorNodeInstaller || exit
|
||||
|
||||
#Download Installer
|
||||
echo -e "\e[39mDownloading node ... \e[90m"
|
||||
if wget $DOWNLOAD_URL --no-verbose --show-progress; then
|
||||
echo -e "\e[39mDownload complete."
|
||||
else
|
||||
echo -e "\e[91mCould not download node."
|
||||
exit;
|
||||
fi
|
||||
|
||||
#Unpack and copy.
|
||||
echo -e "\e[96mStart Node installation ...\e[90m"
|
||||
tar xvf node-$NODE_LATEST-linux-$ARM.tar.gz || exit
|
||||
cd node* || exit
|
||||
sudo cp -R * /usr/local || exit
|
||||
|
||||
#Cleanup
|
||||
rm -Rf ~/.MagicMirrorNodeInstaller || exit
|
||||
#Fetch the latest version of Node.js from the selected branch
|
||||
#The NODE_STABLE_BRANCH variable will need to be manually adjusted when a new branch is released. (e.g. 7.x)
|
||||
#Only tested (stable) versions are recommended as newer versions could break MagicMirror.
|
||||
|
||||
NODE_STABLE_BRANCH="6.x"
|
||||
curl -sL https://deb.nodesource.com/setup_$NODE_STABLE_BRANCH | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
echo -e "\e[92mNode.js installation Done!\e[0m"
|
||||
fi
|
||||
|
||||
#Install magic mirror
|
||||
cd ~
|
||||
if [ -d "$HOME/MagicMirror" ] ; then
|
||||
echo -e "\e[93mIt seems like MagicMirror is allready installed."
|
||||
echo -e "\e[93mIt seems like MagicMirror is already installed."
|
||||
echo -e "To prevent overwriting, the installer will be aborted."
|
||||
echo -e "Please rename the \e[1m~/MagicMirror\e[0m\e[93m folder and try again.\e[0m"
|
||||
echo ""
|
||||
@@ -142,7 +113,35 @@ else
|
||||
exit;
|
||||
fi
|
||||
|
||||
# Check if plymouth is installed (default with PIXEL desktop environment), then install custom splashscreen.
|
||||
echo -e "\e[96mCheck plymouth installation ...\e[0m"
|
||||
if command_exists plymouth; then
|
||||
THEME_DIR="/usr/share/plymouth/themes"
|
||||
echo -e "\e[90mSplashscreen: Checking themes directory.\e[0m"
|
||||
if [ -d $THEME_DIR ]; then
|
||||
echo -e "\e[90mSplashscreen: Create theme directory if not exists.\e[0m"
|
||||
if [ ! -d $THEME_DIR/MagicMirror ]; then
|
||||
sudo mkdir $THEME_DIR/MagicMirror
|
||||
fi
|
||||
|
||||
if sudo cp ~/MagicMirror/splashscreen/splash.png $THEME_DIR/MagicMirror/splash.png && sudo cp ~/MagicMirror/splashscreen/MagicMirror.plymouth $THEME_DIR/MagicMirror/MagicMirror.plymouth && sudo cp ~/MagicMirror/splashscreen/MagicMirror.script $THEME_DIR/MagicMirror/MagicMirror.script; then
|
||||
echo -e "\e[90mSplashscreen: Theme copied successfully.\e[0m"
|
||||
if sudo plymouth-set-default-theme -R MagicMirror; then
|
||||
echo -e "\e[92mSplashscreen: Changed theme to MagicMirror successfully.\e[0m"
|
||||
else
|
||||
echo -e "\e[91mSplashscreen: Couldn't change theme to MagicMirror!\e[0m"
|
||||
fi
|
||||
else
|
||||
echo -e "\e[91mSplashscreen: Copying theme failed!\e[0m"
|
||||
fi
|
||||
else
|
||||
echo -e "\e[91mSplashscreen: Themes folder doesn't exist!\e[0m"
|
||||
fi
|
||||
else
|
||||
echo -e "\e[93mplymouth is not installed.\e[0m";
|
||||
fi
|
||||
|
||||
echo " "
|
||||
echo -e "\e[92mWe're ready! Run \e[1m\e[97mDISPLAY=:0 npm start\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror."
|
||||
echo -e "\e[92mWe're ready! Run \e[1m\e[97mDISPLAY=:0 npm start\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror.\e[0m"
|
||||
echo " "
|
||||
echo " "
|
||||
|
58
js/app.js
@@ -10,6 +10,13 @@ var Server = require(__dirname + "/server.js");
|
||||
var defaultModules = require(__dirname + "/../modules/default/defaultmodules.js");
|
||||
var path = require("path");
|
||||
|
||||
// Get version number.
|
||||
global.version = JSON.parse(fs.readFileSync("package.json", "utf8")).version;
|
||||
console.log("Starting MagicMirror: v" + global.version);
|
||||
|
||||
// global absolute root path
|
||||
global.root_path = path.resolve(__dirname + "/../");
|
||||
|
||||
// The next part is here to prevent a major exception when there
|
||||
// is no internet connection. This could probable be solved better.
|
||||
process.on("uncaughtException", function (err) {
|
||||
@@ -34,15 +41,23 @@ var App = function() {
|
||||
var loadConfig = function(callback) {
|
||||
console.log("Loading config ...");
|
||||
var defaults = require(__dirname + "/defaults.js");
|
||||
var configFilename = path.resolve(__dirname + "/../config/config.js");
|
||||
var configFilename = path.resolve(global.root_path + "/config/config.js");
|
||||
try {
|
||||
fs.accessSync(configFilename, fs.F_OK);
|
||||
var c = require(configFilename);
|
||||
var config = Object.assign(defaults, c);
|
||||
callback(config);
|
||||
} catch (e) {
|
||||
console.error("WARNING! Could not find config. Please create one.");
|
||||
callback(defaults);
|
||||
if (e.code == "ENOENT") {
|
||||
console.error("WARNING! Could not find config file. Please create one. Starting with default configuration.");
|
||||
callback(defaults);
|
||||
} else if (e instanceof ReferenceError || e instanceof SyntaxError) {
|
||||
console.error("WARNING! Could not validate config file. Please correct syntax errors. Starting with default configuration.");
|
||||
callback(defaults);
|
||||
} else {
|
||||
console.error("WARNING! Could not load config file. Starting with default configuration. Error found: " + e);
|
||||
callback(defaults);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -74,6 +89,17 @@ var App = function() {
|
||||
if (loadModule) {
|
||||
var Module = require(helperPath);
|
||||
var m = new Module();
|
||||
|
||||
if (m.requiresVersion) {
|
||||
console.log("Check MagicMirror version for node helper '" + moduleName + "' - Minimum version: " + m.requiresVersion + " - Current version: " + global.version);
|
||||
if (cmpVersions(global.version, m.requiresVersion) >= 0) {
|
||||
console.log("Version is ok!");
|
||||
} else {
|
||||
console.log("Version is incorrect. Skip module: '" + moduleName + "'");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m.setName(moduleName);
|
||||
m.setPath(path.resolve(moduleFolder));
|
||||
nodeHelpers.push(m);
|
||||
@@ -95,6 +121,28 @@ var App = function() {
|
||||
console.log("All module helpers loaded.");
|
||||
};
|
||||
|
||||
/* cmpVersions(a,b)
|
||||
* Compare two symantic version numbers and return the difference.
|
||||
*
|
||||
* argument a string - Version number a.
|
||||
* argument a string - Version number b.
|
||||
*/
|
||||
function cmpVersions(a, b) {
|
||||
var i, diff;
|
||||
var regExStrip0 = /(\.0+)+$/;
|
||||
var segmentsA = a.replace(regExStrip0, "").split(".");
|
||||
var segmentsB = b.replace(regExStrip0, "").split(".");
|
||||
var l = Math.min(segmentsA.length, segmentsB.length);
|
||||
|
||||
for (i = 0; i < l; i++) {
|
||||
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
|
||||
if (diff) {
|
||||
return diff;
|
||||
}
|
||||
}
|
||||
return segmentsA.length - segmentsB.length;
|
||||
}
|
||||
|
||||
/* start(callback)
|
||||
* This methods starts the core app.
|
||||
* It loads the config, then it loads all modules.
|
||||
@@ -111,7 +159,7 @@ var App = function() {
|
||||
|
||||
for (var m in config.modules) {
|
||||
var module = config.modules[m];
|
||||
if (modules.indexOf(module.module) === -1) {
|
||||
if (modules.indexOf(module.module) === -1 && !module.disabled) {
|
||||
modules.push(module.module);
|
||||
}
|
||||
}
|
||||
@@ -139,4 +187,4 @@ var App = function() {
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = new App();
|
||||
module.exports = new App();
|
||||
|
53
js/class.js
@@ -21,28 +21,32 @@
|
||||
var prototype = new this();
|
||||
initializing = false;
|
||||
|
||||
// Make a copy of all prototype properies, to prevent reference issues.
|
||||
for (var name in prototype) {
|
||||
prototype[name] = cloneObject(prototype[name]);
|
||||
}
|
||||
|
||||
// Copy the properties over onto the new prototype
|
||||
for (var name in prop) {
|
||||
// Check if we're overwriting an existing function
|
||||
prototype[name] = typeof prop[name] == "function" &&
|
||||
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
|
||||
(function(name, fn) {
|
||||
return function() {
|
||||
var tmp = this._super;
|
||||
typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) {
|
||||
return function() {
|
||||
var tmp = this._super;
|
||||
|
||||
// Add a new ._super() method that is the same method
|
||||
// but on the super-class
|
||||
this._super = _super[name];
|
||||
// Add a new ._super() method that is the same method
|
||||
// but on the super-class
|
||||
this._super = _super[name];
|
||||
|
||||
// The method only need to be bound temporarily, so we
|
||||
// remove it when we're done executing
|
||||
var ret = fn.apply(this, arguments);
|
||||
this._super = tmp;
|
||||
// The method only need to be bound temporarily, so we
|
||||
// remove it when we're done executing
|
||||
var ret = fn.apply(this, arguments);
|
||||
this._super = tmp;
|
||||
|
||||
return ret;
|
||||
};
|
||||
})(name, prop[name]) :
|
||||
prop[name];
|
||||
|
||||
return ret;
|
||||
};
|
||||
})(name, prop[name]) : prop[name];
|
||||
}
|
||||
|
||||
// The dummy class constructor
|
||||
@@ -66,5 +70,24 @@
|
||||
};
|
||||
})();
|
||||
|
||||
//Define the clone method for later use.
|
||||
//Helper Method
|
||||
function cloneObject(obj) {
|
||||
if (obj === null || typeof obj !== "object") {
|
||||
return obj;
|
||||
}
|
||||
|
||||
var temp = obj.constructor(); // give temp the original obj's constructor
|
||||
for (var key in obj) {
|
||||
temp[key] = cloneObject(obj[key]);
|
||||
|
||||
if (key === "lockStrings") {
|
||||
Log.log(key);
|
||||
}
|
||||
}
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
/*************** DO NOT EDIT THE LINE BELOW ***************/
|
||||
if (typeof module !== "undefined") {module.exports = Class;}
|
||||
|
@@ -9,12 +9,20 @@
|
||||
|
||||
var defaults = {
|
||||
port: 8080,
|
||||
kioskmode: false,
|
||||
electronOptions: {},
|
||||
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
|
||||
|
||||
language: "en",
|
||||
timeFormat: 24,
|
||||
units: "metric",
|
||||
|
||||
zoom: 1,
|
||||
|
||||
modules: [
|
||||
{
|
||||
module: "updatenotification",
|
||||
position: "top_center"
|
||||
},
|
||||
{
|
||||
module: "helloworld",
|
||||
position: "upper_third",
|
||||
|
@@ -1,3 +1,5 @@
|
||||
/* jshint esversion: 6 */
|
||||
|
||||
"use strict";
|
||||
|
||||
const Server = require(__dirname + "/server.js");
|
||||
@@ -16,23 +18,62 @@ const BrowserWindow = electron.BrowserWindow;
|
||||
let mainWindow;
|
||||
|
||||
function createWindow() {
|
||||
|
||||
var electronOptionsDefaults = {
|
||||
width: 800,
|
||||
height: 600,
|
||||
x: 0,
|
||||
y: 0,
|
||||
darkTheme: true,
|
||||
webPreferences: {
|
||||
nodeIntegration: false,
|
||||
zoomFactor: config.zoom
|
||||
}
|
||||
}
|
||||
|
||||
// DEPRECATED: "kioskmode" backwards compatibility, to be removed
|
||||
// settings these options directly instead provides cleaner interface
|
||||
if (config.kioskmode) {
|
||||
electronOptionsDefaults.kiosk = true;
|
||||
} else {
|
||||
electronOptionsDefaults.fullscreen = true;
|
||||
electronOptionsDefaults.autoHideMenuBar = true;
|
||||
}
|
||||
|
||||
var electronOptions = Object.assign({}, electronOptionsDefaults, config.electronOptions);
|
||||
|
||||
// Create the browser window.
|
||||
mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, autoHideMenuBar: true, darkTheme: true, webPreferences: {nodeIntegration: false}});
|
||||
mainWindow = new BrowserWindow(electronOptions);
|
||||
|
||||
// and load the index.html of the app.
|
||||
//mainWindow.loadURL('file://' + __dirname + '../../index.html');
|
||||
mainWindow.loadURL("http://localhost:" + config.port);
|
||||
|
||||
// Open the DevTools.
|
||||
//mainWindow.webContents.openDevTools();
|
||||
// Open the DevTools if run with "npm start dev"
|
||||
if(process.argv[2] == "dev") {
|
||||
mainWindow.webContents.openDevTools();
|
||||
}
|
||||
|
||||
// Emitted when the window is closed.
|
||||
// Set responders for window events.
|
||||
mainWindow.on("closed", function() {
|
||||
// Dereference the window object, usually you would store windows
|
||||
// in an array if your app supports multi windows, this is the time
|
||||
// when you should delete the corresponding element.
|
||||
mainWindow = null;
|
||||
});
|
||||
|
||||
if (config.kioskmode) {
|
||||
mainWindow.on("blur", function() {
|
||||
mainWindow.focus();
|
||||
});
|
||||
|
||||
mainWindow.on("leave-full-screen", function() {
|
||||
mainWindow.setFullScreen(true);
|
||||
});
|
||||
|
||||
mainWindow.on("resize", function() {
|
||||
setTimeout(function() {
|
||||
mainWindow.reload();
|
||||
}, 1000);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
@@ -44,11 +85,7 @@ app.on("ready", function() {
|
||||
|
||||
// Quit when all windows are closed.
|
||||
app.on("window-all-closed", function() {
|
||||
// On OS X it is common for applications and their menu bar
|
||||
// to stay active until the user quits explicitly with Cmd + Q
|
||||
if (process.platform !== "darwin") {
|
||||
app.quit();
|
||||
}
|
||||
createWindow();
|
||||
});
|
||||
|
||||
app.on("activate", function() {
|
||||
|
12
js/loader.js
@@ -89,6 +89,10 @@ var Loader = (function() {
|
||||
moduleFolder = config.paths.modules + "/default/" + module;
|
||||
}
|
||||
|
||||
if (moduleData.disabled === true) {
|
||||
continue;
|
||||
}
|
||||
|
||||
moduleFiles.push({
|
||||
index: m,
|
||||
identifier: "module_" + m + "_" + module,
|
||||
@@ -117,9 +121,13 @@ var Loader = (function() {
|
||||
|
||||
var afterLoad = function() {
|
||||
var moduleObject = Module.create(module.name);
|
||||
bootstrapModule(module, moduleObject, function() {
|
||||
if (moduleObject) {
|
||||
bootstrapModule(module, moduleObject, function() {
|
||||
callback();
|
||||
});
|
||||
} else {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (loadedModuleFiles.indexOf(url) !== -1) {
|
||||
|
40
js/logger.js
@@ -13,35 +13,15 @@
|
||||
|
||||
var Log = (function() {
|
||||
return {
|
||||
info: function(message) {
|
||||
console.info(message);
|
||||
},
|
||||
log: function(message) {
|
||||
console.log(message);
|
||||
},
|
||||
error: function(message) {
|
||||
console.error(message);
|
||||
},
|
||||
warn: function(message) {
|
||||
console.warn(message);
|
||||
},
|
||||
group: function(message) {
|
||||
console.group(message);
|
||||
},
|
||||
groupCollapsed: function(message) {
|
||||
console.groupCollapsed(message);
|
||||
},
|
||||
groupEnd: function() {
|
||||
console.groupEnd();
|
||||
},
|
||||
time: function(message) {
|
||||
console.time(message);
|
||||
},
|
||||
timeEnd: function(message) {
|
||||
console.timeEnd(message);
|
||||
},
|
||||
timeStamp: function(message) {
|
||||
console.timeStamp(message);
|
||||
}
|
||||
info: Function.prototype.bind.call(console.info, console),
|
||||
log: Function.prototype.bind.call(console.log, console),
|
||||
error: Function.prototype.bind.call(console.error, console),
|
||||
warn: Function.prototype.bind.call(console.warn, console),
|
||||
group: Function.prototype.bind.call(console.group, console),
|
||||
groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console),
|
||||
groupEnd: Function.prototype.bind.call(console.groupEnd, console),
|
||||
time: Function.prototype.bind.call(console.time, console),
|
||||
timeEnd: Function.prototype.bind.call(console.timeEnd, console),
|
||||
timeStamp: Function.prototype.bind.call(console.timeStamp, console)
|
||||
};
|
||||
})();
|
||||
|
184
js/main.js
@@ -1,4 +1,5 @@
|
||||
/* global Log, Loader, Module, config, defaults */
|
||||
/* jshint -W020 */
|
||||
|
||||
/* Magic Mirror
|
||||
* Main System
|
||||
@@ -39,6 +40,7 @@ var MM = (function() {
|
||||
if (typeof module.data.header !== "undefined" && module.data.header !== "") {
|
||||
var moduleHeader = document.createElement("header");
|
||||
moduleHeader.innerHTML = module.data.header;
|
||||
moduleHeader.className = "module-header";
|
||||
dom.appendChild(moduleHeader);
|
||||
}
|
||||
|
||||
@@ -50,6 +52,8 @@ var MM = (function() {
|
||||
}
|
||||
}
|
||||
|
||||
updateWrapperStates();
|
||||
|
||||
sendNotification("DOM_OBJECTS_CREATED");
|
||||
};
|
||||
|
||||
@@ -72,7 +76,7 @@ var MM = (function() {
|
||||
/* sendNotification(notification, payload, sender)
|
||||
* Send a notification to all modules.
|
||||
*
|
||||
* argument notification string - The identifier of the noitication.
|
||||
* argument notification string - The identifier of the notification.
|
||||
* argument payload mixed - The payload of the notification.
|
||||
* argument sender Module - The module that sent the notification.
|
||||
*/
|
||||
@@ -93,26 +97,27 @@ var MM = (function() {
|
||||
*/
|
||||
var updateDom = function(module, speed) {
|
||||
var newContent = module.getDom();
|
||||
var newHeader = module.getHeader();
|
||||
|
||||
if (!module.hidden) {
|
||||
|
||||
if (!moduleNeedsUpdate(module, newContent)) {
|
||||
if (!moduleNeedsUpdate(module, newHeader, newContent)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!speed) {
|
||||
updateModuleContent(module, newContent);
|
||||
updateModuleContent(module, newHeader, newContent);
|
||||
return;
|
||||
}
|
||||
|
||||
hideModule(module, speed / 2, function() {
|
||||
updateModuleContent(module, newContent);
|
||||
updateModuleContent(module, newHeader, newContent);
|
||||
if (!module.hidden) {
|
||||
showModule(module, speed / 2);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
updateModuleContent(module, newContent);
|
||||
updateModuleContent(module, newHeader, newContent);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -124,14 +129,23 @@ var MM = (function() {
|
||||
*
|
||||
* return bool - Does the module need an update?
|
||||
*/
|
||||
var moduleNeedsUpdate = function(module, newContent) {
|
||||
var moduleNeedsUpdate = function(module, newHeader, newContent) {
|
||||
var moduleWrapper = document.getElementById(module.identifier);
|
||||
var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0];
|
||||
var contentWrapper = moduleWrapper.getElementsByClassName("module-content");
|
||||
var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
|
||||
|
||||
var tempWrapper = document.createElement("div");
|
||||
tempWrapper.appendChild(newContent);
|
||||
var headerNeedsUpdate = false;
|
||||
var contentNeedsUpdate = false;
|
||||
|
||||
return tempWrapper.innerHTML !== contentWrapper.innerHTML;
|
||||
if (headerWrapper.length > 0) {
|
||||
headerNeedsUpdate = newHeader !== headerWrapper[0].innerHTML;
|
||||
}
|
||||
|
||||
var tempContentWrapper = document.createElement("div");
|
||||
tempContentWrapper.appendChild(newContent);
|
||||
contentNeedsUpdate = tempContentWrapper.innerHTML !== contentWrapper[0].innerHTML;
|
||||
|
||||
return headerNeedsUpdate || contentNeedsUpdate;
|
||||
};
|
||||
|
||||
/* moduleNeedsUpdate(module, newContent)
|
||||
@@ -140,12 +154,19 @@ var MM = (function() {
|
||||
* argument module Module - The module to check.
|
||||
* argument newContent Domobject - The new content that is generated.
|
||||
*/
|
||||
var updateModuleContent = function(module, content) {
|
||||
var updateModuleContent = function(module, newHeader, newContent) {
|
||||
var moduleWrapper = document.getElementById(module.identifier);
|
||||
var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0];
|
||||
var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
|
||||
var contentWrapper = moduleWrapper.getElementsByClassName("module-content");
|
||||
|
||||
contentWrapper[0].innerHTML = "";
|
||||
contentWrapper[0].appendChild(newContent);
|
||||
|
||||
if( headerWrapper.length > 0 && newHeader) {
|
||||
headerWrapper[0].innerHTML = newHeader;
|
||||
}
|
||||
|
||||
|
||||
contentWrapper.innerHTML = null;
|
||||
contentWrapper.appendChild(content);
|
||||
};
|
||||
|
||||
/* hideModule(module, speed, callback)
|
||||
@@ -155,7 +176,17 @@ var MM = (function() {
|
||||
* argument speed Number - The speed of the hide animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
*/
|
||||
var hideModule = function(module, speed, callback) {
|
||||
var hideModule = function(module, speed, callback, options) {
|
||||
options = options || {};
|
||||
|
||||
// set lockString if set in options.
|
||||
if (options.lockString) {
|
||||
// Log.log("Has lockstring: " + options.lockString);
|
||||
if (module.lockStrings.indexOf(options.lockString) === -1) {
|
||||
module.lockStrings.push(options.lockString);
|
||||
}
|
||||
}
|
||||
|
||||
var moduleWrapper = document.getElementById(module.identifier);
|
||||
if (moduleWrapper !== null) {
|
||||
moduleWrapper.style.transition = "opacity " + speed / 1000 + "s";
|
||||
@@ -164,10 +195,12 @@ var MM = (function() {
|
||||
clearTimeout(module.showHideTimer);
|
||||
module.showHideTimer = setTimeout(function() {
|
||||
// To not take up any space, we just make the position absolute.
|
||||
// since it"s fade out anyway, we can see it lay above or
|
||||
// since it's fade out anyway, we can see it lay above or
|
||||
// below other modules. This works way better than adjusting
|
||||
// the .display property.
|
||||
moduleWrapper.style.position = "absolute";
|
||||
moduleWrapper.style.position = "fixed";
|
||||
|
||||
updateWrapperStates();
|
||||
|
||||
if (typeof callback === "function") { callback(); }
|
||||
}, speed);
|
||||
@@ -181,7 +214,30 @@ var MM = (function() {
|
||||
* argument speed Number - The speed of the show animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
*/
|
||||
var showModule = function(module, speed, callback) {
|
||||
var showModule = function(module, speed, callback, options) {
|
||||
options = options || {};
|
||||
|
||||
// remove lockString if set in options.
|
||||
if (options.lockString) {
|
||||
var index = module.lockStrings.indexOf(options.lockString)
|
||||
if ( index !== -1) {
|
||||
module.lockStrings.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if there are no more lockstrings set, or the force option is set.
|
||||
// Otherwise cancel show action.
|
||||
if (module.lockStrings.length !== 0 && options.force !== true) {
|
||||
Log.log("Will not show " + module.name + ". LockStrings active: " + module.lockStrings.join(","));
|
||||
return;
|
||||
}
|
||||
|
||||
// If forced show, clean current lockstrings.
|
||||
if (module.lockStrings.length !== 0 && options.force === true) {
|
||||
Log.log("Force show of module: " + module.name);
|
||||
module.lockStrings = [];
|
||||
}
|
||||
|
||||
var moduleWrapper = document.getElementById(module.identifier);
|
||||
if (moduleWrapper !== null) {
|
||||
moduleWrapper.style.transition = "opacity " + speed / 1000 + "s";
|
||||
@@ -189,6 +245,8 @@ var MM = (function() {
|
||||
moduleWrapper.style.position = "static";
|
||||
moduleWrapper.style.opacity = 1;
|
||||
|
||||
updateWrapperStates();
|
||||
|
||||
clearTimeout(module.showHideTimer);
|
||||
module.showHideTimer = setTimeout(function() {
|
||||
if (typeof callback === "function") { callback(); }
|
||||
@@ -197,6 +255,36 @@ var MM = (function() {
|
||||
}
|
||||
};
|
||||
|
||||
/* updateWrapperStates()
|
||||
* Checks for all positions if it has visible content.
|
||||
* If not, if will hide the position to prevent unwanted margins.
|
||||
* This method schould be called by the show and hide methods.
|
||||
*
|
||||
* Example:
|
||||
* If the top_bar only contains the update notification. And no update is available,
|
||||
* the update notification is hidden. The top bar still occupies space making for
|
||||
* an ugly top margin. By using this function, the top bar will be hidden if the
|
||||
* update notification is not visible.
|
||||
*/
|
||||
|
||||
var updateWrapperStates = function() {
|
||||
var positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", "bottom_bar", "fullscreen_above", "fullscreen_below"];
|
||||
|
||||
positions.forEach(function(position) {
|
||||
var wrapper = selectWrapper(position);
|
||||
var moduleWrappers = wrapper.getElementsByClassName("module");
|
||||
|
||||
var showWrapper = false;
|
||||
Array.prototype.forEach.call(moduleWrappers, function(moduleWrapper) {
|
||||
if (moduleWrapper.style.position == "" || moduleWrapper.style.position == "static") {
|
||||
showWrapper = true;
|
||||
}
|
||||
});
|
||||
|
||||
wrapper.style.display = showWrapper ? "block" : "none";
|
||||
});
|
||||
};
|
||||
|
||||
/* loadConfig()
|
||||
* Loads the core config and combines it with de system defaults.
|
||||
*/
|
||||
@@ -207,7 +295,7 @@ var MM = (function() {
|
||||
return;
|
||||
}
|
||||
|
||||
config = Object.assign(defaults, config);
|
||||
config = Object.assign({}, defaults, config);
|
||||
};
|
||||
|
||||
/* setSelectionMethodsForModules()
|
||||
@@ -220,29 +308,28 @@ var MM = (function() {
|
||||
/* withClass(className)
|
||||
* filters a collection of modules based on classname(s).
|
||||
*
|
||||
* argument className string/array - one or multiple classnames. (array or space devided)
|
||||
* argument className string/array - one or multiple classnames. (array or space divided)
|
||||
*
|
||||
* return array - Filtered collection of modules.
|
||||
*/
|
||||
var withClass = function(className) {
|
||||
var newModules = [];
|
||||
|
||||
var searchClasses = className;
|
||||
if (typeof className === "string") {
|
||||
searchClasses = className.split(" ");
|
||||
}
|
||||
|
||||
for (var m in modules) {
|
||||
var module = modules[m];
|
||||
var newModules = modules.filter(function(module) {
|
||||
var classes = module.data.classes.toLowerCase().split(" ");
|
||||
|
||||
for (var c in searchClasses) {
|
||||
var searchClass = searchClasses[c];
|
||||
if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
|
||||
newModules.push(module);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
setSelectionMethodsForModules(newModules);
|
||||
return newModules;
|
||||
@@ -251,33 +338,28 @@ var MM = (function() {
|
||||
/* exceptWithClass(className)
|
||||
* filters a collection of modules based on classname(s). (NOT)
|
||||
*
|
||||
* argument className string/array - one or multiple classnames. (array or space devided)
|
||||
* argument className string/array - one or multiple classnames. (array or space divided)
|
||||
*
|
||||
* return array - Filtered collection of modules.
|
||||
*/
|
||||
var exceptWithClass = function(className) {
|
||||
var newModules = [];
|
||||
|
||||
var searchClasses = className;
|
||||
if (typeof className === "string") {
|
||||
searchClasses = className.split(" ");
|
||||
}
|
||||
|
||||
for (var m in modules) {
|
||||
var module = modules[m];
|
||||
var newModules = modules.filter(function(module) {
|
||||
var classes = module.data.classes.toLowerCase().split(" ");
|
||||
var foundClass = false;
|
||||
|
||||
for (var c in searchClasses) {
|
||||
var searchClass = searchClasses[c];
|
||||
if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
|
||||
foundClass = true;
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!foundClass) {
|
||||
newModules.push(module);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
setSelectionMethodsForModules(newModules);
|
||||
return newModules;
|
||||
@@ -291,14 +373,9 @@ var MM = (function() {
|
||||
* return array - Filtered collection of modules.
|
||||
*/
|
||||
var exceptModule = function(module) {
|
||||
var newModules = [];
|
||||
|
||||
for (var m in modules) {
|
||||
var mod = modules[m];
|
||||
if (mod.identifier !== module.identifier) {
|
||||
newModules.push(mod);
|
||||
}
|
||||
}
|
||||
var newModules = modules.filter(function(mod) {
|
||||
return mod.identifier !== module.identifier;
|
||||
});
|
||||
|
||||
setSelectionMethodsForModules(newModules);
|
||||
return newModules;
|
||||
@@ -310,10 +387,9 @@ var MM = (function() {
|
||||
* argument callback function - The function to execute with the module as an argument.
|
||||
*/
|
||||
var enumerate = function(callback) {
|
||||
for (var m in modules) {
|
||||
var module = modules[m];
|
||||
modules.map(function(module) {
|
||||
callback(module);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); }
|
||||
@@ -412,10 +488,11 @@ var MM = (function() {
|
||||
* argument module Module - The module hide.
|
||||
* argument speed Number - The speed of the hide animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
* argument options object - Optional settings for the hide method.
|
||||
*/
|
||||
hideModule: function(module, speed, callback) {
|
||||
hideModule: function(module, speed, callback, options) {
|
||||
module.hidden = true;
|
||||
hideModule(module, speed, callback);
|
||||
hideModule(module, speed, callback, options);
|
||||
},
|
||||
|
||||
/* showModule(module, speed, callback)
|
||||
@@ -424,10 +501,11 @@ var MM = (function() {
|
||||
* argument module Module - The module show.
|
||||
* argument speed Number - The speed of the show animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
* argument options object - Optional settings for the hide method.
|
||||
*/
|
||||
showModule: function(module, speed, callback) {
|
||||
showModule: function(module, speed, callback, options) {
|
||||
module.hidden = false;
|
||||
showModule(module, speed, callback);
|
||||
showModule(module, speed, callback, options);
|
||||
}
|
||||
};
|
||||
|
||||
|
181
js/module.js
@@ -14,23 +14,30 @@ var Module = Class.extend({
|
||||
* All methods (and properties) below can be subclassed. *
|
||||
*********************************************************/
|
||||
|
||||
// Set the minimum MagicMirror module version for this module.
|
||||
requiresVersion: "2.0.0",
|
||||
|
||||
// Module config defaults.
|
||||
defaults: {},
|
||||
|
||||
// Timer reference used for showHide animation callbacks.
|
||||
showHideTimer: null,
|
||||
|
||||
// Array to store lockStrings. These strings are used to lock
|
||||
// visibility when hiding and showing module.
|
||||
lockStrings: [],
|
||||
|
||||
/* init()
|
||||
* Is called when the module is instantiated.
|
||||
*/
|
||||
init: function() {
|
||||
init: function () {
|
||||
//Log.log(this.defaults);
|
||||
},
|
||||
|
||||
/* start()
|
||||
* Is called when the module is started.
|
||||
*/
|
||||
start: function() {
|
||||
start: function () {
|
||||
Log.info("Starting module: " + this.name);
|
||||
},
|
||||
|
||||
@@ -39,7 +46,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* return Array<String> - An array with filenames.
|
||||
*/
|
||||
getScripts: function() {
|
||||
getScripts: function () {
|
||||
return [];
|
||||
},
|
||||
|
||||
@@ -48,7 +55,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* return Array<String> - An array with filenames.
|
||||
*/
|
||||
getStyles: function() {
|
||||
getStyles: function () {
|
||||
return [];
|
||||
},
|
||||
|
||||
@@ -57,7 +64,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* return Map<String, String> - A map with langKeys and filenames.
|
||||
*/
|
||||
getTranslations: function() {
|
||||
getTranslations: function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
@@ -67,7 +74,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* return domobject - The dom to display.
|
||||
*/
|
||||
getDom: function() {
|
||||
getDom: function () {
|
||||
var nameWrapper = document.createElement("div");
|
||||
var name = document.createTextNode(this.name);
|
||||
nameWrapper.appendChild(name);
|
||||
@@ -84,15 +91,26 @@ var Module = Class.extend({
|
||||
return div;
|
||||
},
|
||||
|
||||
/* getHeader()
|
||||
* This method generates the header string which needs to be displayed if a user has a header configured for this module.
|
||||
* This method is called by the Magic Mirror core, but only if the user has configured a default header for the module.
|
||||
* This method needs to be subclassed if the module wants to display modified headers on the mirror.
|
||||
*
|
||||
* return string - The header to display above the header.
|
||||
*/
|
||||
getHeader: function () {
|
||||
return this.data.header;
|
||||
},
|
||||
|
||||
/* notificationReceived(notification, payload, sender)
|
||||
* This method is called when a notification arrives.
|
||||
* This method is called by the Magic Mirror core.
|
||||
*
|
||||
* argument notification string - The identifier of the noitication.
|
||||
* argument notification string - The identifier of the notification.
|
||||
* argument payload mixed - The payload of the notification.
|
||||
* argument sender Module - The module that sent the notification.
|
||||
*/
|
||||
notificationReceived: function(notification, payload, sender) {
|
||||
notificationReceived: function (notification, payload, sender) {
|
||||
if (sender) {
|
||||
Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name);
|
||||
} else {
|
||||
@@ -103,24 +121,24 @@ var Module = Class.extend({
|
||||
/* socketNotificationReceived(notification, payload)
|
||||
* This method is called when a socket notification arrives.
|
||||
*
|
||||
* argument notification string - The identifier of the noitication.
|
||||
* argument notification string - The identifier of the notification.
|
||||
* argument payload mixed - The payload of the notification.
|
||||
*/
|
||||
socketNotificationReceived: function(notification, payload) {
|
||||
socketNotificationReceived: function (notification, payload) {
|
||||
Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
|
||||
},
|
||||
|
||||
/* suspend()
|
||||
* This method is called when a module is hidden.
|
||||
*/
|
||||
suspend: function() {
|
||||
Log.log(this.name + " is suspend.");
|
||||
suspend: function () {
|
||||
Log.log(this.name + " is suspended.");
|
||||
},
|
||||
|
||||
/* resume()
|
||||
* This method is called when a module is shown.
|
||||
*/
|
||||
resume: function() {
|
||||
resume: function () {
|
||||
Log.log(this.name + " is resumed.");
|
||||
},
|
||||
|
||||
@@ -133,7 +151,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument data obejct - Module data.
|
||||
*/
|
||||
setData: function(data) {
|
||||
setData: function (data) {
|
||||
this.data = data;
|
||||
this.name = data.name;
|
||||
this.identifier = data.identifier;
|
||||
@@ -147,21 +165,21 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument config obejct - Module config.
|
||||
*/
|
||||
setConfig: function(config) {
|
||||
this.config = Object.assign(this.defaults, config);
|
||||
setConfig: function (config) {
|
||||
this.config = Object.assign({}, this.defaults, config);
|
||||
},
|
||||
|
||||
/* socket()
|
||||
* Returns a socket object. If it doesn"t exsist, it"s created.
|
||||
* Returns a socket object. If it doesn"t exist, it"s created.
|
||||
* It also registers the notification callback.
|
||||
*/
|
||||
socket: function() {
|
||||
socket: function () {
|
||||
if (typeof this._socket === "undefined") {
|
||||
this._socket = this._socket = new MMSocket(this.name);
|
||||
}
|
||||
|
||||
var self = this;
|
||||
this._socket.setNotificationCallback(function(notification, payload) {
|
||||
this._socket.setNotificationCallback(function (notification, payload) {
|
||||
self.socketNotificationReceived(notification, payload);
|
||||
});
|
||||
|
||||
@@ -175,7 +193,7 @@ var Module = Class.extend({
|
||||
*
|
||||
* return string - File path.
|
||||
*/
|
||||
file: function(file) {
|
||||
file: function (file) {
|
||||
return this.data.path + "/" + file;
|
||||
},
|
||||
|
||||
@@ -184,14 +202,14 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument callback function - Function called when done.
|
||||
*/
|
||||
loadStyles: function(callback) {
|
||||
loadStyles: function (callback) {
|
||||
var self = this;
|
||||
var styles = this.getStyles();
|
||||
|
||||
var loadNextStyle = function() {
|
||||
var loadNextStyle = function () {
|
||||
if (styles.length > 0) {
|
||||
var nextStyle = styles[0];
|
||||
Loader.loadFile(nextStyle, self, function() {
|
||||
Loader.loadFile(nextStyle, self, function () {
|
||||
styles = styles.slice(1);
|
||||
loadNextStyle();
|
||||
});
|
||||
@@ -208,14 +226,14 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument callback function - Function called when done.
|
||||
*/
|
||||
loadScripts: function(callback) {
|
||||
loadScripts: function (callback) {
|
||||
var self = this;
|
||||
var scripts = this.getScripts();
|
||||
|
||||
var loadNextScript = function() {
|
||||
var loadNextScript = function () {
|
||||
if (scripts.length > 0) {
|
||||
var nextScript = scripts[0];
|
||||
Loader.loadFile(nextScript, self, function() {
|
||||
Loader.loadFile(nextScript, self, function () {
|
||||
scripts = scripts.slice(1);
|
||||
loadNextScript();
|
||||
});
|
||||
@@ -232,14 +250,14 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument callback function - Function called when done.
|
||||
*/
|
||||
loadTranslations: function(callback) {
|
||||
loadTranslations: function (callback) {
|
||||
var self = this;
|
||||
var translations = this.getTranslations();
|
||||
var lang = config.language.toLowerCase();
|
||||
|
||||
// The variable `first` will contain the first
|
||||
// defined translation after the following line.
|
||||
for (var first in translations) {break;}
|
||||
for (var first in translations) { break; }
|
||||
|
||||
if (translations) {
|
||||
var translationFile = translations[lang] || undefined;
|
||||
@@ -247,8 +265,8 @@ var Module = Class.extend({
|
||||
|
||||
// If a translation file is set, load it and then also load the fallback translation file.
|
||||
// Otherwise only load the fallback translation file.
|
||||
if (translationFile !== undefined) {
|
||||
Translator.load(self, translationFile, false, function() {
|
||||
if (translationFile !== undefined && translationFile !== translationsFallbackFile) {
|
||||
Translator.load(self, translationFile, false, function () {
|
||||
Translator.load(self, translationsFallbackFile, true, callback);
|
||||
});
|
||||
} else {
|
||||
@@ -259,13 +277,13 @@ var Module = Class.extend({
|
||||
}
|
||||
},
|
||||
|
||||
/* translate(key, defaultValue)
|
||||
* Request the translation for a given key.
|
||||
*
|
||||
* argument key string - The key of the string to translage
|
||||
* argument defaultValue string - The default value if no translation was found. (Optional)
|
||||
*/
|
||||
translate: function(key, defaultValue) {
|
||||
/* translate(key, defaultValue)
|
||||
* Request the translation for a given key.
|
||||
*
|
||||
* argument key string - The key of the string to translage
|
||||
* argument defaultValue string - The default value if no translation was found. (Optional)
|
||||
*/
|
||||
translate: function (key, defaultValue) {
|
||||
return Translator.translate(this, key) || defaultValue || "";
|
||||
},
|
||||
|
||||
@@ -274,27 +292,27 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument speed Number - The speed of the animation. (Optional)
|
||||
*/
|
||||
updateDom: function(speed) {
|
||||
updateDom: function (speed) {
|
||||
MM.updateDom(this, speed);
|
||||
},
|
||||
|
||||
/* sendNotification(notification, payload)
|
||||
* Send a notification to all modules.
|
||||
*
|
||||
* argument notification string - The identifier of the noitication.
|
||||
* argument notification string - The identifier of the notification.
|
||||
* argument payload mixed - The payload of the notification.
|
||||
*/
|
||||
sendNotification: function(notification, payload) {
|
||||
sendNotification: function (notification, payload) {
|
||||
MM.sendNotification(notification, payload, this);
|
||||
},
|
||||
|
||||
/* sendSocketNotification(notification, payload)
|
||||
* Send a socket notification to the node helper.
|
||||
*
|
||||
* argument notification string - The identifier of the noitication.
|
||||
* argument notification string - The identifier of the notification.
|
||||
* argument payload mixed - The payload of the notification.
|
||||
*/
|
||||
sendSocketNotification: function(notification, payload) {
|
||||
sendSocketNotification: function (notification, payload) {
|
||||
this.socket().sendNotification(notification, payload);
|
||||
},
|
||||
|
||||
@@ -303,15 +321,22 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument speed Number - The speed of the hide animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
* argument options object - Optional settings for the hide method.
|
||||
*/
|
||||
hide: function(speed, callback) {
|
||||
callback = callback || function() {};
|
||||
hide: function (speed, callback, options) {
|
||||
if (typeof callback === "object") {
|
||||
options = callback;
|
||||
callback = function () { };
|
||||
}
|
||||
|
||||
callback = callback || function () { };
|
||||
options = options || {};
|
||||
|
||||
var self = this;
|
||||
MM.hideModule(self, speed, function() {
|
||||
MM.hideModule(self, speed, function () {
|
||||
self.suspend();
|
||||
callback();
|
||||
});
|
||||
}, options);
|
||||
},
|
||||
|
||||
/* showModule(module, speed, callback)
|
||||
@@ -319,29 +344,29 @@ var Module = Class.extend({
|
||||
*
|
||||
* argument speed Number - The speed of the show animation.
|
||||
* argument callback function - Called when the animation is done.
|
||||
* argument options object - Optional settings for the hide method.
|
||||
*/
|
||||
show: function(speed, callback) {
|
||||
show: function (speed, callback, options) {
|
||||
if (typeof callback === "object") {
|
||||
options = callback;
|
||||
callback = function () { };
|
||||
}
|
||||
|
||||
callback = callback || function () { };
|
||||
options = options || {};
|
||||
|
||||
this.resume();
|
||||
MM.showModule(this, speed, callback);
|
||||
MM.showModule(this, speed, callback, options);
|
||||
}
|
||||
});
|
||||
|
||||
Module.definitions = {};
|
||||
|
||||
Module.create = function(name) {
|
||||
Module.create = function (name) {
|
||||
|
||||
//Define the clone method for later use.
|
||||
function cloneObject(obj) {
|
||||
if (obj === null || typeof obj !== "object") {
|
||||
return obj;
|
||||
}
|
||||
|
||||
var temp = obj.constructor(); // give temp the original obj"s constructor
|
||||
for (var key in obj) {
|
||||
temp[key] = cloneObject(obj[key]);
|
||||
}
|
||||
|
||||
return temp;
|
||||
// Make sure module definition is available.
|
||||
if (!Module.definitions[name]) {
|
||||
return;
|
||||
}
|
||||
|
||||
var moduleDefinition = Module.definitions[name];
|
||||
@@ -354,7 +379,39 @@ Module.create = function(name) {
|
||||
|
||||
};
|
||||
|
||||
Module.register = function(name, moduleDefinition) {
|
||||
/* cmpVersions(a,b)
|
||||
* Compare two symantic version numbers and return the difference.
|
||||
*
|
||||
* argument a string - Version number a.
|
||||
* argument a string - Version number b.
|
||||
*/
|
||||
function cmpVersions(a, b) {
|
||||
var i, diff;
|
||||
var regExStrip0 = /(\.0+)+$/;
|
||||
var segmentsA = a.replace(regExStrip0, "").split(".");
|
||||
var segmentsB = b.replace(regExStrip0, "").split(".");
|
||||
var l = Math.min(segmentsA.length, segmentsB.length);
|
||||
|
||||
for (i = 0; i < l; i++) {
|
||||
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
|
||||
if (diff) {
|
||||
return diff;
|
||||
}
|
||||
}
|
||||
return segmentsA.length - segmentsB.length;
|
||||
}
|
||||
|
||||
Module.register = function (name, moduleDefinition) {
|
||||
|
||||
if (moduleDefinition.requiresVersion) {
|
||||
Log.log("Check MagicMirror version for module '" + name + "' - Minimum version: " + moduleDefinition.requiresVersion + " - Current version: " + version);
|
||||
if (cmpVersions(version, moduleDefinition.requiresVersion) >= 0) {
|
||||
Log.log("Version is ok!");
|
||||
} else {
|
||||
Log.log("Version is incorrect. Skip module: '" + name + "'");
|
||||
return;
|
||||
}
|
||||
}
|
||||
Log.log("Module registered: " + name);
|
||||
Module.definitions[name] = moduleDefinition;
|
||||
};
|
||||
|
38
js/server.js
@@ -10,21 +10,43 @@ var app = require("express")();
|
||||
var server = require("http").Server(app);
|
||||
var io = require("socket.io")(server);
|
||||
var path = require("path");
|
||||
var ipfilter = require("express-ipfilter").IpFilter;
|
||||
var fs = require("fs");
|
||||
var helmet = require("helmet");
|
||||
|
||||
var Server = function(config, callback) {
|
||||
console.log("Starting server op port " + config.port + " ... ");
|
||||
|
||||
server.listen(config.port);
|
||||
server.listen(config.port, config.address ? config.address : null);
|
||||
|
||||
app.use(function(req, res, next) {
|
||||
var result = ipfilter(config.ipWhitelist, {mode: "allow", log: false})(req, res, function(err) {
|
||||
if (err === undefined) {
|
||||
return next();
|
||||
}
|
||||
console.log(err.message);
|
||||
res.status(403).send("This device is not allowed to access your mirror. <br> Please check your config.js or config.js.sample to change this.");
|
||||
});
|
||||
});
|
||||
app.use(helmet());
|
||||
|
||||
app.use("/js", express.static(__dirname));
|
||||
app.use("/config", express.static(path.resolve(__dirname + "/../config")));
|
||||
app.use("/css", express.static(path.resolve(__dirname + "/../css")));
|
||||
app.use("/fonts", express.static(path.resolve(__dirname + "/../fonts")));
|
||||
app.use("/modules", express.static(path.resolve(__dirname + "/../modules")));
|
||||
app.use("/vendor", express.static(path.resolve(__dirname + "/../vendor")));
|
||||
app.use("/translations", express.static(path.resolve(__dirname + "/../translations")));
|
||||
app.use("/config", express.static(path.resolve(global.root_path + "/config")));
|
||||
app.use("/css", express.static(path.resolve(global.root_path + "/css")));
|
||||
app.use("/fonts", express.static(path.resolve(global.root_path + "/fonts")));
|
||||
app.use("/modules", express.static(path.resolve(global.root_path + "/modules")));
|
||||
app.use("/vendor", express.static(path.resolve(global.root_path + "/vendor")));
|
||||
app.use("/translations", express.static(path.resolve(global.root_path + "/translations")));
|
||||
|
||||
app.get("/version", function(req,res) {
|
||||
res.send(global.version);
|
||||
});
|
||||
|
||||
app.get("/", function(req, res) {
|
||||
res.sendFile(path.resolve(__dirname + "/../index.html"));
|
||||
var html = fs.readFileSync(path.resolve(global.root_path + "/index.html"), {encoding: "utf8"});
|
||||
html = html.replace("#VERSION#", global.version);
|
||||
|
||||
res.send(html);
|
||||
});
|
||||
|
||||
if (typeof callback === "function") {
|
||||
|
13
jsconfig.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=759670
|
||||
// for the documentation about the jsconfig.json format
|
||||
"compilerOptions": {
|
||||
"target": "es6",
|
||||
"module": "commonjs",
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"exclude": [
|
||||
"modules",
|
||||
"node_modules"
|
||||
]
|
||||
}
|
@@ -4,13 +4,13 @@ This document describes the way to develop your own MagicMirror² modules.
|
||||
|
||||
## Module structure
|
||||
|
||||
All modules are loaded in de `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
|
||||
All modules are loaded in the `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
|
||||
|
||||
A module can be placed in one single folder. Or multiple modules can be grouped in a subfoler. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
|
||||
A module can be placed in one single folder. Or multiple modules can be grouped in a subfolder. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
|
||||
|
||||
### Files
|
||||
- **modulename/modulename.js** - This is your core module script.
|
||||
- **modulename/node_helper.js** - This is an optional helper that whill be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
|
||||
- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
|
||||
- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`.
|
||||
- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles.
|
||||
|
||||
@@ -78,6 +78,19 @@ The data object contains additional metadata about the module instance:
|
||||
####`defaults: {}`
|
||||
Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules's configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later.
|
||||
|
||||
####'requiresVersion:'
|
||||
|
||||
*Introduced in version: 2.1.0.*
|
||||
|
||||
A string that defines the minimum version of the MagicMirror framework. If it is set, the system compares the required version with the users version. If the version of the user is out of date, it won't run the module. Make sure to also set this value in the Node helper.
|
||||
|
||||
**Note:** Since this check is introduced in version 2.1.0, this check will not be run in older versions. Keep this in mind if you get issue reports on your module.
|
||||
|
||||
Example:
|
||||
````javascript
|
||||
requiresVersion: "2.1.0",
|
||||
````
|
||||
|
||||
### Subclassable module methods
|
||||
|
||||
####`init()`
|
||||
@@ -104,7 +117,7 @@ The getScripts method is called to request any additional scripts that need to b
|
||||
getScripts: function() {
|
||||
return [
|
||||
'script.js', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
|
||||
'moment.js', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder.
|
||||
'moment.js', // this file is available in the vendor folder, so it doesn't need to be available in the module folder.
|
||||
this.file('anotherfile.js'), // this file will be loaded straight from the module folder.
|
||||
'https://code.jquery.com/jquery-2.2.3.min.js', // this file will be loaded from the jquery servers.
|
||||
]
|
||||
@@ -154,7 +167,7 @@ getTranslations: function() {
|
||||
####`getDom()`
|
||||
**Should return:** Dom Object
|
||||
|
||||
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefor return a dom object.
|
||||
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefore return a dom object.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -166,6 +179,23 @@ getDom: function() {
|
||||
|
||||
````
|
||||
|
||||
####`getHeader()`
|
||||
**Should return:** String
|
||||
|
||||
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getHeader method to retrieve the module's header. This method should therefor return a string. If this method is not subclassed, this function will return the user's configured header.
|
||||
|
||||
If you want to use the original user's configured header, reference `this.data.header`.
|
||||
|
||||
**NOTE:** If the user did not configure a default header, no header will be displayed and thus this method will not be called.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
getHeader: function() {
|
||||
return this.data.header + ' Foo Bar';
|
||||
}
|
||||
|
||||
````
|
||||
|
||||
####`notificationReceived(notification, payload, sender)`
|
||||
|
||||
That MagicMirror core has the ability to send notifications to modules. Or even better: the modules have the possibility to send notifications to other modules. When this module is called, it has 3 arguments:
|
||||
@@ -185,7 +215,7 @@ notificationReceived: function(notification, payload, sender) {
|
||||
}
|
||||
````
|
||||
|
||||
**Note:** the system sends two notifiations when starting up. These notifications could come in handy!
|
||||
**Note:** the system sends two notifications when starting up. These notifications could come in handy!
|
||||
|
||||
|
||||
- `ALL_MODULES_STARTED` - All modules are started. You can now send notifications to other modules.
|
||||
@@ -198,8 +228,8 @@ When using a node_helper, the node helper can send your module notifications. Wh
|
||||
- `notification` - String - The notification identifier.
|
||||
- `payload` - AnyType - The payload of a notification.
|
||||
|
||||
**Note 1:** When a node helper send a notification, all modules of that module type receive the same notifications. <br>
|
||||
**Note 2:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||
**Note 1:** When a node helper sends a notification, all modules of that module type receive the same notifications. <br>
|
||||
**Note 2:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -217,7 +247,7 @@ When a module will be shown after it was previously hidden (using the `module.sh
|
||||
|
||||
### Module instance methods
|
||||
|
||||
Each module instance has some handy methods which can be helpfull building your module.
|
||||
Each module instance has some handy methods which can be helpful building your module.
|
||||
|
||||
|
||||
####`this.file(filename)`
|
||||
@@ -229,7 +259,7 @@ If you want to create a path to a file in your module folder, use the `file()` m
|
||||
####`this.updateDom(speed)`
|
||||
***speed* Number** - Optional. Animation speed in milliseconds.<br>
|
||||
|
||||
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update it's dom object. If you define the speed, the content update will be animated, but only if the content will realy change.
|
||||
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update its dom object. If you define the speed, the content update will be animated, but only if the content will really change.
|
||||
|
||||
As an example: the clock modules calls this method every second:
|
||||
|
||||
@@ -248,7 +278,7 @@ start: function() {
|
||||
***notification* String** - The notification identifier.<br>
|
||||
***payload* AnyType** - Optional. A notification payload.<br>
|
||||
|
||||
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automaticly set to the instance calling the sendNotification method.
|
||||
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automatically set to the instance calling the sendNotification method.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -259,33 +289,103 @@ this.sendNotification('MYMODULE_READY_FOR_ACTION', {foo:bar});
|
||||
***notification* String** - The notification identifier.<br>
|
||||
***payload* AnyType** - Optional. A notification payload.<br>
|
||||
|
||||
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will recieve the socket notification.
|
||||
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will receive the socket notification.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
this.sendSocketNotification('SET_CONFIG', this.config);
|
||||
````
|
||||
|
||||
####`this.hide(speed, callback)`
|
||||
***speed* Number** - Optional, The speed of the hide animation in milliseconds.
|
||||
####`this.hide(speed, callback, options)`
|
||||
***speed* Number** - Optional (Required when setting callback or options), The speed of the hide animation in milliseconds.
|
||||
***callback* Function** - Optional, The callback after the hide animation is finished.
|
||||
***options* Function** - Optional, Object with additional options for the hide action (see below). (*Introduced in version: 2.1.0.*)
|
||||
|
||||
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itself using `this.hide()`, but of course you can also hide another module using `anOtherModule.hide()`.
|
||||
|
||||
Possible configurable options:
|
||||
|
||||
- `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. It's considered best practice to use your modules identifier as the locksString: `this.identifier`. See *visibility locking* below.
|
||||
|
||||
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itselve using `this.hide()`, but of course you can also hide an other module using `anOtherModule.hide()`.
|
||||
|
||||
**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.<br>
|
||||
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.<br>
|
||||
**Note 3:** If the dom is not yet created, the hide method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender).
|
||||
|
||||
####`this.show(speed, callback)`
|
||||
***speed* Number** - Optional, The speed of the show animation in milliseconds.
|
||||
***callback* Function** - Optional, The callback after the show animation is finished.
|
||||
|
||||
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itselve using `this.show()`, but of course you can also show an other module using `anOtherModule.show()`.
|
||||
####`this.show(speed, callback, options)`
|
||||
***speed* Number** - Optional (Required when setting callback or options), The speed of the show animation in milliseconds.
|
||||
***callback* Function** - Optional, The callback after the show animation is finished.
|
||||
***options* Function** - Optional, Object with additional options for the show action (see below). (*Introduced in version: 2.1.0.*)
|
||||
|
||||
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itself using `this.show()`, but of course you can also show another module using `anOtherModule.show()`.
|
||||
|
||||
Possible configurable options:
|
||||
|
||||
- `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. See *visibility locking* below.
|
||||
- `force` - Boolean - When setting the force tag to `true`, the locking mechanism will be overwritten. Use this option with caution. It's considered best practice to let the usage of the force option be use- configurable. See *visibility locking* below.
|
||||
|
||||
**Note 1:** If the show animation is canceled, for instance because the hide method is called before the show animation was finished, the callback will not be called.<br>
|
||||
**Note 2:** If the show animation is hijacked (an other method calls show on the same module), the callback will not be called.<br>
|
||||
**Note 3:** If the dom is not yet created, the show method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender).
|
||||
|
||||
####Visibility locking
|
||||
|
||||
(*Introduced in version: 2.1.0.*)
|
||||
|
||||
Visiblity locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept:
|
||||
|
||||
**Module B asks module A to hide:**
|
||||
````javascript
|
||||
moduleA.hide(0, {lockString: "module_b_identifier"});
|
||||
````
|
||||
Module A is now hidden, and has an lock array with the following strings:
|
||||
````javascript
|
||||
moduleA.lockStrings == ["module_b_identifier"]
|
||||
moduleA.hidden == true
|
||||
````
|
||||
**Module C asks module A to hide:**
|
||||
````javascript
|
||||
moduleA.hide(0, {lockString: "module_c_identifier"});
|
||||
````
|
||||
Module A is now hidden, and has an lock array with the following strings:
|
||||
````javascript
|
||||
moduleA.lockStrings == ["module_b_identifier", "module_c_identifier"]
|
||||
moduleA.hidden == true
|
||||
````
|
||||
**Module B asks module A to show:**
|
||||
````javascript
|
||||
moduleA.show(0, {lockString: "module_b_identifier"});
|
||||
````
|
||||
The lockString will be removed from moduleA’s locks array, but since there still is an other lock string available, the module remains hidden:
|
||||
````javascript
|
||||
moduleA.lockStrings == ["module_c_identifier"]
|
||||
moduleA.hidden == true
|
||||
````
|
||||
**Module C asks module A to show:**
|
||||
````javascript
|
||||
moduleA.show(0, {lockString: "module_c_identifier"});
|
||||
````
|
||||
The lockString will be removed from moduleA’s locks array, and since this will result in an empty lock array, the module will be visible:
|
||||
````javascript
|
||||
moduleA.lockStrings == []
|
||||
moduleA.hidden == false
|
||||
````
|
||||
|
||||
**Note:** The locking mechanism can be overwritten by using the force tag:
|
||||
````javascript
|
||||
moduleA.show(0, {force: true});
|
||||
````
|
||||
This will reset the lockstring array, and will show the module.
|
||||
````javascript
|
||||
moduleA.lockStrings == []
|
||||
moduleA.hidden == false
|
||||
````
|
||||
|
||||
Use this `force` method with caution. See `show()` method for more information.
|
||||
|
||||
|
||||
|
||||
####`this.translate(identifier)`
|
||||
***identifier* String** - Identifier of the string that should be translated.
|
||||
|
||||
@@ -298,7 +398,7 @@ If no translation is found, a fallback will be used. The fallback sequence is as
|
||||
- 4. Translation as defined in core translation file of the fallback language (the first defined core translation file).
|
||||
- 5. The key (identifier) of the translation.
|
||||
|
||||
When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the exsisting translations.
|
||||
When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -328,7 +428,7 @@ var NodeHelper = require("node_helper");
|
||||
module.exports = NodeHelper.create({});
|
||||
````
|
||||
|
||||
Of course, the above helper would not do anything usefull. So with the information above, you should be able to make it a bit more sophisticated.
|
||||
Of course, the above helper would not do anything useful. So with the information above, you should be able to make it a bit more sophisticated.
|
||||
|
||||
### Available module instance properties
|
||||
|
||||
@@ -356,7 +456,7 @@ start: function() {
|
||||
}
|
||||
````
|
||||
|
||||
**Note: ** By default, a public path to your module's public folder will be created:
|
||||
**Note:** By default, a public path to your module's public folder will be created:
|
||||
````javascript
|
||||
this.expressApp.use("/" + this.name, express.static(this.path + "/public"));
|
||||
````
|
||||
@@ -366,13 +466,26 @@ this.expressApp.use("/" + this.name, express.static(this.path + "/public"));
|
||||
|
||||
This is a link to the IO instance. It will allow you to do some Socket.IO magic. In most cases you won't need this, since the Node Helper has a few convenience methods to make this simple.
|
||||
|
||||
|
||||
####'requiresVersion:'
|
||||
*Introduced in version: 2.1.0.*
|
||||
|
||||
A string that defines the minimum version of the MagicMirror framework. If it is set, the system compares the required version with the users version. If the version of the user is out of date, it won't run the module.
|
||||
|
||||
**Note:** Since this check is introduced in version 2.1.0, this check will not be run in older versions. Keep this in mind if you get issue reports on your module.
|
||||
|
||||
Example:
|
||||
````javascript
|
||||
requiresVersion: "2.1.0",
|
||||
````
|
||||
|
||||
### Subclassable module methods
|
||||
|
||||
####`init()`
|
||||
This method is called when a node helper gets instantiated. In most cases you do not need to subclass this method.
|
||||
|
||||
####`start()`
|
||||
This method is called when all node helper are loaded an the system is ready to boot up. The start method is a perfect place to define any additional module properties:
|
||||
This method is called when all node helpers are loaded and the system is ready to boot up. The start method is a perfect place to define any additional module properties:
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -383,12 +496,12 @@ start: function() {
|
||||
````
|
||||
|
||||
####`socketNotificationReceived: function(notification, payload)`
|
||||
With this method, your node helper can receive notifications form your modules. When this method is called, it has 2 arguments:
|
||||
With this method, your node helper can receive notifications from your modules. When this method is called, it has 2 arguments:
|
||||
|
||||
- `notification` - String - The notification identifier.
|
||||
- `payload` - AnyType - The payload of a notification.
|
||||
|
||||
**Note:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||
**Note:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -399,15 +512,15 @@ socketNotificationReceived: function(notification, payload) {
|
||||
|
||||
### Module instance methods
|
||||
|
||||
Each node helper has some handy methods which can be helpfull building your module.
|
||||
Each node helper has some handy methods which can be helpful building your module.
|
||||
|
||||
####`this.sendSocketNotification(notification, payload)`
|
||||
***notification* String** - The notification identifier.<br>
|
||||
***payload* AnyType** - Optional. A notification payload.<br>
|
||||
|
||||
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will recieve the socket notification.
|
||||
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will receive the socket notification.
|
||||
|
||||
**Note:** Since all instances of you module will receive the notifications, it's your task to make sure the right module responds to your messages.
|
||||
**Note:** Since all instances of your module will receive the notifications, it's your task to make sure the right module responds to your messages.
|
||||
|
||||
**Example:**
|
||||
````javascript
|
||||
@@ -430,10 +543,10 @@ To make a selection of all currently loaded module instances, run the `MM.getMod
|
||||
|
||||
|
||||
#####`.withClass(classnames)`
|
||||
***classnames* String or Array** - The class names on which you want to filer.
|
||||
***classnames* String or Array** - The class names on which you want to filter.
|
||||
**Returns Array** - An array with module instances.<br>
|
||||
|
||||
If you want to make a selection based on one ore more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
|
||||
If you want to make a selection based on one or more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
|
||||
|
||||
**Examples:**
|
||||
````javascript
|
||||
@@ -459,7 +572,7 @@ var modules = MM.getModules().exceptWithClass(['classname1','classname2']);
|
||||
***module* Module Object** - The reference to a module you want to remove from the results.
|
||||
**Returns Array** - An array with module instances.<br>
|
||||
|
||||
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpfull if you want to select all module instances except the instance of your module.
|
||||
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpful if you want to select all module instances except the instance of your module.
|
||||
|
||||
**Examples:**
|
||||
````javascript
|
||||
|
@@ -45,9 +45,9 @@ The following properties can be configured:
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>display_time</code></td>
|
||||
<td>Time a notification is displayed in seconds.<br>
|
||||
<br><b>Possible values:</b> <code>float</code> <code>int</code>
|
||||
<br><b>Default value:</b> <code>3.5</code>
|
||||
<td>Time a notification is displayed in milliseconds.<br>
|
||||
<br><b>Possible values:</b> <code>int</code>
|
||||
<br><b>Default value:</b> <code>3500</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -62,7 +62,7 @@ The following properties can be configured:
|
||||
<td><code>welcome_message</code></td>
|
||||
<td>Message shown at startup.<br>
|
||||
<br><b>Possible values:</b> <code>string</code> <code>false</code>
|
||||
<br><b>Default value:</b> <code>Welcome, start was successfull!</code>
|
||||
<br><b>Default value:</b> <code>false</code> (no message at startup)
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -162,4 +162,4 @@ self.sendNotification("SHOW_ALERT", {});
|
||||
|
||||
## Open Source Licenses
|
||||
###[NotificationStyles](https://github.com/codrops/NotificationStyles)
|
||||
See [ympanus.net](http://tympanus.net/codrops/licensing/) for license.
|
||||
See [ympanus.net](http://tympanus.net/codrops/licensing/) for license.
|
||||
|
@@ -35,9 +35,19 @@ Module.register("alert",{
|
||||
},
|
||||
show_notification: function(message) {
|
||||
if (this.config.effect == "slide") {this.config.effect = this.config.effect + "-" + this.config.position;}
|
||||
message = "<span class='thin' style='line-height: 35px; font-size:24px' color='#4A4A4A'>" + message.title + "</span><br /><span class='light' style='font-size:28px;line-height: 30px;'>" + message.message + "</span>";
|
||||
msg = "";
|
||||
if (message.title) {
|
||||
msg += "<span class='thin' style='line-height: 35px; font-size:24px' color='#4A4A4A'>" + message.title + "</span>";
|
||||
}
|
||||
if (message.message){
|
||||
if (msg != ""){
|
||||
msg+= "<br />";
|
||||
}
|
||||
msg += "<span class='light' style='font-size:28px;line-height: 30px;'>" + message.message + "</span>";
|
||||
}
|
||||
|
||||
new NotificationFx({
|
||||
message: message,
|
||||
message: msg,
|
||||
layout: "growl",
|
||||
effect: this.config.effect,
|
||||
ttl: this.config.display_time
|
||||
@@ -67,7 +77,19 @@ Module.register("alert",{
|
||||
this.hide_alert(sender);
|
||||
}
|
||||
|
||||
message = "<span class='light' style='line-height: 35px; font-size:30px' color='#4A4A4A'>" + params.title + "</span><br /><span class='thin' style='font-size:22px;line-height: 30px;'>" + params.message + "</span>";
|
||||
//Display title and message only if they are provided in notification parameters
|
||||
message ="";
|
||||
if (params.title) {
|
||||
message += "<span class='light' style='line-height: 35px; font-size:30px' color='#4A4A4A'>" + params.title + "</span>"
|
||||
}
|
||||
if (params.message) {
|
||||
if (message != ""){
|
||||
message += "<br />";
|
||||
}
|
||||
|
||||
message += "<span class='thin' style='font-size:22px;line-height: 30px;'>" + params.message + "</span>";
|
||||
}
|
||||
|
||||
//Store alert in this.alerts
|
||||
this.alerts[sender.name] = new NotificationFx({
|
||||
message: image + message,
|
||||
|
4
modules/default/alert/translations/da.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"sysTitle": "MagicMirror Notifikation",
|
||||
"welcome": "Velkommen, modulet er succesfuldt startet!"
|
||||
}
|
4
modules/default/alert/translations/es.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"sysTitle": "MagicMirror Notificaciones",
|
||||
"welcome": "Bienvenido, ¡se iniciado correctamente!"
|
||||
}
|
@@ -106,10 +106,16 @@ The following properties can be configured:
|
||||
<td><code>titleReplace</code></td>
|
||||
<td>An object of textual replacements applied to the tile of the event. This allow to remove or replace certains words in the title.<br>
|
||||
<br><b>Example:</b> <br>
|
||||
|
||||
<code>
|
||||
titleReplace: {'Birthday of ' : '', 'foo':'bar'}
|
||||
</code>
|
||||
<br><b>Default value:</b>
|
||||
<code>
|
||||
{
|
||||
"De verjaardag van ": "",
|
||||
"'s birthday": ""
|
||||
}
|
||||
</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -119,6 +125,13 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>dateFormat</code></td>
|
||||
<td>Format to use for the date of events (when using absolute dates)<br>
|
||||
<br><b>Possible values:</b> See <a href="http://momentjs.com/docs/#/parsing/string-format/">Moment.js formats</a>
|
||||
<br><b>Default value:</b> <code>MMM Do</code> (e.g. Jan 18th)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>timeFormat</code></td>
|
||||
<td>Display event times as absolute dates, or relative time<br>
|
||||
@@ -126,12 +139,33 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>relative</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>getRelative</code></td>
|
||||
<td>How much time (in hours) should be left until calendar events start getting relative?<br>
|
||||
<br><b>Possible values:</b> <code>0</code> (events stay absolute) - <code>48</code> (48 hours before the event starts)
|
||||
<br><b>Default value:</b> <code>6</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>urgency</code></td>
|
||||
<td>When using a timeFormat of <code>absolute</code>, the <code>urgency</code> setting allows you to display events within a specific time frame as <code>relative</code>
|
||||
This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates<br>
|
||||
<br><b>Possible values:</b> a positive integer representing the number of days for which you want a relative date, for example <code>7</code> (for 7 days)<br>
|
||||
<br><b>Default value:</b> <code>0</code> (disabled)
|
||||
<br><b>Default value:</b> <code>7</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>broadcastEvents</code></td>
|
||||
<td>If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: <code>CALENDAR_EVENTS</code>. The event objects are stored in an array and contain the following fields: <code>title</code>, <code>startDate</code>, <code>endDate</code>, <code>fullDayEvent</code>, <code>location</code> and <code>geo</code>.<br>
|
||||
<br><b>Possible values:</b> <code>true</code>, <code>false</code> <br>
|
||||
<br><b>Default value:</b> <code>true</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hidePrivate</code></td>
|
||||
<td>Hides private calendar events.<br>
|
||||
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -171,17 +205,25 @@ config: {
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code> symbol </code></td>
|
||||
<td><code>symbol</code></td>
|
||||
<td>The symbol to show in front of an event. This property is optional.<br>
|
||||
<br><b>Possible values:</b> See <a href="http://fontawesome.io/icons/" target="_blank">Font Awsome</a> website.
|
||||
<br><b>Possible values:</b> See <a href="http://fontawesome.io/icons/" target="_blank">Font Awesome</a> website.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code> repeatingCountTitle </code></td>
|
||||
<td><code>repeatingCountTitle</code></td>
|
||||
<td>The count title for yearly repating events in this calendar. <br>
|
||||
<br><b>Example:</b> <br>
|
||||
<code>'Birthday'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>user</code></td>
|
||||
<td>The username for HTTP Basic authentication.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>pass</code></td>
|
||||
<td>The password for HTTP Basic authentication.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* MIT Licensed.
|
||||
*/
|
||||
|
||||
Module.register("calendar",{
|
||||
Module.register("calendar", {
|
||||
|
||||
// Define module defaults
|
||||
defaults: {
|
||||
@@ -16,14 +16,17 @@ Module.register("calendar",{
|
||||
displaySymbol: true,
|
||||
defaultSymbol: "calendar", // Fontawesome Symbol see http://fontawesome.io/cheatsheet/
|
||||
displayRepeatingCountTitle: false,
|
||||
defaultRepeatingCountTitle: '',
|
||||
defaultRepeatingCountTitle: "",
|
||||
maxTitleLength: 25,
|
||||
fetchInterval: 5 * 60 * 1000, // Update every 5 minutes.
|
||||
animationSpeed: 2000,
|
||||
fade: true,
|
||||
urgency: 7,
|
||||
timeFormat: "relative",
|
||||
dateFormat: "MMM Do",
|
||||
getRelative: 6,
|
||||
fadePoint: 0.25, // Start on 1/4th of the list.
|
||||
hidePrivate: false,
|
||||
calendars: [
|
||||
{
|
||||
symbol: "calendar",
|
||||
@@ -31,30 +34,32 @@ Module.register("calendar",{
|
||||
},
|
||||
],
|
||||
titleReplace: {
|
||||
"De verjaardag van ": ""
|
||||
"De verjaardag van ": "",
|
||||
"'s birthday": ""
|
||||
},
|
||||
broadcastEvents: true
|
||||
},
|
||||
|
||||
// Define required scripts.
|
||||
getStyles: function() {
|
||||
getStyles: function () {
|
||||
return ["calendar.css", "font-awesome.css"];
|
||||
},
|
||||
|
||||
// Define required scripts.
|
||||
getScripts: function() {
|
||||
getScripts: function () {
|
||||
return ["moment.js"];
|
||||
},
|
||||
|
||||
// Define required translations.
|
||||
getTranslations: function() {
|
||||
getTranslations: function () {
|
||||
// The translations for the defaut modules are defined in the core translation files.
|
||||
// Therefor we can just return false. Otherwise we should have returned a dictionairy.
|
||||
// If you're trying to build yiur own module including translations, check out the documentation.
|
||||
// If you're trying to build your own module including translations, check out the documentation.
|
||||
return false;
|
||||
},
|
||||
|
||||
// Override start method.
|
||||
start: function() {
|
||||
start: function () {
|
||||
Log.log("Starting module: " + this.name);
|
||||
|
||||
// Set locale.
|
||||
@@ -63,7 +68,7 @@ Module.register("calendar",{
|
||||
for (var c in this.config.calendars) {
|
||||
var calendar = this.config.calendars[c];
|
||||
calendar.url = calendar.url.replace("webcal://", "http://");
|
||||
this.addCalendar(calendar.url);
|
||||
this.addCalendar(calendar.url, calendar.user, calendar.pass);
|
||||
}
|
||||
|
||||
this.calendarData = {};
|
||||
@@ -71,11 +76,15 @@ Module.register("calendar",{
|
||||
},
|
||||
|
||||
// Override socket notification handler.
|
||||
socketNotificationReceived: function(notification, payload) {
|
||||
socketNotificationReceived: function (notification, payload) {
|
||||
if (notification === "CALENDAR_EVENTS") {
|
||||
if (this.hasCalendarURL(payload.url)) {
|
||||
this.calendarData[payload.url] = payload.events;
|
||||
this.loaded = true;
|
||||
|
||||
if (this.config.broadcastEvents) {
|
||||
this.broadcastEvents();
|
||||
}
|
||||
}
|
||||
} else if (notification === "FETCH_ERROR") {
|
||||
Log.error("Calendar Error. Could not fetch calendar: " + payload.url);
|
||||
@@ -89,7 +98,7 @@ Module.register("calendar",{
|
||||
},
|
||||
|
||||
// Override dom generator.
|
||||
getDom: function() {
|
||||
getDom: function () {
|
||||
|
||||
var events = this.createEventList();
|
||||
var wrapper = document.createElement("table");
|
||||
@@ -108,27 +117,27 @@ Module.register("calendar",{
|
||||
eventWrapper.className = "normal";
|
||||
|
||||
if (this.config.displaySymbol) {
|
||||
var symbolWrapper = document.createElement("td");
|
||||
var symbolWrapper = document.createElement("td");
|
||||
symbolWrapper.className = "symbol";
|
||||
var symbol = document.createElement("span");
|
||||
var symbol = document.createElement("span");
|
||||
symbol.className = "fa fa-" + this.symbolForUrl(event.url);
|
||||
symbolWrapper.appendChild(symbol);
|
||||
eventWrapper.appendChild(symbolWrapper);
|
||||
}
|
||||
|
||||
var titleWrapper = document.createElement("td"),
|
||||
repeatingCountTitle = '';
|
||||
repeatingCountTitle = "";
|
||||
|
||||
|
||||
if (this.config.displayRepeatingCountTitle) {
|
||||
|
||||
repeatingCountTitle = this.countTitleForUrl(event.url);
|
||||
|
||||
if(repeatingCountTitle !== '') {
|
||||
var thisYear = new Date().getFullYear(),
|
||||
if (repeatingCountTitle !== "") {
|
||||
var thisYear = new Date(parseInt(event.startDate)).getFullYear(),
|
||||
yearDiff = thisYear - event.firstYear;
|
||||
|
||||
repeatingCountTitle = ', '+ yearDiff + '. ' + repeatingCountTitle;
|
||||
repeatingCountTitle = ", " + yearDiff + ". " + repeatingCountTitle;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,19 +145,25 @@ Module.register("calendar",{
|
||||
titleWrapper.className = "title bright";
|
||||
eventWrapper.appendChild(titleWrapper);
|
||||
|
||||
var timeWrapper = document.createElement("td");
|
||||
var timeWrapper = document.createElement("td");
|
||||
//console.log(event.today);
|
||||
var now = new Date();
|
||||
// Define second, minute, hour, and day variables
|
||||
var one_second = 1000; // 1,000 milliseconds
|
||||
var one_minute = one_second * 60;
|
||||
var one_hour = one_minute * 60;
|
||||
var one_day = one_hour * 24;
|
||||
var oneSecond = 1000; // 1,000 milliseconds
|
||||
var oneMinute = oneSecond * 60;
|
||||
var oneHour = oneMinute * 60;
|
||||
var oneDay = oneHour * 24;
|
||||
if (event.fullDayEvent) {
|
||||
if (event.today) {
|
||||
timeWrapper.innerHTML = this.translate("TODAY");
|
||||
} else if (event.startDate - now < one_day && event.startDate - now > 0) {
|
||||
timeWrapper.innerHTML = this.translate("TOMORROW");
|
||||
timeWrapper.innerHTML = this.capFirst(this.translate("TODAY"));
|
||||
} else if (event.startDate - now < oneDay && event.startDate - now > 0) {
|
||||
timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW"));
|
||||
} else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) {
|
||||
if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
|
||||
timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
|
||||
} else {
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
}
|
||||
} else {
|
||||
/* Check to see if the user displays absolute or relative dates with their events
|
||||
* Also check to see if an event is happening within an 'urgency' time frameElement
|
||||
@@ -158,26 +173,26 @@ Module.register("calendar",{
|
||||
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
|
||||
*/
|
||||
if (this.config.timeFormat === "absolute") {
|
||||
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * one_day))) {
|
||||
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
|
||||
// This event falls within the config.urgency period that the user has set
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
} else {
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").format("MMM Do");
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
|
||||
}
|
||||
} else {
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (event.startDate >= new Date()) {
|
||||
if (event.startDate - now < 2 * one_day) {
|
||||
if (event.startDate - now < 2 * oneDay) {
|
||||
// This event is within the next 48 hours (2 days)
|
||||
if (event.startDate - now < 6 * one_hour) {
|
||||
if (event.startDate - now < this.config.getRelative * oneHour) {
|
||||
// If event is within 6 hour, display 'in xxx' time format or moment.fromNow()
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
} else {
|
||||
// Otherwise just say 'Today/Tomorrow at such-n-such time'
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").calendar();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
|
||||
}
|
||||
} else {
|
||||
/* Check to see if the user displays absolute or relative dates with their events
|
||||
@@ -188,18 +203,18 @@ Module.register("calendar",{
|
||||
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
|
||||
*/
|
||||
if (this.config.timeFormat === "absolute") {
|
||||
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * one_day))) {
|
||||
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
|
||||
// This event falls within the config.urgency period that the user has set
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
} else {
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").format("MMM Do");
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
|
||||
}
|
||||
} else {
|
||||
timeWrapper.innerHTML = moment(event.startDate, "x").fromNow();
|
||||
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
timeWrapper.innerHTML = this.translate("RUNNING") + ' ' + moment(event.endDate,"x").fromNow(true);
|
||||
timeWrapper.innerHTML = this.capFirst(this.translate("RUNNING")) + " " + moment(event.endDate, "x").fromNow(true);
|
||||
}
|
||||
}
|
||||
//timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
|
||||
@@ -233,7 +248,7 @@ Module.register("calendar",{
|
||||
*
|
||||
* return bool - Has calendar url
|
||||
*/
|
||||
hasCalendarURL: function(url) {
|
||||
hasCalendarURL: function (url) {
|
||||
for (var c in this.config.calendars) {
|
||||
var calendar = this.config.calendars[c];
|
||||
if (calendar.url === url) {
|
||||
@@ -249,20 +264,26 @@ Module.register("calendar",{
|
||||
*
|
||||
* return array - Array with events.
|
||||
*/
|
||||
createEventList: function() {
|
||||
createEventList: function () {
|
||||
var events = [];
|
||||
var today = moment().startOf("day");
|
||||
for (var c in this.calendarData) {
|
||||
var calendar = this.calendarData[c];
|
||||
for (var e in calendar) {
|
||||
var event = calendar[e];
|
||||
if(this.config.hidePrivate) {
|
||||
if(event.class === "PRIVATE") {
|
||||
// do not add the current event, skip it
|
||||
continue;
|
||||
}
|
||||
}
|
||||
event.url = c;
|
||||
event.today = event.startDate >= today && event.startDate < (today + 24 * 60 * 60 * 1000);
|
||||
events.push(event);
|
||||
}
|
||||
}
|
||||
|
||||
events.sort(function(a, b) {
|
||||
events.sort(function (a, b) {
|
||||
return a.startDate - b.startDate;
|
||||
});
|
||||
|
||||
@@ -274,12 +295,14 @@ Module.register("calendar",{
|
||||
*
|
||||
* argument url sting - Url to add.
|
||||
*/
|
||||
addCalendar: function(url) {
|
||||
addCalendar: function (url, user, pass) {
|
||||
this.sendSocketNotification("ADD_CALENDAR", {
|
||||
url: url,
|
||||
maximumEntries: this.config.maximumEntries,
|
||||
maximumNumberOfDays: this.config.maximumNumberOfDays,
|
||||
fetchInterval: this.config.fetchInterval
|
||||
fetchInterval: this.config.fetchInterval,
|
||||
user: user,
|
||||
pass: pass
|
||||
});
|
||||
},
|
||||
|
||||
@@ -290,10 +313,10 @@ Module.register("calendar",{
|
||||
*
|
||||
* return string - The Symbol
|
||||
*/
|
||||
symbolForUrl: function(url) {
|
||||
symbolForUrl: function (url) {
|
||||
for (var c in this.config.calendars) {
|
||||
var calendar = this.config.calendars[c];
|
||||
if (calendar.url === url && typeof calendar.symbol === "string") {
|
||||
if (calendar.url === url && typeof calendar.symbol === "string") {
|
||||
return calendar.symbol;
|
||||
}
|
||||
}
|
||||
@@ -307,10 +330,10 @@ Module.register("calendar",{
|
||||
*
|
||||
* return string - The Symbol
|
||||
*/
|
||||
countTitleForUrl: function(url) {
|
||||
countTitleForUrl: function (url) {
|
||||
for (var c in this.config.calendars) {
|
||||
var calendar = this.config.calendars[c];
|
||||
if (calendar.url === url && typeof calendar.repeatingCountTitle === "string") {
|
||||
if (calendar.url === url && typeof calendar.repeatingCountTitle === "string") {
|
||||
return calendar.repeatingCountTitle;
|
||||
}
|
||||
}
|
||||
@@ -327,14 +350,23 @@ Module.register("calendar",{
|
||||
*
|
||||
* return string - The shortened string.
|
||||
*/
|
||||
shorten: function(string, maxLength) {
|
||||
shorten: function (string, maxLength) {
|
||||
if (string.length > maxLength) {
|
||||
return string.slice(0,maxLength) + "…";
|
||||
return string.slice(0, maxLength) + "…";
|
||||
}
|
||||
|
||||
return string;
|
||||
},
|
||||
|
||||
/* capFirst(string)
|
||||
* Capitalize the first letter of a string
|
||||
* Eeturn capitalized string
|
||||
*/
|
||||
|
||||
capFirst: function (string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
},
|
||||
|
||||
/* titleTransform(title)
|
||||
* Transforms the title of an event for usage.
|
||||
* Replaces parts of the text as defined in config.titleReplace.
|
||||
@@ -344,7 +376,7 @@ Module.register("calendar",{
|
||||
*
|
||||
* return string - The transformed title.
|
||||
*/
|
||||
titleTransform: function(title) {
|
||||
titleTransform: function (title) {
|
||||
for (var needle in this.config.titleReplace) {
|
||||
var replacement = this.config.titleReplace[needle];
|
||||
title = title.replace(needle, replacement);
|
||||
@@ -352,5 +384,28 @@ Module.register("calendar",{
|
||||
|
||||
title = this.shorten(title, this.config.maxTitleLength);
|
||||
return title;
|
||||
},
|
||||
|
||||
/* broadcastEvents()
|
||||
* Broadcasts the events to all other modules for reuse.
|
||||
* The all events available in one array, sorted on startdate.
|
||||
*/
|
||||
broadcastEvents: function () {
|
||||
var eventList = [];
|
||||
for (url in this.calendarData) {
|
||||
var calendar = this.calendarData[url];
|
||||
for (e in calendar) {
|
||||
var event = cloneObject(calendar[e]);
|
||||
delete event.url;
|
||||
eventList.push(event);
|
||||
}
|
||||
}
|
||||
|
||||
eventList.sort(function(a,b) {
|
||||
return a.startDate - b.startDate;
|
||||
});
|
||||
|
||||
this.sendNotification("CALENDAR_EVENTS", eventList);
|
||||
|
||||
}
|
||||
});
|
||||
|
@@ -8,7 +8,7 @@
|
||||
var ical = require("./vendor/ical.js");
|
||||
var moment = require("moment");
|
||||
|
||||
var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays) {
|
||||
var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, user, pass) {
|
||||
var self = this;
|
||||
|
||||
var reloadTimer = null;
|
||||
@@ -25,7 +25,22 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
clearTimeout(reloadTimer);
|
||||
reloadTimer = null;
|
||||
|
||||
ical.fromURL(url, {}, function(err, data) {
|
||||
nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
|
||||
var opts = {
|
||||
headers: {
|
||||
"User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"
|
||||
}
|
||||
};
|
||||
|
||||
if (user && pass) {
|
||||
opts.auth = {
|
||||
user: user,
|
||||
pass: pass,
|
||||
sendImmediately: true
|
||||
}
|
||||
}
|
||||
|
||||
ical.fromURL(url, opts, function(err, data) {
|
||||
if (err) {
|
||||
fetchFailedCallback(self, err);
|
||||
scheduleTimer();
|
||||
@@ -63,10 +78,11 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
if (!isFacebookBirthday) {
|
||||
endDate = startDate;
|
||||
} else {
|
||||
endDate = moment(startDate).add(1, 'days');
|
||||
endDate = moment(startDate).add(1, "days");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// calculate the duration f the event for use with recurring events.
|
||||
var duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x"));
|
||||
|
||||
@@ -81,20 +97,28 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
title = event.description;
|
||||
}
|
||||
|
||||
var location = event.location || false;
|
||||
var geo = event.geo || false;
|
||||
var description = event.description || false;
|
||||
|
||||
if (typeof event.rrule != "undefined" && !isFacebookBirthday) {
|
||||
var rule = event.rrule;
|
||||
var dates = rule.between(today, future, true, limitFunction);
|
||||
|
||||
for (var d in dates) {
|
||||
startDate = moment(new Date(dates[d]));
|
||||
endDate = moment(parseInt(startDate.format("x")) + duration, 'x');
|
||||
endDate = moment(parseInt(startDate.format("x")) + duration, "x");
|
||||
if (endDate.format("x") > now) {
|
||||
newEvents.push({
|
||||
title: title,
|
||||
startDate: startDate.format("x"),
|
||||
endDate: endDate.format("x"),
|
||||
fullDayEvent: isFullDayEvent(event),
|
||||
firstYear: event.start.getFullYear()
|
||||
class: event.class,
|
||||
firstYear: event.start.getFullYear(),
|
||||
location: location,
|
||||
geo: geo,
|
||||
description: description
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -118,14 +142,19 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
continue;
|
||||
}
|
||||
|
||||
// Every thing is good. Add it to the list.
|
||||
// Every thing is good. Add it to the list.
|
||||
|
||||
newEvents.push({
|
||||
title: title,
|
||||
startDate: startDate.format("x"),
|
||||
endDate: endDate.format("x"),
|
||||
fullDayEvent: fullDayEvent
|
||||
fullDayEvent: fullDayEvent,
|
||||
class: event.class,
|
||||
location: location,
|
||||
geo: geo,
|
||||
description: description
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -172,7 +201,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
|
||||
if (end - start === 24 * 60 * 60 * 1000 && startDate.getHours() === 0 && startDate.getMinutes() === 0) {
|
||||
// Is 24 hours, and starts on the middle of the night.
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -188,7 +217,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
};
|
||||
|
||||
/* broadcastItems()
|
||||
* Broadcast the exsisting events.
|
||||
* Broadcast the existing events.
|
||||
*/
|
||||
this.broadcastEvents = function() {
|
||||
//console.log('Broadcasting ' + events.length + ' events.');
|
||||
@@ -234,4 +263,4 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
|
||||
};
|
||||
|
||||
|
||||
module.exports = CalendarFetcher;
|
||||
module.exports = CalendarFetcher;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* CalendarFetcher Tester
|
||||
* use this script with `node debug.js` to test the fetcher without the need
|
||||
* use this script with `node debug.js` to test the fetcher without the need
|
||||
* of starting the MagicMirror core. Adjust the values below to your desire.
|
||||
*
|
||||
* By Michael Teeuw http://michaelteeuw.nl
|
||||
@@ -8,18 +8,18 @@
|
||||
|
||||
var CalendarFetcher = require("./calendarfetcher.js");
|
||||
|
||||
var url = 'https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics';
|
||||
var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics";
|
||||
var fetchInterval = 60 * 60 * 1000;
|
||||
var maximumEntries = 10;
|
||||
var maximumNumberOfDays = 365;
|
||||
|
||||
console.log('Create fetcher ...');
|
||||
console.log("Create fetcher ...");
|
||||
|
||||
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays);
|
||||
|
||||
fetcher.onReceive(function(fetcher) {
|
||||
console.log(fetcher.events());
|
||||
console.log('------------------------------------------------------------');
|
||||
console.log(fetcher.events());
|
||||
console.log("------------------------------------------------------------");
|
||||
});
|
||||
|
||||
fetcher.onError(function(fetcher, error) {
|
||||
@@ -29,5 +29,4 @@ fetcher.onError(function(fetcher, error) {
|
||||
|
||||
fetcher.startFetch();
|
||||
|
||||
console.log('Create fetcher done! ');
|
||||
|
||||
console.log("Create fetcher done! ");
|
||||
|
@@ -25,19 +25,19 @@ module.exports = NodeHelper.create({
|
||||
socketNotificationReceived: function(notification, payload) {
|
||||
if (notification === "ADD_CALENDAR") {
|
||||
//console.log('ADD_CALENDAR: ');
|
||||
this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays);
|
||||
this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.user, payload.pass);
|
||||
}
|
||||
},
|
||||
|
||||
/* createFetcher(url, reloadInterval)
|
||||
* Creates a fetcher for a new url if it doesn't exsist yet.
|
||||
* Otherwise it reuses the exsisting one.
|
||||
* Creates a fetcher for a new url if it doesn't exist yet.
|
||||
* Otherwise it reuses the existing one.
|
||||
*
|
||||
* attribute url string - URL of the news feed.
|
||||
* attribute reloadInterval number - Reload interval in milliseconds.
|
||||
*/
|
||||
|
||||
createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays) {
|
||||
createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass) {
|
||||
var self = this;
|
||||
|
||||
if (!validUrl.isUri(url)) {
|
||||
@@ -48,7 +48,7 @@ module.exports = NodeHelper.create({
|
||||
var fetcher;
|
||||
if (typeof self.fetchers[url] === "undefined") {
|
||||
console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval);
|
||||
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays);
|
||||
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass);
|
||||
|
||||
fetcher.onReceive(function(fetcher) {
|
||||
//console.log('Broadcast events.');
|
||||
@@ -69,7 +69,7 @@ module.exports = NodeHelper.create({
|
||||
|
||||
self.fetchers[url] = fetcher;
|
||||
} else {
|
||||
//console.log('Use exsisting news fetcher for url: ' + url);
|
||||
//console.log('Use existing news fetcher for url: ' + url);
|
||||
fetcher = self.fetchers[url];
|
||||
fetcher.broadcastEvents();
|
||||
}
|
||||
|
@@ -66,5 +66,62 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>showDate</code></td>
|
||||
<td>Turn off or on the Date section.<br>
|
||||
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
|
||||
<br><b>Default value:</b> <code>true</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>displayType</code></td>
|
||||
<td>Display a digital clock, analog clock, or both together.<br>
|
||||
<br><b>Possible values:</b> <code>digital</code>, <code>analog</code>, or <code>both</code>
|
||||
<br><b>Default value:</b> <code>digital</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>analogSize</code></td>
|
||||
<td><strong>Specific to the analog clock.</strong> Defines how large the analog display is.<br>
|
||||
<br><b>Possible values:</b> A positive number of pixels</code>
|
||||
<br><b>Default value:</b> <code>200px</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>analogFace</code></td>
|
||||
<td><strong>Specific to the analog clock.</strong> Specifies which clock face to use.<br>
|
||||
<br><b>Possible values:</b> <code>simple</code> for a simple border, <code>none</code> for no face or border, or <code>face-###</code> (where ### is currently a value between 001 and 012, inclusive)
|
||||
<br><b>Default value:</b> <code>simple</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>secondsColor</code></td>
|
||||
<td><strong>Specific to the analog clock.</strong> Specifies what color to make the 'seconds' hand.<br>
|
||||
<br><b>Possible values:</b> <code>any HTML RGB Color</code>
|
||||
<br><b>Default value:</b> <code>#888888</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>analogPlacement</code></td>
|
||||
<td><strong>Specific to the analog clock. <em>(requires displayType set to <code>'both'</code>)</em></strong> Specifies where the analog clock is in relation to the digital clock<br>
|
||||
<br><b>Possible values:</b> <code>top</code>, <code>right</code>, <code>bottom</code>, or <code>left</code>
|
||||
<br><b>Default value:</b> <code>bottom</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>analogShowDate</code></td>
|
||||
<td><strong>Specific to the analog clock.</strong> If the clock is used as a separate module and set to analog only, this configures whether a date is also displayed with the clock.<br>
|
||||
<br><b>Possible values:</b> <code>false</code>, <code>top</code>, or <code>bottom</code>
|
||||
<br><b>Default value:</b> <code>top</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>timezone</code></td>
|
||||
<td>Specific a timezone to show clock.<br>
|
||||
<br><b>Possible examples values:</b> <code>America/New_York</code>, <code>America/Santiago</code>, <code>Etc/GMT+10</code>
|
||||
<br><b>Default value:</b> <code>none</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -8,31 +8,54 @@
|
||||
Module.register("clock",{
|
||||
// Module config defaults.
|
||||
defaults: {
|
||||
displayType: "digital", // options: digital, analog, both
|
||||
|
||||
timeFormat: config.timeFormat,
|
||||
displaySeconds: true,
|
||||
showPeriod: true,
|
||||
showPeriodUpper: false,
|
||||
clockBold: false
|
||||
clockBold: false,
|
||||
showDate: true,
|
||||
|
||||
/* specific to the analog clock */
|
||||
analogSize: "200px",
|
||||
analogFace: "simple", // options: 'none', 'simple', 'face-###' (where ### is 001 to 012 inclusive)
|
||||
analogPlacement: "bottom", // options: 'top', 'bottom', 'left', 'right'
|
||||
analogShowDate: "top", // options: false, 'top', or 'bottom'
|
||||
secondsColor: "#888888",
|
||||
timezone: null,
|
||||
},
|
||||
// Define required scripts.
|
||||
getScripts: function() {
|
||||
return ["moment.js"];
|
||||
return ["moment.js", "moment-timezone.js"];
|
||||
},
|
||||
// Define styles.
|
||||
getStyles: function() {
|
||||
return ["clock_styles.css"];
|
||||
},
|
||||
// Define start sequence.
|
||||
start: function() {
|
||||
Log.info("Starting module: " + this.name);
|
||||
|
||||
// Schedule update interval.
|
||||
var self = this;
|
||||
setInterval(function() {
|
||||
self.updateDom();
|
||||
}, 1000);
|
||||
|
||||
// Set locale.
|
||||
moment.locale(config.language);
|
||||
|
||||
},
|
||||
// Override dom generator.
|
||||
getDom: function() {
|
||||
// Create wrappers.
|
||||
|
||||
var wrapper = document.createElement("div");
|
||||
|
||||
/************************************
|
||||
* Create wrappers for DIGITAL clock
|
||||
*/
|
||||
|
||||
var dateWrapper = document.createElement("div");
|
||||
var timeWrapper = document.createElement("div");
|
||||
var secondsWrapper = document.createElement("sup");
|
||||
@@ -47,10 +70,14 @@ Module.register("clock",{
|
||||
// So we need to generate the timestring manually.
|
||||
// See issue: https://github.com/MichMich/MagicMirror/issues/181
|
||||
var timeString;
|
||||
var now = moment();
|
||||
if (this.config.timezone) {
|
||||
now.tz(this.config.timezone);
|
||||
}
|
||||
if (this.config.clockBold === true) {
|
||||
timeString = moment().format("HH[<span class=\"bold\">]mm[</span>]");
|
||||
timeString = now.format("HH[<span class=\"bold\">]mm[</span>]");
|
||||
} else {
|
||||
timeString = moment().format("HH:mm");
|
||||
timeString = now.format("HH:mm");
|
||||
}
|
||||
|
||||
if (this.config.timeFormat !== 24) {
|
||||
@@ -58,29 +85,147 @@ Module.register("clock",{
|
||||
// var hours = now.getHours() % 12 || 12;
|
||||
if (this.config.clockBold === true) {
|
||||
//timeString = hours + moment().format("[<span class=\"bold\">]mm[</span>]");
|
||||
timeString = moment().format("h[<span class=\"bold\">]mm[</span>]");
|
||||
timeString = now.format("h[<span class=\"bold\">]mm[</span>]");
|
||||
} else {
|
||||
//timeString = hours + moment().format(":mm");
|
||||
timeString = moment().format("h:mm");
|
||||
timeString = now.format("h:mm");
|
||||
}
|
||||
}
|
||||
dateWrapper.innerHTML = moment().format("dddd, LL");
|
||||
timeWrapper.innerHTML = timeString;
|
||||
secondsWrapper.innerHTML = moment().format("ss");
|
||||
if (this.config.showPeriodUpper) {
|
||||
periodWrapper.innerHTML = moment().format("A");
|
||||
} else {
|
||||
periodWrapper.innerHTML = moment().format("a");
|
||||
if(this.config.showDate){
|
||||
dateWrapper.innerHTML = now.format("dddd, LL");
|
||||
}
|
||||
timeWrapper.innerHTML = timeString;
|
||||
secondsWrapper.innerHTML = now.format("ss");
|
||||
if (this.config.showPeriodUpper) {
|
||||
periodWrapper.innerHTML = now.format("A");
|
||||
} else {
|
||||
periodWrapper.innerHTML = now.format("a");
|
||||
}
|
||||
// Combine wrappers.
|
||||
wrapper.appendChild(dateWrapper);
|
||||
wrapper.appendChild(timeWrapper);
|
||||
if (this.config.displaySeconds) {
|
||||
timeWrapper.appendChild(secondsWrapper);
|
||||
}
|
||||
if (this.config.showPeriod && this.config.timeFormat !== 24) {
|
||||
timeWrapper.appendChild(periodWrapper);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* Create wrappers for ANALOG clock, only if specified in config
|
||||
*/
|
||||
|
||||
if (this.config.displayType !== "digital") {
|
||||
// If it isn't 'digital', then an 'analog' clock was also requested
|
||||
|
||||
// Calculate the degree offset for each hand of the clock
|
||||
var now = moment();
|
||||
if (this.config.timezone) {
|
||||
now.tz(this.config.timezone);
|
||||
}
|
||||
var second = now.seconds() * 6,
|
||||
minute = now.minute() * 6 + second / 60,
|
||||
hour = ((now.hours() % 12) / 12) * 360 + 90 + minute / 12;
|
||||
|
||||
// Create wrappers
|
||||
var wrapper = document.createElement("div");
|
||||
var clockCircle = document.createElement("div");
|
||||
clockCircle.className = "clockCircle";
|
||||
clockCircle.style.width = this.config.analogSize;
|
||||
clockCircle.style.height = this.config.analogSize;
|
||||
|
||||
if (this.config.analogFace != "" && this.config.analogFace != "simple" && this.config.analogFace != "none") {
|
||||
clockCircle.style.background = "url("+ this.data.path + "faces/" + this.config.analogFace + ".svg)";
|
||||
clockCircle.style.backgroundSize = "100%";
|
||||
} else if (this.config.analogFace != "none") {
|
||||
clockCircle.style.border = "2px solid white";
|
||||
}
|
||||
var clockFace = document.createElement("div");
|
||||
clockFace.className = "clockFace";
|
||||
|
||||
var clockHour = document.createElement("div");
|
||||
clockHour.id = "clockHour";
|
||||
clockHour.style.transform = "rotate(" + hour + "deg)";
|
||||
clockHour.className = "clockHour";
|
||||
var clockMinute = document.createElement("div");
|
||||
clockMinute.id = "clockMinute";
|
||||
clockMinute.style.transform = "rotate(" + minute + "deg)";
|
||||
clockMinute.className = "clockMinute";
|
||||
|
||||
// Combine analog wrappers
|
||||
clockFace.appendChild(clockHour);
|
||||
clockFace.appendChild(clockMinute);
|
||||
|
||||
if (this.config.displaySeconds) {
|
||||
var clockSecond = document.createElement("div");
|
||||
clockSecond.id = "clockSecond";
|
||||
clockSecond.style.transform = "rotate(" + second + "deg)";
|
||||
clockSecond.className = "clockSecond";
|
||||
clockSecond.style.backgroundColor = this.config.secondsColor;
|
||||
clockFace.appendChild(clockSecond);
|
||||
}
|
||||
clockCircle.appendChild(clockFace);
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
* Combine wrappers, check for .displayType
|
||||
*/
|
||||
|
||||
if (this.config.displayType === "digital") {
|
||||
// Display only a digital clock
|
||||
wrapper.appendChild(dateWrapper);
|
||||
wrapper.appendChild(timeWrapper);
|
||||
} else if (this.config.displayType === "analog") {
|
||||
// Display only an analog clock
|
||||
dateWrapper.style.textAlign = "center";
|
||||
dateWrapper.style.paddingBottom = "15px";
|
||||
if (this.config.analogShowDate === "top") {
|
||||
wrapper.appendChild(dateWrapper);
|
||||
wrapper.appendChild(clockCircle);
|
||||
} else if (this.config.analogShowDate === "bottom") {
|
||||
wrapper.appendChild(clockCircle);
|
||||
wrapper.appendChild(dateWrapper);
|
||||
} else {
|
||||
wrapper.appendChild(clockCircle);
|
||||
}
|
||||
} else {
|
||||
// Both clocks have been configured, check position
|
||||
var placement = this.config.analogPlacement;
|
||||
|
||||
analogWrapper = document.createElement("div");
|
||||
analogWrapper.id = "analog";
|
||||
analogWrapper.style.cssFloat = "none";
|
||||
analogWrapper.appendChild(clockCircle);
|
||||
digitalWrapper = document.createElement("div");
|
||||
digitalWrapper.id = "digital";
|
||||
digitalWrapper.style.cssFloat = "none";
|
||||
digitalWrapper.appendChild(dateWrapper);
|
||||
digitalWrapper.appendChild(timeWrapper);
|
||||
|
||||
if (placement === "left" || placement === "right") {
|
||||
digitalWrapper.style.display = "inline-block";
|
||||
digitalWrapper.style.verticalAlign = "top";
|
||||
analogWrapper.style.display = "inline-block";
|
||||
if (placement === "left") {
|
||||
analogWrapper.style.padding = "0 20px 0 0";
|
||||
wrapper.appendChild(analogWrapper);
|
||||
wrapper.appendChild(digitalWrapper);
|
||||
} else {
|
||||
analogWrapper.style.padding = "0 0 0 20px";
|
||||
wrapper.appendChild(digitalWrapper);
|
||||
wrapper.appendChild(analogWrapper);
|
||||
}
|
||||
} else {
|
||||
digitalWrapper.style.textAlign = "center";
|
||||
if (placement === "top") {
|
||||
analogWrapper.style.padding = "0 0 20px 0";
|
||||
wrapper.appendChild(analogWrapper);
|
||||
wrapper.appendChild(digitalWrapper);
|
||||
} else {
|
||||
analogWrapper.style.padding = "20px 0 0 0";
|
||||
wrapper.appendChild(digitalWrapper);
|
||||
wrapper.appendChild(analogWrapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return the wrapper to the dom.
|
||||
return wrapper;
|
||||
}
|
||||
|
68
modules/default/clock/clock_styles.css
Normal file
@@ -0,0 +1,68 @@
|
||||
.clockCircle {
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
border-radius: 50%;
|
||||
background-size: 100%;
|
||||
}
|
||||
|
||||
.clockFace {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.clockFace::after {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
margin: -3px 0 0 -3px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
content: "";
|
||||
display: block;
|
||||
}
|
||||
|
||||
.clockHour {
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin: -2px 0 -2px -25%; /* numbers much match negative length & thickness */
|
||||
padding: 2px 0 2px 25%; /* indicator length & thickness */
|
||||
background: white;
|
||||
-webkit-transform-origin: 100% 50%;
|
||||
-ms-transform-origin: 100% 50%;
|
||||
transform-origin: 100% 50%;
|
||||
border-radius: 3px 0 0 3px;
|
||||
}
|
||||
|
||||
.clockMinute {
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin: -35% -2px 0; /* numbers must match negative length & thickness */
|
||||
padding: 35% 2px 0; /* indicator length & thickness */
|
||||
background: white;
|
||||
-webkit-transform-origin: 50% 100%;
|
||||
-ms-transform-origin: 50% 100%;
|
||||
transform-origin: 50% 100%;
|
||||
border-radius: 3px 0 0 3px;
|
||||
}
|
||||
|
||||
.clockSecond {
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin: -38% -1px 0 0; /* numbers must match negative length & thickness */
|
||||
padding: 38% 1px 0 0; /* indicator length & thickness */
|
||||
background: #888;
|
||||
-webkit-transform-origin: 50% 100%;
|
||||
-ms-transform-origin: 50% 100%;
|
||||
transform-origin: 50% 100%;
|
||||
}
|
1
modules/default/clock/faces/face-001.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg id="Hour_Markers_-_Singlets" data-name="Hour Markers - Singlets" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"><defs><style>.cls-1,.cls-2{fill:none;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;}.cls-2{stroke-width:0.5px;}</style></defs><title>face-001</title><line class="cls-1" x1="125" y1="1.25" x2="125" y2="16.23"/><line class="cls-1" x1="186.87" y1="17.83" x2="179.39" y2="30.8"/><line class="cls-1" x1="232.17" y1="63.12" x2="219.2" y2="70.61"/><line class="cls-1" x1="248.75" y1="125" x2="233.77" y2="125"/><line class="cls-1" x1="232.17" y1="186.87" x2="219.2" y2="179.39"/><line class="cls-1" x1="186.88" y1="232.17" x2="179.39" y2="219.2"/><line class="cls-1" x1="125" y1="248.75" x2="125" y2="233.77"/><line class="cls-1" x1="63.13" y1="232.17" x2="70.61" y2="219.2"/><line class="cls-1" x1="17.83" y1="186.88" x2="30.8" y2="179.39"/><line class="cls-1" x1="1.25" y1="125" x2="16.23" y2="125"/><line class="cls-1" x1="17.83" y1="63.13" x2="30.8" y2="70.61"/><line class="cls-1" x1="63.12" y1="17.83" x2="70.61" y2="30.8"/><line class="cls-2" x1="138.01" y1="1.25" x2="136.96" y2="11.23"/><line class="cls-2" x1="150.87" y1="3.29" x2="148.78" y2="13.11"/><line class="cls-2" x1="163.45" y1="6.66" x2="160.35" y2="16.21"/><line class="cls-2" x1="175.61" y1="11.33" x2="171.53" y2="20.5"/><line class="cls-2" x1="198.14" y1="24.33" x2="192.24" y2="32.45"/><line class="cls-2" x1="208.26" y1="32.53" x2="201.54" y2="39.99"/><line class="cls-2" x1="217.47" y1="41.74" x2="210.01" y2="48.46"/><line class="cls-2" x1="225.67" y1="51.86" x2="217.55" y2="57.76"/><line class="cls-2" x1="238.67" y1="74.39" x2="229.5" y2="78.47"/><line class="cls-2" x1="243.34" y1="86.55" x2="233.79" y2="89.65"/><line class="cls-2" x1="246.71" y1="99.13" x2="236.89" y2="101.22"/><line class="cls-2" x1="248.75" y1="111.99" x2="238.77" y2="113.04"/><line class="cls-2" x1="248.75" y1="138.01" x2="238.77" y2="136.96"/><line class="cls-2" x1="246.71" y1="150.87" x2="236.89" y2="148.78"/><line class="cls-2" x1="243.34" y1="163.45" x2="233.79" y2="160.35"/><line class="cls-2" x1="238.67" y1="175.61" x2="229.5" y2="171.53"/><line class="cls-2" x1="225.67" y1="198.14" x2="217.55" y2="192.24"/><line class="cls-2" x1="217.47" y1="208.26" x2="210.01" y2="201.54"/><line class="cls-2" x1="208.26" y1="217.47" x2="201.54" y2="210.01"/><line class="cls-2" x1="198.14" y1="225.67" x2="192.24" y2="217.55"/><line class="cls-2" x1="175.61" y1="238.67" x2="171.53" y2="229.5"/><line class="cls-2" x1="163.45" y1="243.34" x2="160.35" y2="233.79"/><line class="cls-2" x1="150.87" y1="246.71" x2="148.78" y2="236.89"/><line class="cls-2" x1="138.01" y1="248.75" x2="136.96" y2="238.77"/><line class="cls-2" x1="111.99" y1="248.75" x2="113.04" y2="238.77"/><line class="cls-2" x1="99.13" y1="246.71" x2="101.22" y2="236.89"/><line class="cls-2" x1="86.55" y1="243.34" x2="89.65" y2="233.79"/><line class="cls-2" x1="74.39" y1="238.67" x2="78.47" y2="229.5"/><line class="cls-2" x1="51.86" y1="225.67" x2="57.76" y2="217.55"/><line class="cls-2" x1="41.74" y1="217.47" x2="48.46" y2="210.01"/><line class="cls-2" x1="32.53" y1="208.26" x2="39.99" y2="201.54"/><line class="cls-2" x1="24.33" y1="198.14" x2="32.45" y2="192.24"/><line class="cls-2" x1="11.33" y1="175.61" x2="20.5" y2="171.53"/><line class="cls-2" x1="6.66" y1="163.45" x2="16.21" y2="160.35"/><line class="cls-2" x1="3.29" y1="150.87" x2="13.11" y2="148.78"/><line class="cls-2" x1="1.25" y1="138.01" x2="11.23" y2="136.96"/><line class="cls-2" x1="1.25" y1="111.99" x2="11.23" y2="113.04"/><line class="cls-2" x1="3.29" y1="99.13" x2="13.11" y2="101.22"/><line class="cls-2" x1="6.66" y1="86.55" x2="16.21" y2="89.65"/><line class="cls-2" x1="11.33" y1="74.39" x2="20.5" y2="78.47"/><line class="cls-2" x1="24.33" y1="51.86" x2="32.45" y2="57.76"/><line class="cls-2" x1="32.53" y1="41.74" x2="39.99" y2="48.46"/><line class="cls-2" x1="41.74" y1="32.53" x2="48.46" y2="39.99"/><line class="cls-2" x1="51.86" y1="24.33" x2="57.76" y2="32.45"/><line class="cls-2" x1="74.39" y1="11.33" x2="78.47" y2="20.5"/><line class="cls-2" x1="86.55" y1="6.66" x2="89.65" y2="16.21"/><line class="cls-2" x1="99.13" y1="3.29" x2="101.22" y2="13.11"/><line class="cls-2" x1="111.99" y1="1.25" x2="113.04" y2="11.23"/></svg>
|
After Width: | Height: | Size: 4.2 KiB |
1
modules/default/clock/faces/face-002.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg id="Hour_Markers_-_Doubles" data-name="Hour Markers - Doubles" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"><defs><style>.cls-1{fill:none;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;stroke-width:2.98px;}</style></defs><title>face-002</title><line class="cls-1" x1="122.01" y1="1.75" x2="122.01" y2="16.67"/><line class="cls-1" x1="186.62" y1="18.26" x2="179.17" y2="31.18"/><line class="cls-1" x1="231.74" y1="63.37" x2="218.82" y2="70.83"/><line class="cls-1" x1="248.25" y1="127.99" x2="233.33" y2="127.99"/><line class="cls-1" x1="231.74" y1="186.62" x2="218.82" y2="179.17"/><line class="cls-1" x1="186.63" y1="231.74" x2="179.17" y2="218.82"/><line class="cls-1" x1="127.99" y1="248.25" x2="127.99" y2="233.33"/><line class="cls-1" x1="63.38" y1="231.74" x2="70.83" y2="218.82"/><line class="cls-1" x1="18.26" y1="186.63" x2="31.18" y2="179.17"/><line class="cls-1" x1="1.75" y1="122.01" x2="16.67" y2="122.01"/><line class="cls-1" x1="18.26" y1="63.38" x2="31.18" y2="70.83"/><line class="cls-1" x1="63.37" y1="18.26" x2="70.83" y2="31.18"/><line class="cls-1" x1="127.99" y1="1.75" x2="127.99" y2="16.67"/><line class="cls-1" x1="248.25" y1="122.01" x2="233.33" y2="122.01"/><line class="cls-1" x1="122.01" y1="248.25" x2="122.01" y2="233.33"/><line class="cls-1" x1="1.75" y1="127.99" x2="16.67" y2="127.99"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
modules/default/clock/faces/face-003.svg
Normal file
After Width: | Height: | Size: 7.2 KiB |
1
modules/default/clock/faces/face-004.svg
Normal file
After Width: | Height: | Size: 5.2 KiB |
1
modules/default/clock/faces/face-005.svg
Normal file
After Width: | Height: | Size: 17 KiB |
1
modules/default/clock/faces/face-006.svg
Normal file
After Width: | Height: | Size: 15 KiB |
1
modules/default/clock/faces/face-007.svg
Normal file
After Width: | Height: | Size: 11 KiB |
1
modules/default/clock/faces/face-008.svg
Normal file
After Width: | Height: | Size: 6.8 KiB |
1
modules/default/clock/faces/face-009.svg
Normal file
After Width: | Height: | Size: 18 KiB |
1
modules/default/clock/faces/face-010.svg
Normal file
After Width: | Height: | Size: 17 KiB |
1
modules/default/clock/faces/face-011.svg
Normal file
After Width: | Height: | Size: 7.2 KiB |
1
modules/default/clock/faces/face-012.svg
Normal file
After Width: | Height: | Size: 7.1 KiB |
@@ -56,6 +56,15 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> See <i>compliment configuration</i> below.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>remoteFile</code></td>
|
||||
<td>External file from which to load the compliments<br>
|
||||
<br><b>Possible values:</b>Path to a JSON file containing compliments, configured
|
||||
as per the value of the <i>compliments configuration</i> (see below). An object with three arrays:
|
||||
morning, afternoon and evening. - <code>compliments.json</code>
|
||||
<br><b>Default value:</b> <code>null</code> (Do not load from file)
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -63,6 +72,44 @@ The following properties can be configured:
|
||||
|
||||
The `compliments` property contains an object with three arrays: <code>morning</code>, <code>afternoon</code> and<code>evening</code>. Based on the time of the day, the compliments will be picked out of one of these arrays. The arrays contain one or multiple compliments.
|
||||
|
||||
|
||||
If use the currentweather is possible use a actual weather for set compliments. The availables properties are:
|
||||
* <code>day_sunny</code>
|
||||
* <code>day_cloudy</code>
|
||||
* <code>cloudy</code>
|
||||
* <code>cloudy_windy</code>
|
||||
* <code>showers</code>
|
||||
* <code>rain</code>
|
||||
* <code>thunderstorm</code>
|
||||
* <code>snow</code>
|
||||
* <code>fog</code>
|
||||
* <code>night_clear</code>
|
||||
* <code>night_cloudy</code>
|
||||
* <code>night_showers</code>
|
||||
* <code>night_rain</code>
|
||||
* <code>night_thunderstorm</code>
|
||||
* <code>night_snow</code>
|
||||
* <code>night_alt_cloudy_windy</code>
|
||||
|
||||
#### Example use with currentweather module
|
||||
````javascript
|
||||
config: {
|
||||
compliments: {
|
||||
day_sunny: [
|
||||
'Today is a sunny day',
|
||||
'It\'s a beautiful day'
|
||||
],
|
||||
snow: [
|
||||
'Snowball battle!'
|
||||
],
|
||||
rain: [
|
||||
'Don\'t forget your umbrella'
|
||||
]
|
||||
}
|
||||
}
|
||||
````
|
||||
|
||||
|
||||
#### Default value:
|
||||
````javascript
|
||||
config: {
|
||||
@@ -85,3 +132,32 @@ config: {
|
||||
}
|
||||
}
|
||||
````
|
||||
|
||||
### External Compliment File
|
||||
You may specify an external file that contains the three compliment arrays. This is particularly useful if you have a
|
||||
large number of compliments and do not wish to crowd your `config.js` file with a large array of compliments.
|
||||
Adding the `remoteFile` variable will override an array you specify in the configuration file.
|
||||
|
||||
This file must be straight JSON. Note that the array names need quotes
|
||||
around them ("morning", "afternoon", "evening", "snow", "rain", etc.).
|
||||
#### Example compliments.json file:
|
||||
````json
|
||||
{
|
||||
"morning" : [
|
||||
"Good morning, sunshine!",
|
||||
"Who needs coffee when you have your smile?",
|
||||
"Go get 'em, Tiger!"
|
||||
],
|
||||
"afternoon" : [
|
||||
"Hitting your stride!",
|
||||
"You are making a difference!",
|
||||
"You're more fun than bubble wrap!"
|
||||
],
|
||||
"evening" : [
|
||||
"You made someone smile today, I know it.",
|
||||
"You are making a difference.",
|
||||
"The day was better for your efforts."
|
||||
]
|
||||
}
|
||||
````
|
||||
|
||||
|
@@ -29,9 +29,13 @@ Module.register("compliments",{
|
||||
]
|
||||
},
|
||||
updateInterval: 30000,
|
||||
remoteFile: null,
|
||||
fadeSpeed: 4000
|
||||
},
|
||||
|
||||
// Set currentweather from module
|
||||
currentWeatherType: "",
|
||||
|
||||
// Define required scripts.
|
||||
getScripts: function() {
|
||||
return ["moment.js"];
|
||||
@@ -43,6 +47,12 @@ Module.register("compliments",{
|
||||
|
||||
this.lastComplimentIndex = -1;
|
||||
|
||||
if (this.config.remoteFile != null) {
|
||||
this.complimentFile((response) => {
|
||||
this.config.compliments = JSON.parse(response);
|
||||
});
|
||||
}
|
||||
|
||||
// Schedule update timer.
|
||||
var self = this;
|
||||
setInterval(function() {
|
||||
@@ -84,14 +94,36 @@ Module.register("compliments",{
|
||||
*/
|
||||
complimentArray: function() {
|
||||
var hour = moment().hour();
|
||||
var compliments = null;
|
||||
|
||||
if (hour >= 3 && hour < 12) {
|
||||
return this.config.compliments.morning;
|
||||
compliments = this.config.compliments.morning;
|
||||
} else if (hour >= 12 && hour < 17) {
|
||||
return this.config.compliments.afternoon;
|
||||
compliments = this.config.compliments.afternoon;
|
||||
} else {
|
||||
return this.config.compliments.evening;
|
||||
compliments = this.config.compliments.evening;
|
||||
}
|
||||
|
||||
if ( this.currentWeatherType in this.config.compliments) {
|
||||
compliments.push.apply(compliments, this.config.compliments[this.currentWeatherType]);
|
||||
}
|
||||
return compliments;
|
||||
|
||||
},
|
||||
|
||||
/* complimentFile(callback)
|
||||
* Retrieve a file from the local filesystem
|
||||
*/
|
||||
complimentFile: function(callback) {
|
||||
var xobj = new XMLHttpRequest();
|
||||
xobj.overrideMimeType("application/json");
|
||||
xobj.open("GET", this.file(this.config.remoteFile), true);
|
||||
xobj.onreadystatechange = function () {
|
||||
if (xobj.readyState == 4 && xobj.status == "200") {
|
||||
callback(xobj.responseText);
|
||||
}
|
||||
};
|
||||
xobj.send(null);
|
||||
},
|
||||
|
||||
/* complimentArray()
|
||||
@@ -112,10 +144,44 @@ Module.register("compliments",{
|
||||
|
||||
var compliment = document.createTextNode(complimentText);
|
||||
var wrapper = document.createElement("div");
|
||||
wrapper.className = "thin xlarge bright";
|
||||
wrapper.className = this.config.classes ? this.config.classes : "thin xlarge bright";
|
||||
wrapper.appendChild(compliment);
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// From data currentweather set weather type
|
||||
setCurrentWeatherType: function(data) {
|
||||
var weatherIconTable = {
|
||||
"01d": "day_sunny",
|
||||
"02d": "day_cloudy",
|
||||
"03d": "cloudy",
|
||||
"04d": "cloudy_windy",
|
||||
"09d": "showers",
|
||||
"10d": "rain",
|
||||
"11d": "thunderstorm",
|
||||
"13d": "snow",
|
||||
"50d": "fog",
|
||||
"01n": "night_clear",
|
||||
"02n": "night_cloudy",
|
||||
"03n": "night_cloudy",
|
||||
"04n": "night_cloudy",
|
||||
"09n": "night_showers",
|
||||
"10n": "night_rain",
|
||||
"11n": "night_thunderstorm",
|
||||
"13n": "night_snow",
|
||||
"50n": "night_alt_cloudy_windy"
|
||||
};
|
||||
this.currentWeatherType = weatherIconTable[data.weather[0].icon];
|
||||
},
|
||||
|
||||
|
||||
// Override notification handler.
|
||||
notificationReceived: function(notification, payload, sender) {
|
||||
if (notification == "CURRENTWEATHER_DATA") {
|
||||
this.setCurrentWeatherType(payload.data);
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
@@ -14,6 +14,7 @@ modules: [
|
||||
config: {
|
||||
// See 'Configuration options' for more information.
|
||||
location: 'Amsterdam,Netherlands',
|
||||
locationID: '', //Location ID from http://openweathermap.org/help/city_list.txt
|
||||
appid: 'abcde12345abcde12345abcde12345ab' //openweathermap.org API key.
|
||||
}
|
||||
}
|
||||
@@ -34,12 +35,20 @@ The following properties can be configured:
|
||||
</tr>
|
||||
<thead>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td><code>location</code></td>
|
||||
<td>The location used for weather information.<br>
|
||||
<br><b>Example:</b> <code>Amsterdam,Netherlands</code>
|
||||
<br><b>Default value:</b> <code>New York</code>
|
||||
<br><b>Example:</b> <code>'Amsterdam,Netherlands'</code>
|
||||
<br><b>Default value:</b> <code>false</code><br><br>
|
||||
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>locationID</code></td>
|
||||
<td>Location ID from <a href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap</a> <b>This will override anything you put in location.</b><br>Leave blank if you want to use location.
|
||||
<br><b>Example:</b> <code>1234567</code>
|
||||
<br><b>Default value:</b> <code>false</code><br><br>
|
||||
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -55,18 +64,25 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>config.units</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>roundTemp</code></td>
|
||||
<td>Round temperature value to nearest integer.<br>
|
||||
<br><b>Possible values:</b> <code>true</code> (round to integer) or <code>false</code> (display exact value with decimal point)
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>updateInterval</code></td>
|
||||
<td>How often does the content needs to be fetched? (Milliseconds)<br>
|
||||
<br><b>Possible values:</b> <code>1000</code> - <code>86400000</code>
|
||||
<br><b>Default value:</b> <code>300000</code> (10 minutes)
|
||||
<br><b>Default value:</b> <code>600000</code> (10 minutes)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>animationSpeed</code></td>
|
||||
<td>Speed of the update animation. (Milliseconds)<br>
|
||||
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
|
||||
<br><b>Default value:</b> <code>2000</code> (2 seconds)
|
||||
<br><b>Default value:</b> <code>1000</code> (1 second)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -97,6 +113,20 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>true</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>showHumidity</code></td>
|
||||
<td>Show the current humidity<br>
|
||||
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>onlyTemp</code></td>
|
||||
<td>Show only current Temperature and weather icon.<br>
|
||||
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>useBeaufort</code></td>
|
||||
<td>Pick between using the Beaufort scale for wind speed or using the default units.<br>
|
||||
@@ -143,6 +173,18 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>'weather'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>appendLocationNameToHeader</code></td>
|
||||
<td>If set to <code>true</code>, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.<br>
|
||||
<br><b>Default value:</b> <code>true</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>calendarClass</code></td>
|
||||
<td>The class for the calender module to base the event based weather information on.<br>
|
||||
<br><b>Default value:</b> <code>'calendar'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>iconTable</code></td>
|
||||
<td>The conversion table to convert the weather conditions to weather-icons.<br>
|
||||
|
@@ -6,3 +6,11 @@
|
||||
-webkit-transform: translate(0, -3px); /* Safari */
|
||||
transform: translate(0, -3px);
|
||||
}
|
||||
|
||||
.currentweather .humidityIcon {
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.currentweather .humidity-padding {
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
@@ -11,7 +11,8 @@ Module.register("currentweather",{
|
||||
|
||||
// Default module config.
|
||||
defaults: {
|
||||
location: "",
|
||||
location: false,
|
||||
locationID: false,
|
||||
appid: "",
|
||||
units: config.units,
|
||||
updateInterval: 10 * 60 * 1000, // every 10 minutes
|
||||
@@ -22,6 +23,7 @@ Module.register("currentweather",{
|
||||
showWindDirection: true,
|
||||
useBeaufort: true,
|
||||
lang: config.language,
|
||||
showHumidity: false,
|
||||
|
||||
initialLoadDelay: 0, // 0 seconds delay
|
||||
retryDelay: 2500,
|
||||
@@ -30,6 +32,12 @@ Module.register("currentweather",{
|
||||
apiBase: "http://api.openweathermap.org/data/",
|
||||
weatherEndpoint: "weather",
|
||||
|
||||
appendLocationNameToHeader: true,
|
||||
calendarClass: "calendar",
|
||||
|
||||
onlyTemp: false,
|
||||
roundTemp: false,
|
||||
|
||||
iconTable: {
|
||||
"01d": "wi-day-sunny",
|
||||
"02d": "wi-day-cloudy",
|
||||
@@ -52,6 +60,12 @@ Module.register("currentweather",{
|
||||
},
|
||||
},
|
||||
|
||||
// create a variable for the first upcoming calendaar event. Used if no location is specified.
|
||||
firstEvent: false,
|
||||
|
||||
// create a variable to hold the location name based on the API result.
|
||||
fetchedLocatioName: "",
|
||||
|
||||
// Define required scripts.
|
||||
getScripts: function() {
|
||||
return ["moment.js"];
|
||||
@@ -87,35 +101,16 @@ Module.register("currentweather",{
|
||||
this.loaded = false;
|
||||
this.scheduleUpdate(this.config.initialLoadDelay);
|
||||
|
||||
this.updateTimer = null;
|
||||
|
||||
},
|
||||
|
||||
// Override dom generator.
|
||||
getDom: function() {
|
||||
var wrapper = document.createElement("div");
|
||||
|
||||
if (this.config.appid === "") {
|
||||
wrapper.innerHTML = "Please set the correct openweather <i>appid</i> in the config for module: " + this.name + ".";
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (this.config.location === "") {
|
||||
wrapper.innerHTML = "Please set the openweather <i>location</i> in the config for module: " + this.name + ".";
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (!this.loaded) {
|
||||
wrapper.innerHTML = this.translate('LOADING');
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
// add extra information of current weather
|
||||
// windDirection, humidity, sunrise and sunset
|
||||
addExtraInfoWeather: function(wrapper) {
|
||||
|
||||
var small = document.createElement("div");
|
||||
small.className = "normal medium";
|
||||
|
||||
|
||||
var windIcon = document.createElement("span");
|
||||
windIcon.className = "wi wi-strong-wind dimmed";
|
||||
small.appendChild(windIcon);
|
||||
@@ -133,6 +128,22 @@ Module.register("currentweather",{
|
||||
spacer.innerHTML = " ";
|
||||
small.appendChild(spacer);
|
||||
|
||||
if (this.config.showHumidity) {
|
||||
var humidity = document.createElement("span");
|
||||
humidity.innerHTML = this.humidity;
|
||||
|
||||
var spacer = document.createElement("sup");
|
||||
spacer.innerHTML = " ";
|
||||
|
||||
var humidityIcon = document.createElement("sup");
|
||||
humidityIcon.className = "wi wi-humidity humidityIcon";
|
||||
humidityIcon.innerHTML = " ";
|
||||
|
||||
small.appendChild(humidity);
|
||||
small.appendChild(spacer);
|
||||
small.appendChild(humidityIcon);
|
||||
}
|
||||
|
||||
var sunriseSunsetIcon = document.createElement("span");
|
||||
sunriseSunsetIcon.className = "wi dimmed " + this.sunriseSunsetIcon;
|
||||
small.appendChild(sunriseSunsetIcon);
|
||||
@@ -141,6 +152,29 @@ Module.register("currentweather",{
|
||||
sunriseSunsetTime.innerHTML = " " + this.sunriseSunsetTime;
|
||||
small.appendChild(sunriseSunsetTime);
|
||||
|
||||
wrapper.appendChild(small);
|
||||
},
|
||||
|
||||
// Override dom generator.
|
||||
getDom: function() {
|
||||
var wrapper = document.createElement("div");
|
||||
|
||||
if (this.config.appid === "") {
|
||||
wrapper.innerHTML = "Please set the correct openweather <i>appid</i> in the config for module: " + this.name + ".";
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (!this.loaded) {
|
||||
wrapper.innerHTML = this.translate("LOADING");
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (this.config.onlyTemp === false) {
|
||||
this.addExtraInfoWeather(wrapper);
|
||||
}
|
||||
|
||||
var large = document.createElement("div");
|
||||
large.className = "large light";
|
||||
|
||||
@@ -153,16 +187,54 @@ Module.register("currentweather",{
|
||||
temperature.innerHTML = " " + this.temperature + "°";
|
||||
large.appendChild(temperature);
|
||||
|
||||
wrapper.appendChild(small);
|
||||
wrapper.appendChild(large);
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
// Override getHeader method.
|
||||
getHeader: function() {
|
||||
if (this.config.appendLocationNameToHeader) {
|
||||
return this.data.header + " " + this.fetchedLocatioName;
|
||||
}
|
||||
|
||||
return this.data.header;
|
||||
},
|
||||
|
||||
// Override notification handler.
|
||||
notificationReceived: function(notification, payload, sender) {
|
||||
if (notification === "DOM_OBJECTS_CREATED") {
|
||||
if (this.config.appendLocationNameToHeader) {
|
||||
this.hide(0, {lockString: this.identifier});
|
||||
}
|
||||
}
|
||||
if (notification === "CALENDAR_EVENTS") {
|
||||
var senderClasses = sender.data.classes.toLowerCase().split(" ");
|
||||
if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) {
|
||||
var lastEvent = this.firstEvent;
|
||||
this.firstEvent = false;
|
||||
|
||||
for (e in payload) {
|
||||
var event = payload[e];
|
||||
if (event.location || event.geo) {
|
||||
this.firstEvent = event;
|
||||
//Log.log("First upcoming event with location: ", event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/* updateWeather(compliments)
|
||||
* Requests new data from openweather.org.
|
||||
* Calls processWeather on succesfull response.
|
||||
*/
|
||||
updateWeather: function() {
|
||||
if (this.config.appid === "") {
|
||||
Log.error("CurrentWeather: APPID not set!");
|
||||
return;
|
||||
}
|
||||
|
||||
var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.weatherEndpoint + this.getParams();
|
||||
var self = this;
|
||||
var retry = true;
|
||||
@@ -174,11 +246,10 @@ Module.register("currentweather",{
|
||||
if (this.status === 200) {
|
||||
self.processWeather(JSON.parse(this.response));
|
||||
} else if (this.status === 401) {
|
||||
self.config.appid = "";
|
||||
self.updateDom(self.config.animationSpeed);
|
||||
|
||||
Log.error(self.name + ": Incorrect APPID.");
|
||||
retry = false;
|
||||
retry = true;
|
||||
} else {
|
||||
Log.error(self.name + ": Could not load weather.");
|
||||
}
|
||||
@@ -198,7 +269,19 @@ Module.register("currentweather",{
|
||||
*/
|
||||
getParams: function() {
|
||||
var params = "?";
|
||||
params += "q=" + this.config.location;
|
||||
if(this.config.locationID) {
|
||||
params += "id=" + this.config.locationID;
|
||||
} else if(this.config.location) {
|
||||
params += "q=" + this.config.location;
|
||||
} else if (this.firstEvent && this.firstEvent.geo) {
|
||||
params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon
|
||||
} else if (this.firstEvent && this.firstEvent.location) {
|
||||
params += "q=" + this.firstEvent.location;
|
||||
} else {
|
||||
this.hide(this.config.animationSpeed, {lockString:this.identifier});
|
||||
return;
|
||||
}
|
||||
|
||||
params += "&units=" + this.config.units;
|
||||
params += "&lang=" + this.config.lang;
|
||||
params += "&APPID=" + this.config.appid;
|
||||
@@ -212,6 +295,14 @@ Module.register("currentweather",{
|
||||
* argument data object - Weather information received form openweather.org.
|
||||
*/
|
||||
processWeather: function(data) {
|
||||
|
||||
if (!data || !data.main || !data.main.temp) {
|
||||
// Did not receive usable new data.
|
||||
// Maybe this needs a better check?
|
||||
return;
|
||||
}
|
||||
|
||||
this.humidity = parseFloat(data.main.humidity);
|
||||
this.temperature = this.roundValue(data.main.temp);
|
||||
|
||||
if (this.config.useBeaufort){
|
||||
@@ -232,20 +323,20 @@ Module.register("currentweather",{
|
||||
// So we need to generate the timestring manually.
|
||||
// See issue: https://github.com/MichMich/MagicMirror/issues/181
|
||||
var sunriseSunsetDateObject = (sunrise < now && sunset > now) ? sunset : sunrise;
|
||||
var timeString = moment(sunriseSunsetDateObject).format('HH:mm');
|
||||
var timeString = moment(sunriseSunsetDateObject).format("HH:mm");
|
||||
if (this.config.timeFormat !== 24) {
|
||||
//var hours = sunriseSunsetDateObject.getHours() % 12 || 12;
|
||||
if (this.config.showPeriod) {
|
||||
if (this.config.showPeriodUpper) {
|
||||
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm A');
|
||||
timeString = moment(sunriseSunsetDateObject).format('h:mm A');
|
||||
timeString = moment(sunriseSunsetDateObject).format("h:mm A");
|
||||
} else {
|
||||
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm a');
|
||||
timeString = moment(sunriseSunsetDateObject).format('h:mm a');
|
||||
timeString = moment(sunriseSunsetDateObject).format("h:mm a");
|
||||
}
|
||||
} else {
|
||||
//timeString = hours + moment(sunriseSunsetDateObject).format(':mm');
|
||||
timeString = moment(sunriseSunsetDateObject).format('h:mm');
|
||||
timeString = moment(sunriseSunsetDateObject).format("h:mm");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,9 +344,10 @@ Module.register("currentweather",{
|
||||
this.sunriseSunsetIcon = (sunrise < now && sunset > now) ? "wi-sunset" : "wi-sunrise";
|
||||
|
||||
|
||||
|
||||
this.show(this.config.animationSpeed, {lockString:this.identifier});
|
||||
this.loaded = true;
|
||||
this.updateDom(this.config.animationSpeed);
|
||||
this.sendNotification("CURRENTWEATHER_DATA", {data: data});
|
||||
},
|
||||
|
||||
/* scheduleUpdate()
|
||||
@@ -294,52 +386,51 @@ Module.register("currentweather",{
|
||||
return 12;
|
||||
},
|
||||
|
||||
deg2Cardinal: function(deg) {
|
||||
if (deg>11.25 && deg<=33.75){
|
||||
return "NNE";
|
||||
} else if (deg > 33.75 && deg <= 56.25) {
|
||||
return "NE";
|
||||
} else if (deg > 56.25 && deg <= 78.75) {
|
||||
return "ENE";
|
||||
} else if (deg > 78.75 && deg <= 101.25) {
|
||||
return "E";
|
||||
} else if (deg > 101.25 && deg <= 123.75) {
|
||||
return "ESE";
|
||||
} else if (deg > 123.75 && deg <= 146.25) {
|
||||
return "SE";
|
||||
} else if (deg > 146.25 && deg <= 168.75) {
|
||||
return "SSE";
|
||||
} else if (deg > 168.75 && deg <= 191.25) {
|
||||
return "S";
|
||||
} else if (deg > 191.25 && deg <= 213.75) {
|
||||
return "SSW";
|
||||
} else if (deg > 213.75 && deg <= 236.25) {
|
||||
return "SW";
|
||||
} else if (deg > 236.25 && deg <= 258.75) {
|
||||
return "WSW";
|
||||
} else if (deg > 258.75 && deg <= 281.25) {
|
||||
return "W";
|
||||
} else if (deg > 281.25 && deg <= 303.75) {
|
||||
return "WNW";
|
||||
} else if (deg > 303.75 && deg <= 326.25) {
|
||||
return "NW";
|
||||
} else if (deg > 326.25 && deg <= 348.75) {
|
||||
return "NNW";
|
||||
} else {
|
||||
return "N";
|
||||
}
|
||||
},
|
||||
|
||||
/* function(temperature)
|
||||
* Rounds a temperature to 1 decimal.
|
||||
* Rounds a temperature to 1 decimal or integer (depending on config.roundTemp).
|
||||
*
|
||||
* argument temperature number - Temperature.
|
||||
*
|
||||
* return number - Rounded Temperature.
|
||||
*/
|
||||
|
||||
deg2Cardinal: function(deg) {
|
||||
if (deg>11.25 && deg<=33.75){
|
||||
return "NNE";
|
||||
} else if (deg > 33.75 && deg <= 56.25) {
|
||||
return "NE";
|
||||
} else if (deg > 56.25 && deg <= 78.75) {
|
||||
return "ENE";
|
||||
} else if (deg > 78.75 && deg <= 101.25) {
|
||||
return "E";
|
||||
} else if (deg > 101.25 && deg <= 123.75) {
|
||||
return "ESE";
|
||||
} else if (deg > 123.75 && deg <= 146.25) {
|
||||
return "SE";
|
||||
} else if (deg > 146.25 && deg <= 168.75) {
|
||||
return "SSE";
|
||||
} else if (deg > 168.75 && deg <= 191.25) {
|
||||
return "S";
|
||||
} else if (deg > 191.25 && deg <= 213.75) {
|
||||
return "SSW";
|
||||
} else if (deg > 213.75 && deg <= 236.25) {
|
||||
return "SW";
|
||||
} else if (deg > 236.25 && deg <= 258.75) {
|
||||
return "WSW";
|
||||
} else if (deg > 258.75 && deg <= 281.25) {
|
||||
return "W";
|
||||
} else if (deg > 281.25 && deg <= 303.75) {
|
||||
return "WNW";
|
||||
} else if (deg > 303.75 && deg <= 326.25) {
|
||||
return "NW";
|
||||
} else if (deg > 326.25 && deg <= 348.75) {
|
||||
return "NNW";
|
||||
} else {
|
||||
return "N";
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
roundValue: function(temperature) {
|
||||
return parseFloat(temperature).toFixed(1);
|
||||
var decimals = this.config.roundTemp ? 0 : 1;
|
||||
return parseFloat(temperature).toFixed(decimals);
|
||||
}
|
||||
});
|
||||
|
@@ -15,7 +15,8 @@ var defaultModules = [
|
||||
"currentweather",
|
||||
"helloworld",
|
||||
"newsfeed",
|
||||
"weatherforecast"
|
||||
"weatherforecast",
|
||||
"updatenotification"
|
||||
];
|
||||
|
||||
/*************** DO NOT EDIT THE LINE BELOW ***************/
|
||||
|
@@ -53,6 +53,7 @@ The following properties can be configured:
|
||||
{
|
||||
title: "New York Times",
|
||||
url: "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml",
|
||||
encoding: "UTF-8"
|
||||
}
|
||||
]</code>
|
||||
</td>
|
||||
@@ -98,11 +99,47 @@ The following properties can be configured:
|
||||
<td><code>animationSpeed</code></td>
|
||||
<td>Speed of the update animation. (Milliseconds)<br>
|
||||
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
|
||||
<br><b>Default value:</b> <code>2000</code> (2.5 seconds)
|
||||
<br><b>Default value:</b> <code>2500</code> (2.5 seconds)
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>maxNewsItems</code></td>
|
||||
<td>Total amount of news items to cycle through. (0 for unlimited)<br>
|
||||
<br><b>Possible values:</b><code>0</code> - <code>...</code>
|
||||
<br><b>Default value:</b> <code>0</code>
|
||||
</td>
|
||||
</tr>
|
||||
removeStartTags: false,
|
||||
removeEndTags: false,
|
||||
startTags: [],
|
||||
endTags: []
|
||||
|
||||
|
||||
<tr>
|
||||
<td><code>removeStartTags</code></td>
|
||||
<td>Some newsfeeds feature tags at the <B>beginning</B> of their titles or descriptions, such as <em>[VIDEO]</em>.
|
||||
This setting allows for the removal of specified tags from the beginning of an item's description and/or title.<br>
|
||||
<br><b>Possible values:</b><code>'title'</code>, <code>'description'</code>, <code>'both'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>startTags</code></td>
|
||||
<td>List the tags you would like to have removed at the beginning of the feed item<br>
|
||||
<br><b>Possible values:</b> <code>['TAG']</code> or <code>['TAG1','TAG2',...]</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>removeEndTags</code></td>
|
||||
<td>Remove specified tags from the <B>end</B> of an item's description and/or title.<br>
|
||||
<br><b>Possible values:</b><code>'title'</code>, <code>'description'</code>, <code>'both'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>endTags</code></td>
|
||||
<td>List the tags you would like to have removed at the end of the feed item<br>
|
||||
<br><b>Possible values:</b> <code>['TAG']</code> or <code>['TAG1','TAG2',...]</code>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -136,7 +173,7 @@ The `feeds` property contains an array with multiple objects. These objects have
|
||||
<td>The encoding of the news feed.<br>
|
||||
<br>This property is optional.
|
||||
<br><b>Possible values:</b><code>'UTF-8'</code>, <code>'ISO-8859-1'</code>, etc ...
|
||||
<br><b>Default value:</b> <code>'UTF-8'</code>
|
||||
<br><b>Default value:</b> <code>'UTF-8'</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
@@ -44,8 +44,9 @@ var Fetcher = function(url, reloadInterval, encoding) {
|
||||
parser.on("item", function(item) {
|
||||
|
||||
var title = item.title;
|
||||
var description = item.description || item.summary || item.content || '';
|
||||
var description = item.description || item.summary || item.content || "";
|
||||
var pubdate = item.pubdate || item.published || item.updated;
|
||||
var url = item.url || item.link || "";
|
||||
|
||||
if (title && pubdate) {
|
||||
|
||||
@@ -56,15 +57,16 @@ var Fetcher = function(url, reloadInterval, encoding) {
|
||||
title: title,
|
||||
description: description,
|
||||
pubdate: pubdate,
|
||||
url: url,
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
console.log("Can't parse feed item:");
|
||||
console.log(item);
|
||||
console.log('Title: ' + title);
|
||||
console.log('Description: ' + description);
|
||||
console.log('Pubdate: ' + pubdate);
|
||||
// console.log("Can't parse feed item:");
|
||||
// console.log(item);
|
||||
// console.log('Title: ' + title);
|
||||
// console.log('Description: ' + description);
|
||||
// console.log('Pubdate: ' + pubdate);
|
||||
|
||||
}
|
||||
});
|
||||
@@ -79,7 +81,10 @@ var Fetcher = function(url, reloadInterval, encoding) {
|
||||
scheduleTimer();
|
||||
});
|
||||
|
||||
var headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A'};
|
||||
|
||||
nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
|
||||
headers = {"User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"}
|
||||
|
||||
request({uri: url, encoding: null, headers: headers}).pipe(iconv.decodeStream(encoding)).pipe(parser);
|
||||
|
||||
};
|
||||
@@ -117,7 +122,7 @@ var Fetcher = function(url, reloadInterval, encoding) {
|
||||
};
|
||||
|
||||
/* broadcastItems()
|
||||
* Broadcast the exsisting items.
|
||||
* Broadcast the existing items.
|
||||
*/
|
||||
this.broadcastItems = function() {
|
||||
if (items.length <= 0) {
|
||||
|
@@ -24,6 +24,12 @@ Module.register("newsfeed",{
|
||||
reloadInterval: 5 * 60 * 1000, // every 5 minutes
|
||||
updateInterval: 10 * 1000,
|
||||
animationSpeed: 2.5 * 1000,
|
||||
maxNewsItems: 0, // 0 for unlimited
|
||||
removeStartTags: "",
|
||||
removeEndTags: "",
|
||||
startTags: [],
|
||||
endTags: []
|
||||
|
||||
},
|
||||
|
||||
// Define required scripts.
|
||||
@@ -87,14 +93,65 @@ Module.register("newsfeed",{
|
||||
var sourceAndTimestamp = document.createElement("div");
|
||||
sourceAndTimestamp.className = "light small dimmed";
|
||||
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '') sourceAndTimestamp.innerHTML = this.newsItems[this.activeItem].sourceTitle;
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '' && this.config.showPublishDate) sourceAndTimestamp.innerHTML += ', ';
|
||||
if (this.config.showPublishDate) sourceAndTimestamp.innerHTML += moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow();
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== '' || this.config.showPublishDate) sourceAndTimestamp.innerHTML += ':';
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "") {
|
||||
sourceAndTimestamp.innerHTML = this.newsItems[this.activeItem].sourceTitle;
|
||||
}
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "" && this.config.showPublishDate) {
|
||||
sourceAndTimestamp.innerHTML += ", ";
|
||||
}
|
||||
if (this.config.showPublishDate) {
|
||||
sourceAndTimestamp.innerHTML += moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow();
|
||||
}
|
||||
if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "" || this.config.showPublishDate) {
|
||||
sourceAndTimestamp.innerHTML += ":";
|
||||
}
|
||||
|
||||
wrapper.appendChild(sourceAndTimestamp);
|
||||
}
|
||||
|
||||
//Remove selected tags from the beginning of rss feed items (title or description)
|
||||
|
||||
if (this.config.removeStartTags == "title" || "both") {
|
||||
|
||||
for (f=0; f<this.config.startTags.length;f++) {
|
||||
if (this.newsItems[this.activeItem].title.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) {
|
||||
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].title.length);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (this.config.removeStartTags == "description" || "both") {
|
||||
|
||||
if (this.config.showDescription) {
|
||||
for (f=0; f<this.config.startTags.length;f++) {
|
||||
if (this.newsItems[this.activeItem].description.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) {
|
||||
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].description.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].description.length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Remove selected tags from the end of rss feed items (title or description)
|
||||
|
||||
if (this.config.removeEndTags) {
|
||||
for (f=0; f<this.config.endTags.length;f++) {
|
||||
if (this.newsItems[this.activeItem].title.slice(-this.config.endTags[f].length)==this.config.endTags[f]) {
|
||||
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(0,-this.config.endTags[f].length);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.config.showDescription) {
|
||||
for (f=0; f<this.config.endTags.length;f++) {
|
||||
if (this.newsItems[this.activeItem].description.slice(-this.config.endTags[f].length)==this.config.endTags[f]) {
|
||||
this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(0,-this.config.endTags[f].length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var title = document.createElement("div");
|
||||
title.className = "bright medium light";
|
||||
title.innerHTML = this.newsItems[this.activeItem].title;
|
||||
@@ -151,7 +208,9 @@ Module.register("newsfeed",{
|
||||
var dateB = new Date(b.pubdate);
|
||||
return dateB - dateA;
|
||||
});
|
||||
|
||||
if(this.config.maxNewsItems > 0) {
|
||||
newsItems = newsItems.slice(0, this.config.maxNewsItems);
|
||||
}
|
||||
this.newsItems = newsItems;
|
||||
},
|
||||
|
||||
@@ -183,10 +242,10 @@ Module.register("newsfeed",{
|
||||
for (var f in this.config.feeds) {
|
||||
var feed = this.config.feeds[f];
|
||||
if (feed.url === feedUrl) {
|
||||
return feed.title || '';
|
||||
return feed.title || "";
|
||||
}
|
||||
}
|
||||
return '';
|
||||
return "";
|
||||
},
|
||||
|
||||
/* scheduleUpdateInterval()
|
||||
@@ -212,5 +271,7 @@ Module.register("newsfeed",{
|
||||
*/
|
||||
capitalizeFirstLetter: function(string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
});
|
||||
|
@@ -25,8 +25,8 @@ module.exports = NodeHelper.create({
|
||||
},
|
||||
|
||||
/* createFetcher(url, reloadInterval)
|
||||
* Creates a fetcher for a new url if it doesn't exsist yet.
|
||||
* Otherwise it reoses the exsisting one.
|
||||
* Creates a fetcher for a new url if it doesn't exist yet.
|
||||
* Otherwise it reoses the existing one.
|
||||
*
|
||||
* attribute url string - URL of the news feed.
|
||||
* attribute reloadInterval number - Reload interval in milliseconds.
|
||||
@@ -35,8 +35,8 @@ module.exports = NodeHelper.create({
|
||||
createFetcher: function(feed, config) {
|
||||
var self = this;
|
||||
|
||||
var url = feed.url || '';
|
||||
var encoding = feed.encoding || 'UTF-8';
|
||||
var url = feed.url || "";
|
||||
var encoding = feed.encoding || "UTF-8";
|
||||
var reloadInterval = config.reloadInterval || 5 * 60 * 1000;
|
||||
|
||||
if (!validUrl.isUri(url)) {
|
||||
@@ -62,7 +62,7 @@ module.exports = NodeHelper.create({
|
||||
|
||||
self.fetchers[url] = fetcher;
|
||||
} else {
|
||||
console.log("Use exsisting news fetcher for url: " + url);
|
||||
console.log("Use existing news fetcher for url: " + url);
|
||||
fetcher = self.fetchers[url];
|
||||
fetcher.setReloadInterval(reloadInterval);
|
||||
fetcher.broadcastItems();
|
||||
@@ -72,7 +72,7 @@ module.exports = NodeHelper.create({
|
||||
},
|
||||
|
||||
/* broadcastFeeds()
|
||||
* Creates an object with all feed items of the different registered feeds,
|
||||
* Creates an object with all feed items of the different registered feeds,
|
||||
* and broadcasts these using sendSocketNotification.
|
||||
*/
|
||||
broadcastFeeds: function() {
|
||||
|
42
modules/default/updatenotification/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Module: Update Notification
|
||||
The `updatenotification` module is one of the default modules of the MagicMirror.
|
||||
This will display a message whenever a new version of the MagicMirror application is available.
|
||||
|
||||
## Using the module
|
||||
|
||||
To use this module, add it to the modules array in the `config/config.js` file:
|
||||
````javascript
|
||||
modules: [
|
||||
{
|
||||
module: 'updatenotification',
|
||||
position: 'top_center', // This can be any of the regions.
|
||||
config: {
|
||||
// The config property is optional.
|
||||
// See 'Configuration options' for more information.
|
||||
}
|
||||
}
|
||||
]
|
||||
````
|
||||
|
||||
## Configuration options
|
||||
|
||||
The following properties can be configured:
|
||||
|
||||
<table width="100%">
|
||||
<!-- why, markdown... -->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Option</th>
|
||||
<th width="100%">Description</th>
|
||||
</tr>
|
||||
<thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>updateInterval</code></td>
|
||||
<td>How often do you want to check for a new version? This value represents the interval in milliseconds.<br>
|
||||
<br><b>Possible values:</b> Any value above <code>60000</code> (1 minute);
|
||||
<br><b>Default value:</b> <code>600000</code> (10 minutes);
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
87
modules/default/updatenotification/node_helper.js
Normal file
@@ -0,0 +1,87 @@
|
||||
var SimpleGit = require("simple-git");
|
||||
var simpleGits = [];
|
||||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
var defaultModules = require(__dirname + "/../defaultmodules.js");
|
||||
var NodeHelper = require("node_helper");
|
||||
|
||||
module.exports = NodeHelper.create({
|
||||
|
||||
config: {},
|
||||
|
||||
updateTimer: null,
|
||||
|
||||
start: function () {
|
||||
},
|
||||
|
||||
configureModules: function(modules) {
|
||||
for (moduleName in modules) {
|
||||
if (defaultModules.indexOf(moduleName) < 0) {
|
||||
// Default modules are included in the main MagicMirror repo
|
||||
var moduleFolder = path.normalize(__dirname + "/../../" + moduleName);
|
||||
|
||||
var stat;
|
||||
try {
|
||||
stat = fs.statSync(path.join(moduleFolder, ".git"));
|
||||
} catch(err) {
|
||||
// Error when directory .git doesn't exist
|
||||
// This module is not managed with git, skip
|
||||
continue;
|
||||
}
|
||||
|
||||
var res = function(mn, mf) {
|
||||
var git = SimpleGit(mf);
|
||||
git.getRemotes(true, function(err, remotes) {
|
||||
if (remotes.length < 1 || remotes[0].name.length < 1) {
|
||||
// No valid remote for folder, skip
|
||||
return;
|
||||
}
|
||||
|
||||
// Folder has .git and has at least one git remote, watch this folder
|
||||
simpleGits.push({"module": mn, "git": git});
|
||||
});
|
||||
}(moduleName, moduleFolder);
|
||||
}
|
||||
}
|
||||
|
||||
// Push MagicMirror itself last, biggest chance it'll show up last in UI and isn't overwritten
|
||||
simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))});
|
||||
},
|
||||
|
||||
socketNotificationReceived: function (notification, payload) {
|
||||
if (notification === "CONFIG") {
|
||||
this.config = payload;
|
||||
} else if(notification === "MODULES") {
|
||||
this.configureModules(payload);
|
||||
this.preformFetch();
|
||||
}
|
||||
},
|
||||
|
||||
preformFetch() {
|
||||
var self = this;
|
||||
|
||||
simpleGits.forEach(function(sg) {
|
||||
sg.git.fetch().status(function(err, data) {
|
||||
data.module = sg.module;
|
||||
if (!err) {
|
||||
self.sendSocketNotification("STATUS", data);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
this.scheduleNextFetch(this.config.updateInterval);
|
||||
},
|
||||
|
||||
scheduleNextFetch: function(delay) {
|
||||
if (delay < 60 * 1000) {
|
||||
delay = 60 * 1000
|
||||
}
|
||||
|
||||
var self = this;
|
||||
clearTimeout(this.updateTimer);
|
||||
this.updateTimer = setTimeout(function() {
|
||||
self.preformFetch();
|
||||
}, delay);
|
||||
}
|
||||
|
||||
});
|
70
modules/default/updatenotification/updatenotification.js
Normal file
@@ -0,0 +1,70 @@
|
||||
Module.register("updatenotification", {
|
||||
|
||||
defaults: {
|
||||
updateInterval: 10 * 60 * 1000, // every 10 minutes
|
||||
},
|
||||
|
||||
status: false,
|
||||
|
||||
start: function () {
|
||||
Log.log("Start updatenotification");
|
||||
|
||||
},
|
||||
|
||||
notificationReceived: function(notification, payload, sender) {
|
||||
if (notification === "DOM_OBJECTS_CREATED") {
|
||||
this.sendSocketNotification("CONFIG", this.config);
|
||||
this.sendSocketNotification("MODULES", Module.definitions);
|
||||
this.hide(0,{lockString: self.identifier});
|
||||
}
|
||||
},
|
||||
|
||||
socketNotificationReceived: function (notification, payload) {
|
||||
if (notification === "STATUS") {
|
||||
this.status = payload;
|
||||
this.updateUI();
|
||||
}
|
||||
},
|
||||
|
||||
updateUI: function() {
|
||||
var self = this;
|
||||
if (this.status && this.status.behind > 0) {
|
||||
self.updateDom(0);
|
||||
self.show(1000, {lockString: self.identifier});
|
||||
}
|
||||
},
|
||||
|
||||
// Override dom generator.
|
||||
getDom: function () {
|
||||
var wrapper = document.createElement("div");
|
||||
|
||||
if (this.status && this.status.behind > 0) {
|
||||
var message = document.createElement("div");
|
||||
message.className = "small bright";
|
||||
|
||||
var icon = document.createElement("i");
|
||||
icon.className = "fa fa-exclamation-circle";
|
||||
icon.innerHTML = " ";
|
||||
message.appendChild(icon);
|
||||
|
||||
var text = document.createElement("span");
|
||||
if (this.status.module == "default") {
|
||||
text.innerHTML = this.translate("UPDATE_NOTIFICATION");
|
||||
} else {
|
||||
text.innerHTML = this.translate("UPDATE_NOTIFICATION_MODULE").replace("MODULE_NAME", this.status.module);
|
||||
}
|
||||
message.appendChild(text);
|
||||
|
||||
wrapper.appendChild(message);
|
||||
|
||||
var subtext = document.createElement("div");
|
||||
subtext.innerHTML = this.translate("UPDATE_INFO")
|
||||
.replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits"))
|
||||
.replace("BRANCH_NAME", this.status.current);
|
||||
subtext.className = "xsmall dimmed";
|
||||
wrapper.appendChild(subtext);
|
||||
}
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
});
|
@@ -14,6 +14,7 @@ modules: [
|
||||
config: {
|
||||
// See 'Configuration options' for more information.
|
||||
location: 'Amsterdam,Netherlands',
|
||||
locationID: '', //Location ID from http://openweathermap.org/help/city_list.txt
|
||||
appid: 'abcde12345abcde12345abcde12345ab' //openweathermap.org API key.
|
||||
}
|
||||
}
|
||||
@@ -34,12 +35,20 @@ The following properties can be configured:
|
||||
</tr>
|
||||
<thead>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td><code>location</code></td>
|
||||
<td>The location used for weather information.<br>
|
||||
<br><b>Example:</b> <code>Amsterdam,Netherlands</code>
|
||||
<br><b>Default value:</b> <code>New York</code>
|
||||
<br><b>Example:</b> <code>'Amsterdam,Netherlands'</code>
|
||||
<br><b>Default value:</b> <code>false</code><br><br>
|
||||
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>locationID</code></td>
|
||||
<td>Location ID from <a href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap</a> <b>This will override anything you put in location.</b><br>Leave blank if you want to use location.
|
||||
<br><b>Example:</b> <code>1234567</code>
|
||||
<br><b>Default value:</b> <code>false</code><br><br>
|
||||
<strong>Note:</strong> When the <code>location</code> and <code>locationID</code> are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -55,6 +64,13 @@ The following properties can be configured:
|
||||
<br><b>Default value:</b> <code>config.units</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>roundTemp</code></td>
|
||||
<td>Round temperature values to nearest integer.<br>
|
||||
<br><b>Possible values:</b> <code>true</code> (round to integer) or <code>false</code> (display exact value with decimal point)
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxNumberOfDays</code></td>
|
||||
<td>How many days of forecast to return. Specified by config.js<br>
|
||||
@@ -63,21 +79,28 @@ The following properties can be configured:
|
||||
<br>This value is optional. By default the weatherforecast module will return 7 days.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>showRainAmount</code></td>
|
||||
<td>Should the predicted rain amount be displayed?<br>
|
||||
<br><b>Possible values:</b> <code>true</code> or <code>false</code>
|
||||
<br><b>Default value:</b> <code>false</code>
|
||||
<br>This value is optional. By default the weatherforecast module will not display the predicted amount of rain.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>updateInterval</code></td>
|
||||
<td>How often does the content needs to be fetched? (Milliseconds)<br>
|
||||
<br><b>Possible values:</b> <code>1000</code> - <code>86400000</code>
|
||||
<br><b>Default value:</b> <code>300000</code> (10 minutes)
|
||||
<br><b>Default value:</b> <code>600000</code> (10 minutes)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>animationSpeed</code></td>
|
||||
<td>Speed of the update animation. (Milliseconds)<br>
|
||||
<br><b>Possible values:</b><code>0</code> - <code>5000</code>
|
||||
<br><b>Default value:</b> <code>2000</code> (2 seconds)
|
||||
<br><b>Default value:</b> <code>1000</code> (1 second)
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>lang</code></td>
|
||||
<td>The language of the days.<br>
|
||||
@@ -103,7 +126,7 @@ The following properties can be configured:
|
||||
<td><code>initialLoadDelay</code></td>
|
||||
<td>The initial delay before loading. If you have multiple modules that use the same API key, you might want to delay one of the requests. (Milliseconds)<br>
|
||||
<br><b>Possible values:</b> <code>1000</code> - <code>5000</code>
|
||||
<br><b>Default value:</b> <code>0</code>
|
||||
<br><b>Default value:</b> <code>2500</code> (2.5 seconds delay. This delay is used to keep the OpenWeather API happy.)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -126,11 +149,23 @@ The following properties can be configured:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>weatherEndpoint</code></td>
|
||||
<td><code>forecastEndpoint</code></td>
|
||||
<td>The OpenWeatherMap API endPoint.<br>
|
||||
<br><b>Default value:</b> <code>'forecast/daily'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>appendLocationNameToHeader</code></td>
|
||||
<td>If set to <code>true</code>, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.<br>
|
||||
<br><b>Default value:</b> <code>true</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>calendarClass</code></td>
|
||||
<td>The class for the calender module to base the event based weather information on.<br>
|
||||
<br><b>Default value:</b> <code>'calendar'</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>iconTable</code></td>
|
||||
<td>The conversion table to convert the weather conditions to weather-icons.<br>
|
||||
@@ -156,6 +191,5 @@ The following properties can be configured:
|
||||
}</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -12,3 +12,8 @@
|
||||
padding-left: 20px;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.weatherforecast .rain {
|
||||
padding-left: 20px;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
@@ -11,10 +11,12 @@ Module.register("weatherforecast",{
|
||||
|
||||
// Default module config.
|
||||
defaults: {
|
||||
location: "",
|
||||
location: false,
|
||||
locationID: false,
|
||||
appid: "",
|
||||
units: config.units,
|
||||
maxNumberOfDays: 7,
|
||||
showRainAmount: false,
|
||||
updateInterval: 10 * 60 * 1000, // every 10 minutes
|
||||
animationSpeed: 1000,
|
||||
timeFormat: config.timeFormat,
|
||||
@@ -29,6 +31,11 @@ Module.register("weatherforecast",{
|
||||
apiBase: "http://api.openweathermap.org/data/",
|
||||
forecastEndpoint: "forecast/daily",
|
||||
|
||||
appendLocationNameToHeader: true,
|
||||
calendarClass: "calendar",
|
||||
|
||||
roundTemp: false,
|
||||
|
||||
iconTable: {
|
||||
"01d": "wi-day-sunny",
|
||||
"02d": "wi-day-cloudy",
|
||||
@@ -51,6 +58,12 @@ Module.register("weatherforecast",{
|
||||
},
|
||||
},
|
||||
|
||||
// create a variable for the first upcoming calendaar event. Used if no location is specified.
|
||||
firstEvent: false,
|
||||
|
||||
// create a variable to hold the location name based on the API result.
|
||||
fetchedLocatioName: "",
|
||||
|
||||
// Define required scripts.
|
||||
getScripts: function() {
|
||||
return ["moment.js"];
|
||||
@@ -94,14 +107,8 @@ Module.register("weatherforecast",{
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (this.config.location === "") {
|
||||
wrapper.innerHTML = "Please set the openweather <i>location</i> in the config for module: " + this.name + ".";
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
if (!this.loaded) {
|
||||
wrapper.innerHTML = this.translate('LOADING');
|
||||
wrapper.innerHTML = this.translate("LOADING");
|
||||
wrapper.className = "dimmed light small";
|
||||
return wrapper;
|
||||
}
|
||||
@@ -125,7 +132,7 @@ Module.register("weatherforecast",{
|
||||
row.appendChild(iconCell);
|
||||
|
||||
var icon = document.createElement("span");
|
||||
icon.className = forecast.icon;
|
||||
icon.className = "wi weathericon " + forecast.icon;
|
||||
iconCell.appendChild(icon);
|
||||
|
||||
var maxTempCell = document.createElement("td");
|
||||
@@ -138,6 +145,17 @@ Module.register("weatherforecast",{
|
||||
minTempCell.className = "align-right min-temp";
|
||||
row.appendChild(minTempCell);
|
||||
|
||||
if (this.config.showRainAmount) {
|
||||
var rainCell = document.createElement("td");
|
||||
if (isNaN(forecast.rain)) {
|
||||
rainCell.innerHTML = "";
|
||||
} else {
|
||||
rainCell.innerHTML = forecast.rain + " mm";
|
||||
}
|
||||
rainCell.className = "align-right bright rain";
|
||||
row.appendChild(rainCell);
|
||||
}
|
||||
|
||||
if (this.config.fade && this.config.fadePoint < 1) {
|
||||
if (this.config.fadePoint < 0) {
|
||||
this.config.fadePoint = 0;
|
||||
@@ -155,11 +173,50 @@ Module.register("weatherforecast",{
|
||||
return table;
|
||||
},
|
||||
|
||||
// Override getHeader method.
|
||||
getHeader: function() {
|
||||
if (this.config.appendLocationNameToHeader) {
|
||||
return this.data.header + " " + this.fetchedLocatioName;
|
||||
}
|
||||
|
||||
return this.data.header;
|
||||
},
|
||||
|
||||
// Override notification handler.
|
||||
notificationReceived: function(notification, payload, sender) {
|
||||
if (notification === "DOM_OBJECTS_CREATED") {
|
||||
if (this.config.appendLocationNameToHeader) {
|
||||
this.hide(0, {lockString: this.identifier});
|
||||
}
|
||||
}
|
||||
if (notification === "CALENDAR_EVENTS") {
|
||||
var senderClasses = sender.data.classes.toLowerCase().split(" ");
|
||||
if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) {
|
||||
var lastEvent = this.firstEvent;
|
||||
this.firstEvent = false;
|
||||
|
||||
for (e in payload) {
|
||||
var event = payload[e];
|
||||
if (event.location || event.geo) {
|
||||
this.firstEvent = event;
|
||||
//Log.log("First upcoming event with location: ", event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/* updateWeather(compliments)
|
||||
* Requests new data from openweather.org.
|
||||
* Calls processWeather on succesfull response.
|
||||
*/
|
||||
updateWeather: function() {
|
||||
if (this.config.appid === "") {
|
||||
Log.error("WeatherForecast: APPID not set!");
|
||||
return;
|
||||
}
|
||||
|
||||
var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.forecastEndpoint + this.getParams();
|
||||
var self = this;
|
||||
var retry = true;
|
||||
@@ -171,11 +228,10 @@ Module.register("weatherforecast",{
|
||||
if (this.status === 200) {
|
||||
self.processWeather(JSON.parse(this.response));
|
||||
} else if (this.status === 401) {
|
||||
self.config.appid = "";
|
||||
self.updateDom(self.config.animationSpeed);
|
||||
|
||||
Log.error(self.name + ": Incorrect APPID.");
|
||||
retry = false;
|
||||
retry = true;
|
||||
} else {
|
||||
Log.error(self.name + ": Could not load weather.");
|
||||
}
|
||||
@@ -195,7 +251,19 @@ Module.register("weatherforecast",{
|
||||
*/
|
||||
getParams: function() {
|
||||
var params = "?";
|
||||
params += "q=" + this.config.location;
|
||||
if(this.config.locationID) {
|
||||
params += "id=" + this.config.locationID;
|
||||
} else if(this.config.location) {
|
||||
params += "q=" + this.config.location;
|
||||
} else if (this.firstEvent && this.firstEvent.geo) {
|
||||
params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon
|
||||
} else if (this.firstEvent && this.firstEvent.location) {
|
||||
params += "q=" + this.firstEvent.location;
|
||||
} else {
|
||||
this.hide(this.config.animationSpeed, {lockString:this.identifier});
|
||||
return;
|
||||
}
|
||||
|
||||
params += "&units=" + this.config.units;
|
||||
params += "&lang=" + this.config.lang;
|
||||
/*
|
||||
@@ -215,6 +283,7 @@ Module.register("weatherforecast",{
|
||||
* argument data object - Weather information received form openweather.org.
|
||||
*/
|
||||
processWeather: function(data) {
|
||||
this.fetchedLocatioName = data.city.name + ", " + data.city.country;
|
||||
|
||||
this.forecast = [];
|
||||
for (var i = 0, count = data.list.length; i < count; i++) {
|
||||
@@ -225,13 +294,14 @@ Module.register("weatherforecast",{
|
||||
day: moment(forecast.dt, "X").format("ddd"),
|
||||
icon: this.config.iconTable[forecast.weather[0].icon],
|
||||
maxTemp: this.roundValue(forecast.temp.max),
|
||||
minTemp: this.roundValue(forecast.temp.min)
|
||||
minTemp: this.roundValue(forecast.temp.min),
|
||||
rain: this.roundValue(forecast.rain)
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
//Log.log(this.forecast);
|
||||
|
||||
this.show(this.config.animationSpeed, {lockString:this.identifier});
|
||||
this.loaded = true;
|
||||
this.updateDom(this.config.animationSpeed);
|
||||
},
|
||||
@@ -274,13 +344,14 @@ Module.register("weatherforecast",{
|
||||
},
|
||||
|
||||
/* function(temperature)
|
||||
* Rounds a temperature to 1 decimal.
|
||||
* Rounds a temperature to 1 decimal or integer (depending on config.roundTemp).
|
||||
*
|
||||
* argument temperature number - Temperature.
|
||||
*
|
||||
* return number - Rounded Temperature.
|
||||
*/
|
||||
roundValue: function(temperature) {
|
||||
return parseFloat(temperature).toFixed(1);
|
||||
var decimals = this.config.roundTemp ? 0 : 1;
|
||||
return parseFloat(temperature).toFixed(decimals);
|
||||
}
|
||||
});
|
||||
|
35
package.json
@@ -1,14 +1,10 @@
|
||||
{
|
||||
"name": "magicmirror",
|
||||
"version": "2.0.0",
|
||||
"version": "2.1.0",
|
||||
"description": "A modular interface for smart mirrors.",
|
||||
"main": "js/electron.js",
|
||||
"scripts": {
|
||||
"start": "electron js/electron.js",
|
||||
"jscs": "jscs **/**/**/**/*.js",
|
||||
"stylelint": "stylelint css/main.css fonts/roboto.css",
|
||||
"htmlvalidator": "html-validator --file=index.html",
|
||||
"test": "snyk test"
|
||||
"start": "electron js/electron.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,32 +17,37 @@
|
||||
"modular"
|
||||
],
|
||||
"author": "Michael Teeuw",
|
||||
"contributors": "https://github.com/MichMich/MagicMirror/graphs/contributors",
|
||||
"contributors": [
|
||||
"https://github.com/MichMich/MagicMirror/graphs/contributors"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/MichMich/MagicMirror/issues"
|
||||
},
|
||||
"homepage": "https://github.com/MichMich/MagicMirror#readme",
|
||||
"devDependencies": {
|
||||
"electron-prebuilt": "latest",
|
||||
"grunt": "latest",
|
||||
"grunt-eslint": "latest",
|
||||
"grunt-postcss": "latest",
|
||||
"postcss-reporter": "latest",
|
||||
"stylelint": "latest",
|
||||
"grunt-jsonlint": "latest",
|
||||
"grunt-markdownlint": "^1.0.13",
|
||||
"grunt-stylelint": "latest",
|
||||
"grunt-yamllint": "latest",
|
||||
"stylelint-config-standard": "latest",
|
||||
"time-grunt": "latest"
|
||||
},
|
||||
"dependencies": {
|
||||
"express": "latest",
|
||||
"electron": "^1.4.7",
|
||||
"express": "^4.14.0",
|
||||
"express-ipfilter": "latest",
|
||||
"feedme": "latest",
|
||||
"helmet": "^3.1.0",
|
||||
"iconv-lite": "latest",
|
||||
"moment": "latest",
|
||||
"request": "latest",
|
||||
"snyk": "latest",
|
||||
"socket.io": "latest",
|
||||
"request": "^2.78.0",
|
||||
"rrule": "latest",
|
||||
"simple-git": "^1.62.0",
|
||||
"socket.io": "^1.5.1",
|
||||
"valid-url": "latest",
|
||||
"walk": "latest",
|
||||
"rrule": "latest"
|
||||
"walk": "latest"
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
var app = require("../js/app.js");
|
||||
app.start(function(config) {
|
||||
console.log("");
|
||||
console.log("Ready to go! Please point your browser to: http://localhost:" + config.port);
|
||||
var bindAddress = config.address ? config.address : "localhost";
|
||||
console.log("Ready to go! Please point your browser to: http://" + bindAddress + ":" + config.port);
|
||||
});
|
||||
|
8
splashscreen/MagicMirror.plymouth
Normal file
@@ -0,0 +1,8 @@
|
||||
[Plymouth Theme]
|
||||
Name=MagicMirror
|
||||
Description=Mirror Splash
|
||||
ModuleName=script
|
||||
|
||||
[script]
|
||||
ImageDir=/usr/share/plymouth/themes/MagicMirror
|
||||
ScriptFile=/usr/share/plymouth/themes/MagicMirror/MagicMirror.script
|
48
splashscreen/MagicMirror.script
Normal file
@@ -0,0 +1,48 @@
|
||||
screen_width = Window.GetWidth();
|
||||
screen_height = Window.GetHeight();
|
||||
|
||||
theme_image = Image("splash.png");
|
||||
image_width = theme_image.GetWidth();
|
||||
image_height = theme_image.GetHeight();
|
||||
|
||||
scale_x = image_width / screen_width;
|
||||
scale_y = image_height / screen_height;
|
||||
|
||||
if (scale_x > 1 || scale_y > 1)
|
||||
{
|
||||
if (scale_x > scale_y)
|
||||
{
|
||||
resized_image = theme_image.Scale (screen_width, image_height / scale_x);
|
||||
image_x = 0;
|
||||
image_y = (screen_height - ((image_height * screen_width) / image_width)) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
resized_image = theme_image.Scale (image_width / scale_y, screen_height);
|
||||
image_x = (screen_width - ((image_width * screen_height) / image_height)) / 2;
|
||||
image_y = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
resized_image = theme_image.Scale (image_width, image_height);
|
||||
image_x = (screen_width - image_width) / 2;
|
||||
image_y = (screen_height - image_height) / 2;
|
||||
}
|
||||
|
||||
if (Plymouth.GetMode() != "shutdown")
|
||||
{
|
||||
sprite = Sprite (resized_image);
|
||||
sprite.SetPosition (image_x, image_y, -100);
|
||||
}
|
||||
|
||||
message_sprite = Sprite();
|
||||
message_sprite.SetPosition(screen_width * 0.1, screen_height * 0.9, 10000);
|
||||
|
||||
fun message_callback (text) {
|
||||
my_image = Image.Text(text, 1, 1, 1);
|
||||
message_sprite.SetImage(my_image);
|
||||
sprite.SetImage (resized_image);
|
||||
}
|
||||
|
||||
Plymouth.SetUpdateStatusFunction(message_callback);
|
BIN
splashscreen/splash.png
Normal file
After Width: | Height: | Size: 19 KiB |
35
translations/da.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Indlæser …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "I dag",
|
||||
"TOMORROW": "I morgen",
|
||||
"DAYAFTERTOMORROW": "I overmorgen",
|
||||
"RUNNING": "Slutter om",
|
||||
"EMPTY": "Ingen kommende begivenheder.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNØ",
|
||||
"NE": "NØ",
|
||||
"ENE": "ØNØ",
|
||||
"E": "Ø",
|
||||
"ESE": "ØSØ",
|
||||
"SE": "SØ",
|
||||
"SSE": "SSØ",
|
||||
"S": "S",
|
||||
"SSW": "SSV",
|
||||
"SW": "SV",
|
||||
"WSW": "VSV",
|
||||
"W": "V",
|
||||
"WNW": "VNV",
|
||||
"NW": "NV",
|
||||
"NNW": "NNV"
|
||||
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "MagicMirror² opdatering tilgængelig.",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Opdatering tilgængelig for MODULE_NAME modulet.",
|
||||
"UPDATE_INFO": "Den nuværende installation er COMMIT_COUNT bagud på BRANCH_NAME branch'en."
|
||||
}
|
@@ -1,27 +1,34 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Lade …",
|
||||
/* GENERAL */
|
||||
"LOADING": "Lade …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Heute",
|
||||
"TOMORROW": "Morgen",
|
||||
"RUNNING": "noch",
|
||||
"EMPTY": "Keine Termine.",
|
||||
/* CALENDAR */
|
||||
"TODAY": "Heute",
|
||||
"TOMORROW": "Morgen",
|
||||
"DAYAFTERTOMORROW": "Übermorgen",
|
||||
"RUNNING": "noch",
|
||||
"EMPTY": "Keine Termine.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNO",
|
||||
"ENE": "ONO",
|
||||
"E": "O",
|
||||
"ESE": "OSO",
|
||||
"SE": "SO",
|
||||
"SSE": "SSO",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNO",
|
||||
"NE": "NO",
|
||||
"ENE": "ONO",
|
||||
"E": "O",
|
||||
"ESE": "OSO",
|
||||
"SE": "SO",
|
||||
"SSE": "SSO",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW",
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "Aktualisierung für MagicMirror² verfügbar.",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Aktualisierung für das MODULE_NAME Modul verfügbar.",
|
||||
"UPDATE_INFO": "Die aktuelle Installation ist COMMIT_COUNT hinter dem BRANCH_NAME branch."
|
||||
}
|
||||
|
@@ -1,27 +1,34 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Loading …",
|
||||
/* GENERAL */
|
||||
"LOADING": "Loading …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Today",
|
||||
"TOMORROW": "Tomorrow",
|
||||
"RUNNING": "Ends in",
|
||||
"EMPTY": "No upcoming events.",
|
||||
/* CALENDAR */
|
||||
"TODAY": "Today",
|
||||
"TOMORROW": "Tomorrow",
|
||||
"DAYAFTERTOMORROW": "The day after tomorrow",
|
||||
"RUNNING": "Ends in",
|
||||
"EMPTY": "No upcoming events.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW",
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "MagicMirror² update available.",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Update available for MODULE_NAME module.",
|
||||
"UPDATE_INFO": "The current installation is COMMIT_COUNT behind on the BRANCH_NAME branch."
|
||||
}
|
||||
|
@@ -5,23 +5,30 @@
|
||||
/* CALENDAR */
|
||||
"TODAY": "Hoy",
|
||||
"TOMORROW": "Mañana",
|
||||
"DAYAFTERTOMORROW": "Pasado mañana",
|
||||
"RUNNING": "Termina en",
|
||||
"EMPTY": "No hay eventos programados.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO"
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO",
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "MagicMirror² actualización disponible.",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Disponible una actualización para el módulo MODULE_NAME.",
|
||||
"UPDATE_INFO": "Tu actual instalación está COMMIT_COUNT cambios detrás de la rama BRANCH_NAME."
|
||||
}
|
||||
|
28
translations/fi.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Lataa …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Tänään",
|
||||
"TOMORROW": "Huomenna",
|
||||
"RUNNING": "Meneillään",
|
||||
"EMPTY": "Ei tulevia tapahtumia.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "P",
|
||||
"NNE": "PPI",
|
||||
"NE": "PI",
|
||||
"ENE": "IPI",
|
||||
"E": "I",
|
||||
"ESE": "IEI",
|
||||
"SE": "EI",
|
||||
"SSE": "EEI",
|
||||
"S": "E",
|
||||
"SSW": "EEL",
|
||||
"SW": "EL",
|
||||
"WSW": "LEL",
|
||||
"W": "L",
|
||||
"WNW": "LPL",
|
||||
"NW": "PL",
|
||||
"NNW": "PPL"
|
||||
}
|
@@ -1,27 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Chargement …",
|
||||
/* GENERAL */
|
||||
"LOADING": "Chargement …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Aujourd'hui",
|
||||
"TOMORROW": "Demain",
|
||||
"RUNNING": "Se termine dans",
|
||||
"EMPTY": "Aucun RDV.",
|
||||
/* CALENDAR */
|
||||
"TODAY": "Aujourd'hui",
|
||||
"TOMORROW": "Demain",
|
||||
"RUNNING": "Se termine dans",
|
||||
"EMPTY": "Aucun RDV.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO"
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO"
|
||||
}
|
||||
|
@@ -5,23 +5,25 @@
|
||||
/* CALENDAR */
|
||||
"TODAY": "Hjoed",
|
||||
"TOMORROW": "Moarn",
|
||||
"DAYAFTERTOMORROW": "Oaremoarn",
|
||||
"RUNNING": "Einigest oer",
|
||||
"EMPTY": "Gjin plande ôfspraken.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
}
|
||||
|
28
translations/gr.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Φόρτωση …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Σήμερα",
|
||||
"TOMORROW": "Αύριο",
|
||||
"RUNNING": "Λήγει σε",
|
||||
"EMPTY": "Δεν υπάρχουν προσεχείς εκδηλώσεις.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "B",
|
||||
"NNE": "BBA",
|
||||
"NE": "BA",
|
||||
"ENE": "ABA",
|
||||
"E": "A",
|
||||
"ESE": "ANA",
|
||||
"SE": "NA",
|
||||
"SSE": "NNA",
|
||||
"S": "N",
|
||||
"SSW": "NNΔ",
|
||||
"SW": "NΔ",
|
||||
"WSW": "ΔNΔ",
|
||||
"W": "Δ",
|
||||
"WNW": "ΔΒΔ",
|
||||
"NW": "ΒΔ",
|
||||
"NNW": "ΒΒΔ"
|
||||
}
|
28
translations/it.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Caricamento in corso …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Oggi",
|
||||
"TOMORROW": "Domani",
|
||||
"RUNNING": "Termina entro",
|
||||
"EMPTY": "Nessun evento in arrivo.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
}
|
28
translations/ja.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "ローディング …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "今日",
|
||||
"TOMORROW": "明日",
|
||||
"RUNNING": "で終わります",
|
||||
"EMPTY": "直近のイベントはありません",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "北",
|
||||
"NNE": "北北東",
|
||||
"NE": "北東",
|
||||
"ENE": "東北東",
|
||||
"E": "東",
|
||||
"ESE": "東南東",
|
||||
"SE": "南東",
|
||||
"SSE": "南南東",
|
||||
"S": "南",
|
||||
"SSW": "南南西",
|
||||
"SW": "南西",
|
||||
"WSW": "西南西",
|
||||
"W": "西",
|
||||
"WNW": "西北西",
|
||||
"NW": "北西",
|
||||
"NNW": "北北西"
|
||||
}
|
28
translations/nb.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Laster …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "I dag",
|
||||
"TOMORROW": "I morgen",
|
||||
"RUNNING": "Slutter om",
|
||||
"EMPTY": "Ingen kommende arrangementer.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNØ",
|
||||
"NE": "NØ",
|
||||
"ENE": "ØNØ",
|
||||
"E": "Ø",
|
||||
"ESE": "ØSØ",
|
||||
"SE": "SØ",
|
||||
"SSE": "SSØ",
|
||||
"S": "S",
|
||||
"SSW": "SSV",
|
||||
"SW": "SV",
|
||||
"WSW": "VSV",
|
||||
"W": "V",
|
||||
"WNW": "VNV",
|
||||
"NW": "NV",
|
||||
"NNW": "NNV"
|
||||
}
|
@@ -5,23 +5,30 @@
|
||||
/* CALENDAR */
|
||||
"TODAY": "Vandaag",
|
||||
"TOMORROW": "Morgen",
|
||||
"RUNNING": "Eindigd over",
|
||||
"DAYAFTERTOMORROW": "Overmorgen",
|
||||
"RUNNING": "Eindigt over",
|
||||
"EMPTY": "Geen geplande afspraken.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNO",
|
||||
"ENE": "ONO",
|
||||
"E": "O",
|
||||
"ESE": "OZO",
|
||||
"SE": "ZO",
|
||||
"SSE": "ZZO",
|
||||
"S": "Z",
|
||||
"SSW": "ZZW",
|
||||
"SW": "ZW",
|
||||
"WSW": "WZW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
"N": "N",
|
||||
"NNE": "NNO",
|
||||
"NE": "NO",
|
||||
"ENE": "ONO",
|
||||
"E": "O",
|
||||
"ESE": "OZO",
|
||||
"SE": "ZO",
|
||||
"SSE": "ZZO",
|
||||
"S": "Z",
|
||||
"SSW": "ZZW",
|
||||
"SW": "ZW",
|
||||
"WSW": "WZW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW",
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "MagicMirror² update beschikbaar.",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Update beschikbaar voor MODULE_NAME module.",
|
||||
"UPDATE_INFO": "De huidige installatie loopt COMMIT_COUNT achter op de BRANCH_NAME branch."
|
||||
}
|
||||
|
28
translations/nn.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Lastar …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "I dag",
|
||||
"TOMORROW": "I morgon",
|
||||
"RUNNING": "Sluttar om",
|
||||
"EMPTY": "Ingen komande hendingar.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNA",
|
||||
"NE": "NA",
|
||||
"ENE": "ANA",
|
||||
"E": "A",
|
||||
"ESE": "ASA",
|
||||
"SE": "SA",
|
||||
"SSE": "SSA",
|
||||
"S": "S",
|
||||
"SSW": "SSV",
|
||||
"SW": "SV",
|
||||
"WSW": "VSV",
|
||||
"W": "V",
|
||||
"WNW": "VNV",
|
||||
"NW": "NV",
|
||||
"NNW": "NNV"
|
||||
}
|
33
translations/pl.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Ładowanie …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Dziś",
|
||||
"TOMORROW": "Jutro",
|
||||
"RUNNING": "Koniec za",
|
||||
"EMPTY": "Brak wydarzeń.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSW",
|
||||
"SW": "SW",
|
||||
"WSW": "WSW",
|
||||
"W": "W",
|
||||
"WNW": "WNW",
|
||||
"NW": "NW",
|
||||
"NNW": "NNW"
|
||||
|
||||
/* UPDATE INFO */
|
||||
"UPDATE_NOTIFICATION": "Dostępna jest aktualizacja MagicMirror².",
|
||||
"UPDATE_NOTIFICATION_MODULE": "Dostępna jest aktualizacja modułu MODULE_NAME.",
|
||||
"UPDATE_INFO": "The current installation is COMMIT_COUNT behind on the BRANCH_NAME branch."
|
||||
}
|
28
translations/pt.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "A carregar …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Hoje",
|
||||
"TOMORROW": "Amanhã",
|
||||
"RUNNING": "Termina em",
|
||||
"EMPTY": "Sem eventos a chegar.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO"
|
||||
}
|
28
translations/pt_br.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Carregando …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Hoje",
|
||||
"TOMORROW": "Amanhã",
|
||||
"RUNNING": "Acaba em",
|
||||
"EMPTY": "Nenhum evento novo.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNE",
|
||||
"NE": "NE",
|
||||
"ENE": "ENE",
|
||||
"E": "E",
|
||||
"ESE": "ESE",
|
||||
"SE": "SE",
|
||||
"SSE": "SSE",
|
||||
"S": "S",
|
||||
"SSW": "SSO",
|
||||
"SW": "SO",
|
||||
"WSW": "OSO",
|
||||
"W": "O",
|
||||
"WNW": "ONO",
|
||||
"NW": "NO",
|
||||
"NNW": "NNO"
|
||||
}
|
28
translations/sv.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Laddar …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Idag",
|
||||
"TOMORROW": "Imorgon",
|
||||
"RUNNING": "Slutar",
|
||||
"EMPTY": "Inga kommande händelser.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "N",
|
||||
"NNE": "NNO",
|
||||
"NE": "NO",
|
||||
"ENE": "ONO",
|
||||
"E": "Ö",
|
||||
"ESE": "OSO",
|
||||
"SE": "SO",
|
||||
"SSE": "SSO",
|
||||
"S": "S",
|
||||
"SSW": "SSV",
|
||||
"SW": "SV",
|
||||
"WSW": "VSV",
|
||||
"W": "V",
|
||||
"WNW": "VNV",
|
||||
"NW": "NV",
|
||||
"NNW": "NNV"
|
||||
}
|
28
translations/tr.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "Yükleniyor …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "Bugün",
|
||||
"TOMORROW": "Yarın",
|
||||
"RUNNING": "Biten",
|
||||
"EMPTY": "Yakında etkinlik yok.",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "K",
|
||||
"NNE": "KKD",
|
||||
"NE": "KD",
|
||||
"ENE": "DKD",
|
||||
"E": "D",
|
||||
"ESE": "DGD",
|
||||
"SE": "GD",
|
||||
"SSE": "GGD",
|
||||
"S": "G",
|
||||
"SSW": "GGB",
|
||||
"SW": "GB",
|
||||
"WSW": "BGB",
|
||||
"W": "B",
|
||||
"WNW": "BKB",
|
||||
"NW": "KB",
|
||||
"NNW": "KKB"
|
||||
}
|
@@ -6,10 +6,24 @@
|
||||
*/
|
||||
|
||||
var translations = {
|
||||
"en" : "translations/en.json",
|
||||
"nl" : "translations/nl.json",
|
||||
"de" : "translations/de.json",
|
||||
"fr" : "translations/fr.json",
|
||||
"fy" : "translations/fy.json",
|
||||
"es" : "translations/es.json",
|
||||
"en" : "translations/en.json", // English
|
||||
"nl" : "translations/nl.json", // Dutch
|
||||
"de" : "translations/de.json", // German
|
||||
"fi" : "translations/fi.json", // Suomi
|
||||
"fr" : "translations/fr.json", // French
|
||||
"fy" : "translations/fy.json", // Frysk
|
||||
"es" : "translations/es.json", // Spanish
|
||||
"nb" : "translations/nb.json", // Norsk bokmål
|
||||
"nn" : "translations/nn.json", // Norsk nynorsk
|
||||
"pt" : "translations/pt.json", // Português
|
||||
"pt_br" : "translations/pt_br.json", // Português Brasileiro
|
||||
"sv" : "translations/sv.json", // Svenska
|
||||
"it" : "translations/it.json", // Italian
|
||||
"zh_cn" : "translations/zh_cn.json", // Simplified Chinese
|
||||
"zh_tw" : "translations/zh_tw.json", // Traditional Chinese
|
||||
"ja" : "translations/ja.json", // Japanese
|
||||
"pl" : "translations/pl.json", // Polish
|
||||
"gr" : "translations/gr.json", // Greek
|
||||
"da" : "translations/da.json", // Danish
|
||||
"tr" : "translations/tr.json", // Turkish
|
||||
};
|
||||
|
28
translations/zh_cn.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "正在加载 …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "今天",
|
||||
"TOMORROW": "明天",
|
||||
"RUNNING": "结束日期",
|
||||
"EMPTY": "没有更多的活动。",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "北风",
|
||||
"NNE": "北偏东风",
|
||||
"NE": "东北风",
|
||||
"ENE": "东偏北风",
|
||||
"E": "东风",
|
||||
"ESE": "东偏南风",
|
||||
"SE": "东南风",
|
||||
"SSE": "南偏东风",
|
||||
"S": "南风",
|
||||
"SSW": "南偏西风",
|
||||
"SW": "西南风",
|
||||
"WSW": "西偏南风",
|
||||
"W": "西风",
|
||||
"WNW": "西偏北风",
|
||||
"NW": "西北风",
|
||||
"NNW": "北偏西风"
|
||||
}
|
28
translations/zh_tw.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
/* GENERAL */
|
||||
"LOADING": "正在加載 …",
|
||||
|
||||
/* CALENDAR */
|
||||
"TODAY": "今天",
|
||||
"TOMORROW": "明天",
|
||||
"RUNNING": "結束日期",
|
||||
"EMPTY": "沒有更多的活動。",
|
||||
|
||||
/* WEATHER */
|
||||
"N": "北風",
|
||||
"NNE": "北偏東風",
|
||||
"NE": "東北風",
|
||||
"ENE": "東偏北風",
|
||||
"E": "東風",
|
||||
"ESE": "東偏南風",
|
||||
"SE": "東南風",
|
||||
"SSE": "南偏東風",
|
||||
"S": "南風",
|
||||
"SSW": "南偏西風",
|
||||
"SW": "西南風",
|
||||
"WSW": "西偏南風",
|
||||
"W": "西風",
|
||||
"WNW": "西偏北風",
|
||||
"NW": "西北風",
|
||||
"NNW": "北偏西風"
|
||||
}
|
1197
vendor/moment/moment-timezone.js
vendored
Normal file
4
vendor/vendor.js
vendored
@@ -9,6 +9,8 @@
|
||||
|
||||
var vendor = {
|
||||
'moment.js' : 'moment/moment-with-locales.js',
|
||||
'weather-icons.css': 'weather-icons/weather-icons.css',
|
||||
'moment-timezone.js' : 'moment/moment-timezone.js',
|
||||
'weather-icons.css': 'weather-icons/css/weather-icons.css',
|
||||
'weather-icons-wind.css': 'weather-icons/css/weather-icons-wind.css',
|
||||
'font-awesome.css': 'font-awesome-4.5.0/css/font-awesome.min.css'
|
||||
};
|
||||
|
5331
vendor/weather-icons/css/weather-icons-wind.css
vendored
Normal file
1
vendor/weather-icons/css/weather-icons-wind.min.css
vendored
Normal file
1838
vendor/weather-icons/css/weather-icons.css
vendored
Normal file
41
vendor/weather-icons/css/weather-icons.min.css
vendored
Normal file
BIN
vendor/weather-icons/font/weathericons-regular-webfont.eot
vendored
Executable file
257
vendor/weather-icons/font/weathericons-regular-webfont.svg
vendored
Executable file
@@ -0,0 +1,257 @@
|
||||
<?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="weather_iconsregular" horiz-adv-x="1537" >
|
||||
<font-face units-per-em="2048" ascent="1755" descent="-293" />
|
||||
<missing-glyph horiz-adv-x="685" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph horiz-adv-x="682" />
|
||||
<glyph unicode=" " horiz-adv-x="685" />
|
||||
<glyph unicode="	" horiz-adv-x="685" />
|
||||
<glyph unicode=" " horiz-adv-x="685" />
|
||||
<glyph unicode=" " horiz-adv-x="1122" />
|
||||
<glyph unicode=" " horiz-adv-x="2245" />
|
||||
<glyph unicode=" " horiz-adv-x="1122" />
|
||||
<glyph unicode=" " horiz-adv-x="2245" />
|
||||
<glyph unicode=" " horiz-adv-x="748" />
|
||||
<glyph unicode=" " horiz-adv-x="561" />
|
||||
<glyph unicode=" " horiz-adv-x="374" />
|
||||
<glyph unicode=" " horiz-adv-x="374" />
|
||||
<glyph unicode=" " horiz-adv-x="280" />
|
||||
<glyph unicode=" " horiz-adv-x="449" />
|
||||
<glyph unicode=" " horiz-adv-x="124" />
|
||||
<glyph unicode=" " horiz-adv-x="449" />
|
||||
<glyph unicode=" " horiz-adv-x="561" />
|
||||
<glyph unicode="◼" horiz-adv-x="571" d="M0 0z" />
|
||||
<glyph unicode="" horiz-adv-x="3126" d="M0 90q0 -38 29 -64q27 -27 65 -27h627q41 0 72.5 -30t31.5 -73t-31.5 -74t-72.5 -31t-73 32q-29 26 -65 26q-38 0 -64 -25.5t-26 -63.5t26 -64q85 -85 202 -85q118 0 201 83.5t83 201.5t-83 202t-201 84h-627q-38 0 -66 -27.5t-28 -64.5zM0 411q0 -35 29 -61 q27 -27 65 -27h1170q118 0 201.5 83.5t83.5 201.5t-83 200t-202 82q-121 0 -201 -81q-25 -26 -25 -65t24.5 -63.5t63.5 -24.5q38 0 66 25q30 30 72 30t72.5 -30t30.5 -73t-30.5 -74t-72.5 -31h-1170q-38 0 -66 -27.5t-28 -64.5zM283 662q0 -13 18 -13h153q11 0 21 15 q36 87 111.5 143.5t170.5 63.5l56 8q20 0 20 18l7 55q17 173 146 289t304 116q176 0 305.5 -115.5t147.5 -289.5l7 -62q0 -19 19 -19h174q144 0 245.5 -100.5t101.5 -242.5q0 -143 -101.5 -244.5t-245.5 -101.5h-736q-20 0 -20 -19v-146q0 -18 20 -18h736q143 0 264.5 71 t192 193t70.5 265q0 118 -45 216q121 159 121 353q0 150 -75.5 279t-204.5 204.5t-279 75.5q-247 0 -412 -185q-128 65 -285 65q-225 0 -398 -139.5t-220 -356.5q-136 -32 -240.5 -131t-145.5 -234v-4q-3 -5 -3 -9zM1155 1838q0 -37 29 -64l65 -69q26 -26 65 -26 q40 0 65.5 24.5t25.5 64.5q0 38 -24 64l-70 69q-25 28 -63 28t-65.5 -27t-27.5 -64zM1723 1368q115 109 264 109q155 0 267.5 -112t112.5 -268q0 -104 -55 -195q-153 153 -369 153h-36q-38 173 -184 313zM1896 1927q0 -37 26.5 -62.5t64.5 -25.5t65 25.5t27 62.5v218 q0 38 -27 65t-65 27t-64.5 -27t-26.5 -65v-218zM2488 1685q0 -39 24 -64q27 -27 65 -27.5t61 27.5l156 153q27 27 27 65q0 37 -27 64t-65 27t-64 -26l-153 -157q-24 -25 -24 -62zM2570 423q0 -37 27 -64l68 -69q32 -26 66 -26q31 0 63 26q27 27 27 64q0 35 -27 65l-68 69 q-26 26 -62 26q-40 0 -67 -26.5t-27 -64.5zM2731 1097q0 -38 27 -63q24 -28 61 -28h216q38 0 65 27t27 64t-27.5 64.5t-64.5 27.5h-216q-38 0 -63 -27t-25 -65z" />
|
||||
<glyph unicode="" horiz-adv-x="3105" d="M0 94q0 -39 26 -65q70 -29 94 -29h840q38 0 64.5 27.5t26.5 65.5q0 37 -26.5 62.5t-64.5 25.5h-840q-42 0 -81 -25.5t-39 -61.5zM149 414q0 -38 27 -63q24 -28 62 -28h1003q38 0 65 26.5t27 64.5t-27 65t-65 27h-1003q-37 0 -63 -27t-26 -65zM261 667q0 -14 18 -14h148 q19 0 23 14q41 85 116 140.5t169 66.5h58q17 0 17 20l8 60q11 114 74 207.5t163.5 146.5t215.5 53q174 0 304 -117t148 -290l8 -60q0 -20 19 -20h171q142 0 245.5 -102t103.5 -242q0 -144 -103 -246.5t-246 -102.5h-735q-18 0 -18 -20v-142q0 -19 18 -19h735q144 0 266 71 t193 193t71 266q0 116 -46 214q124 154 124 350q0 150 -75.5 279t-205 204.5t-280.5 75.5q-117 0 -223.5 -47.5t-185.5 -133.5q-132 69 -288 69q-226 0 -401 -140t-223 -358q-136 -34 -239.5 -133.5t-144.5 -235.5q-2 -2 -2 -7zM337 -246q0 -38 28 -63q25 -27 62 -27h1005 q37 0 63 26.5t26 63.5q0 40 -25.5 66.5t-63.5 26.5h-1005q-38 0 -64 -26.5t-26 -66.5zM1135 1835q0 -40 26 -64l68 -70q26 -26 64 -26q41 0 66.5 25.5t25.5 65.5q0 37 -26 63l-69 69q-27 27 -61 27q-40 0 -67 -26.5t-27 -63.5zM1707 1368q106 101 261 101 q156 0 265.5 -109.5t109.5 -265.5q0 -107 -49 -193q-151 152 -373 152h-32q-46 184 -182 315zM1878 1925q0 -38 26.5 -63t63.5 -25q40 0 64.5 24.5t24.5 63.5v218q0 39 -25 65.5t-64 26.5q-37 0 -63.5 -27t-26.5 -65v-218zM2467 1681q0 -39 27 -64q20 -26 64 -26q43 0 63 26 l156 154q26 24 26 66q0 37 -26.5 63.5t-64.5 26.5t-65 -25l-153 -158q-27 -26 -27 -63zM2552 416q0 -39 25 -64l70 -67q39 -29 65 -29t65 29q26 26 26 64q0 37 -26 65l-68 65q-30 28 -69 28q-38 0 -63 -26t-25 -65zM2706 1090q0 -39 29 -65q29 -27 64 -27h217q36 0 62.5 27 t26.5 65q0 36 -26 60.5t-63 24.5h-217q-39 0 -66 -24.5t-27 -60.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2867" d="M0 528q0 -144 70.5 -266t191.5 -192.5t264 -70.5h1155q143 0 265 70.5t193 192.5t71 266q0 106 -45 213q122 149 122 353q0 114 -44 217.5t-119 178.5t-178.5 119t-217.5 44q-237 0 -414 -186q-124 70 -288 70q-225 0 -398 -139.5t-222 -357.5q-179 -41 -292.5 -184 t-113.5 -328zM182 528q0 134 89.5 231t224.5 113l53 3q20 0 20 19l7 58q22 173 150 289.5t300 116.5q176 0 306.5 -117t146.5 -289l8 -62q4 -18 22 -18h172q141 0 243 -102t102 -242q0 -145 -101.5 -247.5t-243.5 -102.5h-1155q-140 0 -242 103.5t-102 246.5zM897 1837 q0 -39 26 -67l70 -68q40 -30 68 -27q33 0 59 27.5t26 66.5t-28 63l-63 70q-29 26 -65 26q-39 0 -66 -26.5t-27 -64.5zM1467 1365q111 107 261 107q158 0 268.5 -110t110.5 -268q0 -100 -54 -196q-155 153 -372 153h-34q-40 174 -180 314zM1640 1928q0 -41 25 -66t63 -25 q41 0 66 25t25 66v218q0 38 -25.5 63t-65.5 25q-38 0 -63 -25t-25 -63v-218zM2229 1683q0 -41 24 -66q34 -26 66 -26q29 0 63 26l153 153q26 29 26 68q0 38 -26 64t-63 26q-38 0 -62 -26l-157 -153q-24 -29 -24 -66zM2314 421q0 -38 27 -67l69 -67q24 -26 62 -26t63.5 26.5 t25.5 66.5q0 36 -26 62l-69 69q-26 26 -61 26q-38 0 -64.5 -26t-26.5 -64zM2470 1094q0 -37 28 -62q26 -26 65 -26h218q37 0 61.5 25t24.5 63t-24.5 64.5t-61.5 26.5h-218q-38 0 -65.5 -27t-27.5 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="3132" d="M0 85q0 -37 27 -62.5t67 -25.5h1996q38 0 65 25.5t27 62.5q0 38 -27 64.5t-65 26.5h-1996q-40 0 -67 -26.5t-27 -64.5zM280 419q0 -37 27 -62q27 -29 64 -29h1997q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1997q-38 0 -64.5 -25.5t-26.5 -62.5zM293 675 q0 -14 17 -14h153q11 0 22 17q38 83 113.5 136t166.5 60l58 8q18 0 18 19l7 54q17 173 146.5 289t304.5 116q173 0 302.5 -115t147.5 -286l8 -62q0 -18 20 -18h172q103 0 187.5 -55t125.5 -146q11 -17 21 -17h154q21 0 14 24l-21 59q121 150 121 353q0 113 -44 216t-118 178 t-178 119t-218 44q-247 0 -408 -179q-135 67 -286 67q-224 0 -398.5 -140.5t-223.5 -359.5q-285 -75 -382 -357q-2 -3 -2 -10zM466 -243q0 -38 29 -64q25 -28 63 -28h1999q37 0 64 27t27 65q0 37 -26.5 61.5t-64.5 24.5h-1999q-38 0 -65 -24.5t-27 -61.5zM1167 1834 q0 -38 25 -63l69 -68q27 -29 62 -29q36 0 63.5 26.5t27.5 65.5q0 38 -27 67l-68 65q-26 28 -64 28q-39 0 -63.5 -26.5t-24.5 -65.5zM1734 1367q108 108 259 108q157 0 267.5 -111t110.5 -267q0 -104 -52 -192q-152 152 -370 152h-36q-45 188 -179 310zM1905 1925 q0 -37 25.5 -62.5t62.5 -25.5q40 0 67 25.5t27 62.5v218q0 37 -28 64t-66 27q-37 0 -62.5 -26.5t-25.5 -64.5v-218zM2491 1682q0 -36 26 -64q59 -57 131 0l152 153q26 28 26 68q0 37 -26 63t-63 26q-38 0 -64 -26l-156 -157q-26 -28 -26 -63zM2577 424q0 -38 28 -64l68 -69 q26 -26 62 -26q33 0 65 26q26 28 26 68q0 36 -26 60l-69 70q-28 26 -64 26q-38 0 -64 -26.5t-26 -64.5zM2735 1097q0 -39 28 -64q24 -27 63 -27h219q37 0 62.5 26.5t25.5 64.5t-25.5 64t-62.5 26h-219q-38 0 -64.5 -26.5t-26.5 -63.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2884" d="M0 530q0 -214 149 -367.5t363 -163.5q19 0 19 18v143q0 19 -19 19q-137 7 -233.5 109.5t-96.5 241.5q0 133 90.5 231t224.5 114l57 4q21 0 21 19l7 59q17 173 146.5 289.5t305.5 116.5q174 0 305.5 -116.5t149.5 -289.5l8 -62q0 -20 18 -20h173q143 0 247.5 -102.5 t104.5 -242.5q0 -139 -97 -241.5t-234 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q214 7 362 161.5t148 369.5q0 119 -44 214q126 154 126 355q0 151 -76 280.5t-205.5 205.5t-280.5 76q-250 0 -416 -187q-128 70 -289 70q-226 0 -401.5 -140t-225.5 -359q-177 -42 -292 -186 t-115 -329zM569 -223q16 -35 49 -48q32 -16 67.5 -2.5t47.5 47.5q16 35 2.5 69t-47.5 47q-32 17 -66.5 3t-50.5 -50q-15 -27 -2 -66zM638 80q0 -22 10 -41q31 -49 95 -49q51 0 74 69l111 343q13 39 -7.5 71.5t-58.5 39.5q-35 11 -67.5 -6.5t-43.5 -53.5l-110 -344 q-3 -15 -3 -29zM837 -519q0 -21 5 -31q14 -35 48 -48q15 -8 37 -8q10 0 32 6q35 13 50.5 48.5t-0.5 70.5t-48 48.5t-66 -0.5q-31 -12 -44.5 -37.5t-13.5 -48.5zM902 1843q0 -40 26 -64l69 -69q26 -26 58 -29q33 -5 65.5 24.5t32.5 68.5q0 38 -26 64l-68 68q-30 27 -66 27 q-39 0 -65 -26t-26 -64zM915 -232q0 -26 17 -51t51 -35q18 -4 26 -4q24 0 41 8q32 13 46 61l192 655q11 38 -6 69.5t-53 41.5q-38 11 -70.5 -6t-43.5 -54l-196 -660q-4 -20 -4 -25zM1283 -191q0 -20 7 -33q14 -33 48 -47q17 -8 37 -8q10 0 32 6q36 14 49 47q13 35 0 67.5 t-45 48.5q-36 17 -70 3t-51 -50q-7 -13 -7 -34zM1360 83q0 -25 16.5 -48.5t49.5 -33.5q14 -3 27 -3q62 0 84 65l110 339q12 37 -7 69t-55 42q-38 11 -68.5 -6t-42.5 -54l-109 -341q-5 -22 -5 -29zM1474 1371q107 103 265 103q156 0 267 -109.5t111 -265.5q0 -100 -55 -197 q-153 154 -374 154h-33q-47 185 -181 315zM1647 1933q0 -38 27 -65t65 -27q37 0 62.5 27t25.5 65v220q0 38 -25.5 65t-62.5 27q-38 0 -65 -27t-27 -65v-220zM2239 1689q0 -39 27 -64q24 -28 61.5 -27.5t64.5 27.5l154 154q29 24 29 64q0 38 -27.5 65t-65.5 27q-35 0 -61 -29 l-155 -153q-27 -25 -27 -64zM2325 419q0 -36 26 -64l70 -67q23 -29 64 -29q38 0 61 29q29 26 29 64t-29 65l-69 66q-25 28 -62 28t-63.5 -27t-26.5 -65zM2481 1099q0 -38 28 -64q28 -28 66 -28h217q38 0 65.5 27t27.5 65q0 37 -27 62.5t-66 25.5h-217q-40 0 -67 -25.5 t-27 -62.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2868" d="M0 528q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l6 54q17 173 146.5 289.5t305.5 116.5q174 0 303.5 -116t148.5 -290l7 -62q0 -18 20 -18h171q145 0 247.5 -101t102.5 -243 q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 108 -50 221q127 151 127 349q0 114 -44.5 217.5t-119.5 178.5t-178.5 119t-216.5 44q-247 0 -414 -185q-137 66 -283 66q-227 0 -401.5 -139t-223.5 -359 q-176 -41 -291 -184.5t-115 -327.5zM800 -674h32l567 837q6 7 2.5 14.5t-14.5 7.5h-233l245 449q12 23 -15 23h-314q-13 0 -23 -15l-230 -610q-4 -22 15 -22h231zM894 1841q0 -40 26 -66l70 -69q67 -51 129 0q26 29 26 68q0 37 -26 63l-68 69q-30 27 -66 27q-37 0 -64 -27 t-27 -65zM1464 1369q109 109 264 109q156 0 266 -111t110 -269q0 -97 -54 -193q-156 150 -369 150h-33q-43 182 -184 314zM1637 1933q0 -40 25.5 -66t65.5 -26q38 0 63 25.5t25 66.5v218q0 38 -25 63t-63 25t-64.5 -25t-26.5 -63v-218zM2225 1686q0 -37 29 -64t59 -27 q26 0 66 27l154 153q27 29 27 67q0 39 -26.5 65t-64.5 26q-35 0 -62 -27l-153 -153q-29 -31 -29 -67zM2312 425q0 -37 26 -65l69 -70q26 -26 62 -26q38 0 64.5 27t26.5 67q0 36 -27 61l-66 70q-30 25 -66 25q-37 0 -63 -26t-26 -63zM2467 1098q0 -35 28 -61q27 -27 64 -27 h218q38 0 65 25.5t27 62.5q0 38 -27.5 65t-64.5 27h-218q-37 0 -64.5 -27t-27.5 -65z" />
|
||||
<glyph unicode="" horiz-adv-x="2885" d="M0 523q0 -212 146 -363t360 -161q19 0 19 18v142q0 19 -19 19q-137 7 -231 106.5t-94 238.5q0 135 90 234t224 110l56 8q17 0 17 15l8 59q20 175 147.5 290t302.5 115t305.5 -115t147.5 -287l7 -62q4 -18 23 -18h171q142 0 244 -102.5t102 -246.5q0 -139 -94 -238.5 t-231 -106.5q-21 0 -21 -19v-142q0 -18 21 -18q213 7 359 159t146 365q0 108 -41 214q124 154 124 357q0 113 -44 216.5t-119 178.5t-178.5 119.5t-217.5 44.5q-246 0 -412 -186q-143 70 -292 70q-226 0 -398.5 -140t-221.5 -360q-180 -41 -293 -184.5t-113 -329.5z M571 -227q0 -27 17.5 -54t50.5 -37q37 -11 68.5 4t42.5 60l15 65q8 36 -10.5 67.5t-55.5 42.5q-36 11 -68 -8t-42 -57l-15 -63q-3 -9 -3 -20zM653 82q0 -35 26 -61q25 -27 60 -27q38 0 64.5 25.5t26.5 62.5t-26.5 62.5t-64.5 25.5q-37 0 -61.5 -25t-24.5 -63zM718 325 q-2 -25 14 -48.5t51 -34.5q33 -10 66.5 7.5t44.5 54.5l29 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q-3 -27 -3 -28zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM901 1834q0 -38 26 -64l70 -68q22 -25 57.5 -27.5t66.5 27.5q26 26 26 63q0 38 -26 64l-67 69q-25 25 -63 28q-37 0 -63.5 -27t-26.5 -65zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50 t48.5 -32q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12 t-1.5 -15zM1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1430 325q0 -27 17 -51.5t52 -34.5q3 0 13 -2t15 -2q17 0 39 10q33 17 43 56l26 96q10 36 -7.5 67.5t-53.5 42.5q-37 11 -68.5 -6t-42.5 -54l-30 -97q0 -3 -1.5 -11.5 t-1.5 -13.5zM1467 1361q106 106 263 106q158 0 269 -108.5t111 -264.5q0 -106 -57 -200q-157 157 -373 157h-33q-45 175 -180 310zM1643 1923q0 -37 24.5 -61.5t62.5 -24.5q39 0 66 24.5t27 61.5v220q0 37 -27.5 64t-65.5 27q-37 0 -62 -26.5t-25 -64.5v-220zM2232 1681 q0 -40 24 -64q57 -57 129 0l153 153q27 27 27 67q0 38 -26.5 64.5t-64.5 26.5q-37 0 -65 -26l-153 -158q-24 -23 -24 -63zM2315 417q0 -37 29 -63l65 -67q32 -26 65 -26q32 0 64 26q27 25 27 63q0 36 -27 66l-69 65q-24 27 -61 27t-64 -27q-29 -27 -29 -64zM2473 1094 q0 -38 28 -63q29 -29 66 -29h216q37 0 62.5 27t25.5 65t-25.5 64.5t-62.5 26.5h-216q-38 0 -66 -27t-28 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="2885" d="M0 527q0 -180 107 -321.5t275 -188.5q15 -2 26 8l125 150q-143 0 -245 103.5t-102 248.5q0 133 90.5 231t225.5 114l52 3q21 0 21 20l8 58q17 173 147 290t305 117q176 0 307 -117t148 -290l7 -63q7 -18 23 -18h175q141 0 243 -101.5t102 -243.5q0 -135 -90.5 -236 t-220.5 -112q-78 -9 -96 -30l-234 -301q-22 -30 -17 -67t33 -60q24 -27 63.5 -22t63.5 38l205 262q131 13 239.5 87t171.5 191t63 250q0 115 -45 214q126 153 126 355q0 113 -45 217t-120.5 179t-179.5 120t-218 45q-240 0 -414 -186q-127 70 -290 70q-226 0 -400 -140.5 t-221 -359.5q-181 -41 -297.5 -185t-116.5 -329zM416 -352q12 -35 49 -51q35 -16 71 -1t49 50q15 33 0.5 66.5t-47.5 49.5q-35 16 -70.5 2t-48.5 -49q-13 -41 -3 -67zM609 -59v-12q3 -35 32 -59q28 -24 67 -21t61 31l233 301q23 29 20 67.5t-31 60.5q-29 24 -67.5 20 t-64.5 -33l-229 -299q-21 -26 -21 -56zM664 -578q0 -10 6 -32q14 -35 49 -49q18 -7 38 -7q15 0 33 5q34 13 47 47q16 35 2.5 71t-47.5 49q-35 16 -71.5 1.5t-48.5 -48.5q-8 -17 -8 -37zM842 -325v-11q3 -36 35 -62q24 -26 64 -21.5t64 36.5l442 558q22 32 18 68.5t-33 62.5 q-29 23 -66 18.5t-60 -33.5l-444 -561q-20 -24 -20 -55zM904 1839q0 -39 29 -63l65 -70q25 -25 58 -28q33 -5 65.5 24t32.5 68q0 36 -26 64l-69 69q-24 26 -62 26q-39 0 -66 -26t-27 -64zM1218 -447q0 -19 7 -33q14 -35 48 -49q17 -8 37 -8q10 0 32 6q36 14 49 49 q16 35 2.5 70.5t-47.5 48.5q-35 16 -71.5 2t-49.5 -48q-7 -18 -7 -38zM1475 1368q113 103 264 103q158 0 270 -109.5t112 -265.5q0 -106 -55 -198q-155 155 -371 155h-36q-44 184 -184 315zM1648 1929q0 -37 26.5 -62.5t64.5 -25.5q39 0 66 25.5t27 62.5v221q0 37 -27.5 64 t-65.5 27q-37 0 -64 -26.5t-27 -64.5v-221zM2243 1686q0 -38 24 -64q28 -27 65.5 -27.5t60.5 27.5l159 154q26 26 26 65q0 38 -27.5 65.5t-64.5 27.5q-35 0 -64 -27l-155 -157q-24 -26 -24 -64zM2326 416q0 -38 26 -64l70 -67q26 -26 58 -29h6q28 0 66 29q26 26 26 62 q0 38 -26 67l-70 66q-26 27 -63 27q-39 0 -66 -26.5t-27 -64.5zM2486 1096q0 -38 26 -64q26 -29 64 -29h218q38 0 65 27.5t27 65.5q0 37 -27 62.5t-65 25.5h-218q-38 0 -64 -25.5t-26 -62.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2877" d="M0 529q0 -213 148.5 -366.5t363.5 -163.5q18 0 18 18v143q0 18 -18 18q-137 7 -233.5 109.5t-96.5 241.5q0 132 90.5 230t224.5 114l56 5q21 0 21 18l7 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q142 0 245.5 -102t103.5 -242 q0 -139 -96 -241.5t-233 -109.5q-20 0 -20 -18v-143q0 -18 20 -18q213 7 361.5 161.5t148.5 368.5q0 115 -45 214q125 155 125 353q0 152 -75.5 281.5t-204.5 204.5t-280 75q-249 0 -414 -186q-131 70 -289 70q-226 0 -401 -140.5t-224 -358.5q-177 -42 -292 -185.5 t-115 -327.5zM576 -202q0 -27 17.5 -52.5t52.5 -35.5q18 -4 29 -4q63 0 82 68l169 627q11 38 -8.5 71t-56.5 40q-35 11 -67.5 -7t-43.5 -54l-169 -630q-5 -20 -5 -23zM854 -531q0 -30 16 -55.5t55 -31.5q18 -4 28 -4q25 0 48 18.5t29 51.5l256 953q10 37 -7.5 68.5 t-53.5 42.5q-37 11 -69.5 -7t-42.5 -54l-256 -953q-3 -27 -3 -29zM899 1840q0 -38 27 -65l69 -70q31 -24 66 -24q34 0 62 25t28 63q0 39 -26 68l-68 69q-29 27 -64 27q-39 0 -66.5 -27.5t-27.5 -65.5zM1297 -205q0 -26 16.5 -50.5t49.5 -34.5q18 -4 27 -4q28 0 52.5 15.5 t31.5 52.5l169 627q10 37 -7.5 68.5t-53.5 42.5q-38 11 -69.5 -7t-41.5 -54l-169 -630q-5 -23 -5 -26zM1471 1368q113 107 264 107q157 0 267 -110.5t110 -268.5q0 -100 -55 -197q-155 155 -372 155h-35q-45 186 -179 314zM1643 1928q0 -37 27 -62.5t65 -25.5q37 0 62.5 25 t25.5 63v219q0 41 -25 67t-63 26q-40 0 -66 -26.5t-26 -66.5v-219zM2233 1685q0 -39 29 -63q22 -25 58.5 -27.5t66.5 27.5l154 153q28 27 28 67q0 39 -26.5 65t-65.5 26q-33 0 -62 -27l-153 -154q-29 -27 -29 -67zM2320 421q0 -38 26 -67l69 -67q28 -22 64 -22l2 -2 q36 0 62 26t26 65q0 38 -28 62l-66 70q-29 26 -66 26t-63 -26.5t-26 -64.5zM2475 1096q0 -38 28 -63q28 -28 66 -28h217q38 0 65 27t27 64q0 38 -27 65.5t-65 27.5h-217q-38 0 -66 -27.5t-28 -65.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2868" d="M0 530q0 -213 148.5 -365.5t362.5 -163.5q18 0 18 18v143q0 19 -18 19q-136 7 -231 108.5t-95 240.5q0 134 89.5 231t224.5 113l53 4q21 0 21 19l6 57q17 173 146.5 289.5t305.5 116.5q175 0 305 -116.5t146 -289.5l8 -61q0 -19 19 -19h178q140 0 242 -102t102 -242 q0 -136 -95.5 -237t-230.5 -112q-18 0 -18 -19v-143q0 -18 18 -18q140 4 256 76.5t182.5 192t66.5 260.5q0 114 -44 209q121 150 121 350q0 114 -44 217.5t-119 178.5t-178.5 119t-217.5 44q-241 0 -406 -177q-127 68 -291 68q-226 0 -399.5 -139.5t-220.5 -357.5 q-180 -41 -295.5 -184t-115.5 -328zM578 -184q0 -29 17 -57t48 -38q31 -11 65.5 6.5t46.5 58.5l27 112q11 33 -7.5 66.5t-54.5 44.5q-40 10 -72 -9t-39 -57l-30 -106q-1 -7 -1 -21zM717 319q0 -61 68 -84q35 -12 68 5.5t44 56.5l26 110q11 33 -7 66t-54 45q-39 10 -71 -8.5 t-39 -55.5l-32 -109q-3 -13 -3 -26zM847 -522q0 -26 18 -53t52 -38q1 0 10.5 -1.5t15.5 -1.5q22 0 39 8q30 13 44 62l29 106q11 37 -7.5 69.5t-54.5 42.5q-37 11 -69.5 -7.5t-42.5 -54.5l-30 -109q-4 -16 -4 -23zM896 1832q0 -40 27 -66l70 -69q54 -54 125 0q26 28 26 65 t-26 65l-67 70q-26 26 -64 26q-37 0 -64 -26.5t-27 -64.5zM991 -11q0 -27 17 -54t50 -37q37 -11 68 5t43 60l26 108q11 37 -6.5 69.5t-53.5 43.5q-40 11 -72.5 -8.5t-39.5 -56.5l-30 -110q-2 -6 -2 -20zM1288 -195q4 -60 67 -88l27 -4q26 0 50.5 17t34.5 53l31 108 q10 38 -9.5 70.5t-56.5 39.5q-33 11 -66 -7.5t-44 -54.5l-29 -109q-1 -4 -2 -9t-2 -8.5t-1 -7.5zM1437 313q0 -26 16.5 -51.5t48.5 -34.5l27 -3q31 0 55 19t30 50l29 106q11 38 -7 69.5t-54 41.5q-37 11 -68.5 -6.5t-41.5 -53.5l-32 -113q-3 -13 -3 -24zM1472 1365 q106 102 256 102q157 0 268 -110.5t111 -267.5q0 -90 -50 -188q-153 153 -370 153h-36q-43 181 -179 311zM1637 1923q0 -40 25.5 -65.5t65.5 -25.5t65.5 25.5t25.5 65.5v215q0 40 -25.5 66t-65.5 26t-65.5 -26t-25.5 -66v-215zM2229 1678q0 -40 24 -65q33 -27 66 -27 q30 0 63 27l153 153q26 29 26 67t-26 64t-63 26t-65 -26l-154 -153q-24 -28 -24 -66zM2313 416q0 -37 28 -67l66 -68q33 -33 66 -33q31 0 62 33q29 29 28 65.5t-28 63.5l-69 70q-26 26 -61 26q-38 0 -65 -26.5t-27 -63.5zM2470 1089q0 -36 26 -62t62 -26h218q41 0 67 25 t26 63q0 40 -26.5 66t-66.5 26h-218q-37 0 -62.5 -27t-25.5 -65z" />
|
||||
<glyph unicode="" horiz-adv-x="2864" d="M0 525q0 -138 68 -257t185.5 -191t256.5 -76q18 0 18 18v142q0 20 -18 20q-136 7 -232.5 108.5t-96.5 235.5q0 132 90.5 230t223.5 114l56 6q19 0 19 20l8 54q17 175 145.5 291.5t303.5 116.5q174 0 304.5 -116.5t147.5 -288.5l8 -62q0 -18 18 -18h172q144 0 246 -102.5 t102 -244.5q0 -134 -96.5 -235.5t-231.5 -108.5q-20 0 -20 -20v-142q0 -18 20 -18q212 7 360 160t148 364q0 121 -46 217q126 151 126 352q0 150 -75 278.5t-204 203.5t-279 75q-246 0 -413 -185q-130 70 -287 70q-225 0 -399 -139.5t-223 -356.5q-179 -44 -292 -187 t-113 -328zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM677 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM895 1832q0 -39 26 -63l70 -70q26 -26 57 -27 q33 -5 65 23.5t32 67.5t-26 68l-68 65q-24 27 -62 27q-40 0 -67 -26.5t-27 -64.5zM1016 -112q0 -36 26 -64q26 -26 62 -26q38 0 64.5 26t26.5 64q0 37 -26.5 63.5t-64.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63 t-64.5 26q-36 0 -62 -26t-26 -63zM1016 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25t26.5 63t-26.5 64.5t-64.5 26.5q-35 0 -61.5 -27t-26.5 -64zM1360 93q0 -38 26 -65t63 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1360 -294q0 -34 25 -61 q28 -26 64 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25q-38 0 -63.5 -25.5t-25.5 -62.5zM1464 1365q110 106 263 106q155 0 265 -111t110 -266q0 -100 -54 -196q-153 153 -371 153h-34q-47 187 -179 314zM1635 1921q0 -37 27 -62t65 -25t63 25t25 62v218q0 38 -25.5 65 t-62.5 27t-64.5 -27.5t-27.5 -64.5v-218zM2223 1679q0 -37 27 -63q24 -25 59.5 -27.5t66.5 27.5l153 153q28 28 28 65q0 38 -27.5 65t-64.5 27q-35 0 -62 -27l-153 -156q-27 -25 -27 -64zM2309 421q0 -40 26 -66l68 -67q39 -26 68 -26q33 0 59.5 27.5t26.5 65.5q0 36 -28 62 l-66 69q-28 26 -65 26t-63 -26.5t-26 -64.5zM2463 1094q0 -38 28 -63q27 -29 66 -29h216q37 0 64 27t27 65t-27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="2864" d="M0 529q0 -139 68 -258.5t185 -191.5t256 -78q19 0 19 18v142q0 20 -19 20q-136 7 -232 108.5t-96 239.5q0 132 90 229.5t223 113.5l56 3q20 0 20 19l8 58q17 173 145.5 289t303.5 116q172 0 302.5 -116.5t149.5 -288.5l7 -62q0 -18 18 -18h173q141 0 244.5 -102 t103.5 -241q0 -138 -96 -239.5t-233 -108.5q-19 0 -19 -20v-142q0 -18 19 -18q139 4 256 76.5t184 192.5t67 259q0 118 -44 213q124 152 124 352q0 151 -75 279.5t-203 203t-278 74.5q-248 0 -413 -185q-131 70 -287 70q-225 0 -399 -139.5t-223 -356.5 q-176 -42 -290.5 -185t-114.5 -326zM630 435q0 -61 45 -104t108 -43q64 0 107 42.5t43 104.5q0 39 -37.5 107t-69.5 106q-34 36 -43 45l-38 -43q-43 -46 -79 -110t-36 -105zM895 1834q0 -41 26 -65l69 -70q67 -50 129 0q26 31 26 68t-26 63l-68 69q-30 27 -65 27 q-39 0 -65 -27t-26 -65zM947 13q0 -105 72.5 -176.5t175.5 -71.5q104 0 177 73t73 175q0 86 -86 210q-74 97 -136 159q-13 9 -28 24l-25 -24q-57 -52 -136 -157q-87 -121 -87 -212zM1104 719q0 -40 30.5 -69t73.5 -29q41 0 70 29t29 69q0 66 -99 171l-26 -27 q-29 -32 -53.5 -74.5t-24.5 -69.5zM1464 1365q106 106 263 106q156 0 265.5 -110t109.5 -267q0 -94 -55 -196q-155 153 -370 153h-35q-46 186 -178 314zM1635 1926q0 -38 27.5 -65t64.5 -27t62 27t25 65v217q0 38 -24.5 63t-62.5 25t-65 -25t-27 -63v-217zM2223 1679 q0 -39 27 -63q28 -26 60 -26q28 0 65 26l153 153q29 29 29 66q0 39 -27 65t-65 26q-35 0 -62 -27l-153 -153q-27 -27 -27 -67zM2309 423q0 -40 25 -68l69 -62q23 -29 63 -29q39 0 62 29q29 26 29 62q0 35 -29 62l-65 69q-28 26 -65 26q-38 0 -63.5 -26t-25.5 -63zM2463 1094 q0 -36 27 -62q28 -26 67 -26h216q38 0 64.5 25.5t26.5 62.5q0 38 -27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="2541" d="M0 899q0 -43 30 -71t77 -28h180q43 0 73.5 28.5t30.5 70.5q0 46 -30 76t-74 30h-180q-47 0 -77 -29.5t-30 -76.5zM189 239q0 -155 113 -268.5t268 -113.5h732q155 0 265.5 112t110.5 270q0 77 -22 131q133 85 210.5 226.5t77.5 302.5q0 130 -51 248.5t-136.5 204 t-204 136.5t-247.5 51q-175 0 -322.5 -86t-232 -233t-84.5 -321v-36q-160 -91 -211 -266q-121 -38 -193.5 -135t-72.5 -223zM355 1750q0 -45 28 -72l172 -180q75 -57 150 0q30 30 30 75q0 43 -30 75l-176 175q-34 31 -74 31q-45 0 -72.5 -30t-27.5 -74zM400 239q0 67 43 115 t109 54l66 9q21 0 21 24l10 60q11 92 78 154t158 62q93 0 161.5 -62t79.5 -154l9 -69q10 -24 26 -24h141q69 0 119.5 -50t50.5 -119q0 -72 -50.5 -123t-119.5 -51h-732q-72 0 -121 51t-49 123zM872 921q11 175 135 294t298 119q178 0 303 -127t125 -308q0 -112 -54.5 -207.5 t-147.5 -154.5q-94 78 -217 78q-47 140 -164 223t-265 83h-13zM1201 1854q0 -44 30.5 -74.5t73.5 -30.5q44 0 74.5 30.5t30.5 74.5v250q0 42 -30.5 70.5t-74.5 28.5q-43 0 -73.5 -28.5t-30.5 -70.5v-250zM1875 230q0 -43 29 -75l175 -173q67 -68 150 0q28 27 28 72 q0 43 -28 71l-180 179q-29 27 -73 27t-72.5 -29t-28.5 -72zM1875 1575q0 -45 29 -77q29 -29 72 -29q44 0 73 29l180 180q28 27 28 72q0 44 -30.5 74t-74.5 30q-42 0 -73 -31l-175 -175q-29 -29 -29 -73zM2151 899q0 -43 30 -71t77 -28h180q43 0 73.5 28.5t30.5 70.5 q0 46 -30 76t-74 30h-180q-47 0 -77 -29.5t-30 -76.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2267" d="M0 771q0 39 27 66q28 26 64 26h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 32q0 37 25 65l157 152q24 25 63 25q38 0 63.5 -24t25.5 -61q0 -39 -26 -68l-152 -152q-65 -51 -131 0q-25 27 -25 63zM305 1509q0 37 25 65 q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM577 771q0 149 75 277.5t203.5 203.5t277.5 75q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74.5 -278t-202.5 -202.5t-278 -74.5 t-278 74.5t-203 202.5t-75 278zM758 771q0 -156 109.5 -266.5t265.5 -110.5t266.5 110.5t110.5 266.5q0 154 -110.5 263t-266.5 109q-155 0 -265 -109t-110 -263zM1042 -58q0 38 26.5 64t64.5 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66v212z M1042 1595v218q0 37 27 64t64 27t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM1631 189q0 37 24 60q24 25 60 25q39 0 64 -25l156 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM1631 1354q0 40 24 63l152 157 q28 26 63 26q38 0 64.5 -27t26.5 -64q0 -40 -26 -66l-156 -152q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 771q0 38 26 66q26 26 61 26h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5t-25 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM873 -528q0 -24 17 -50t49 -36q18 -4 27 -4q24 0 41 8q34 13 46 61l29 110q10 40 -9 71.5t-57 39.5q-33 11 -66 -8t-45 -55l-27 -111 q-5 -22 -5 -26zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM1016 -16q-1 -26 15 -50.5t51 -34.5q34 -11 66.5 6.5t44.5 59.5l32 110q11 35 -8.5 67.5t-57.5 43.5q-36 11 -68.5 -7.5 t-43.5 -56.5l-26 -112q-5 -22 -5 -26zM1318 -195q0 -23 11 -42q21 -34 58 -46q18 -6 30 -6q20 0 33 8q32 12 48 64l27 108q11 38 -7 69.5t-54 41.5q-37 11 -69.5 -7t-43.5 -54l-30 -111q-3 -14 -3 -25zM1464 319q0 -28 17.5 -53.5t52.5 -35.5q27 -9 65 5q32 14 46 61l29 107 q10 40 -8.5 71.5t-56.5 39.5q-36 11 -68 -6.5t-43 -53.5l-31 -113q-3 -21 -3 -22zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5v220 q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29 q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2875" d="M0 528q0 -177 105 -316t274 -190l-68 -181q-7 -22 15 -22h226l-133 -421h31l445 575q6 7 1.5 14.5t-15.5 7.5h-232l264 494q11 23 -15 23h-314q-15 0 -25 -15l-114 -307q-114 29 -189 124t-75 214q0 133 90.5 231t224.5 114l56 7q21 0 21 19l6 54q17 173 147 290t305 117 q174 0 304.5 -117t149.5 -290l6 -62q0 -18 19 -18h172q145 0 247.5 -101t102.5 -244q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 361.5 161t148.5 368q0 118 -46 214q126 153 126 354q0 150 -75.5 279t-204.5 204.5t-280 75.5q-247 0 -414 -185 q-129 69 -288 69q-226 0 -401 -140t-224 -358q-177 -41 -291.5 -184.5t-114.5 -328.5zM863 -494q-2 -24 14.5 -47t49.5 -35q11 -3 22 -3q27 0 54 16t36 50l244 914q10 37 -7 68.5t-52 42.5q-37 11 -69.5 -7t-42.5 -54l-246 -917q-3 -13 -3 -28zM898 1837q0 -38 27 -63 l68 -70q27 -27 65 -27.5t61 27.5q30 24 30 64q0 38 -27 63l-67 70q-28 26 -65 26q-40 0 -66 -26t-26 -64zM1306 -168q0 -19 12 -40q20 -32 53 -46q11 -5 32 -5q24 0 35 6q32 13 44 62l159 592q10 38 -8 69t-54 42q-37 11 -68.5 -7t-41.5 -54l-159 -595q0 -4 -2 -12t-2 -12z M1469 1367q107 103 264 103q156 0 266.5 -109t110.5 -265q0 -100 -55 -197q-159 157 -373 157h-33q-49 188 -180 311zM1641 1927q0 -37 27.5 -64.5t64.5 -27.5q38 0 63 27t25 65v219q0 38 -25 65t-63 27q-37 0 -64.5 -27t-27.5 -65v-219zM2231 1683q0 -39 28 -64 q23 -27 60.5 -27t64.5 27l154 155q28 25 28 63t-27 65t-65 27q-35 0 -61 -28l-154 -154q-28 -25 -28 -64zM2317 418q0 -36 26 -64l70 -67q20 -23 58 -26l1 -1q2 0 5 -0.5t5 -0.5q30 0 56 28q28 26 28 64q0 37 -28 65l-69 65q-26 29 -62 29q-37 0 -63.5 -27t-26.5 -65z M2472 1096q0 -37 29 -64q29 -29 65 -29h217q37 0 64.5 27.5t27.5 65.5q0 37 -27 62.5t-65 25.5h-217q-40 0 -67 -25.5t-27 -62.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2428" d="M0 90q0 40 27 67q28 26 64 26h578q118 0 201.5 -84.5t83.5 -202.5q0 -119 -83 -202.5t-202 -83.5t-203 84q-25 25 -25 64t24.5 64.5t64.5 25.5q37 0 65 -26q32 -31 74 -31t73 30.5t31 74.5q0 42 -31 72.5t-73 30.5h-578q-37 0 -64 26.5t-27 64.5zM0 414q0 39 27 66 q28 26 64 26h1125q42 0 73 31t31 74t-31 73.5t-73 30.5q-44 0 -73 -30q-29 -24 -68 -24t-63.5 24.5t-24.5 63.5q0 40 24 65q81 81 205 81q119 0 202.5 -83t83.5 -201t-83.5 -201.5t-202.5 -83.5h-1125q-38 0 -64.5 25.5t-26.5 62.5zM229 666q0 -13 17 -13h154q13 0 23 16 q36 87 112 144t170 64l56 8q21 0 21 18l8 55q17 173 146.5 290.5t305.5 117.5q177 0 307 -116.5t148 -291.5l8 -63q0 -18 18 -18h173q145 0 248.5 -102t103.5 -245t-103.5 -245t-248.5 -102h-737q-20 0 -20 -18v-148q0 -18 20 -18h737q145 0 267.5 71t194 193.5t71.5 266.5 q0 145 -71.5 267t-194 193t-267.5 71h-33q-50 213 -223.5 349t-397.5 136q-226 0 -400 -140.5t-221 -359.5q-137 -32 -243 -131.5t-147 -235.5v-4q-2 -5 -2 -9z" />
|
||||
<glyph unicode="" horiz-adv-x="2539" d="M0 87q0 39 27 65t67 26h957q38 0 63 -25.5t25 -65.5q0 -38 -25.5 -63.5t-62.5 -25.5h-957q-40 0 -67 25.5t-27 63.5zM281 413q0 38 29 64q23 24 63 24h960q37 0 61.5 -25t24.5 -63t-24.5 -65t-61.5 -27h-960q-37 0 -64.5 27.5t-27.5 64.5zM347 662q0 -15 18 -15h152 q15 0 25 15q36 87 111 144t168 64l58 7q18 0 18 19l7 55q18 174 148.5 290t306.5 116q174 0 302 -114.5t150 -288.5l8 -63q0 -17 19 -17h171q145 0 247.5 -102t102.5 -247q0 -140 -104 -243.5t-246 -103.5h-735q-19 0 -19 -18v-143q0 -19 19 -19h735q108 0 206.5 41.5 t169 112.5t112.5 168.5t42 204.5q0 144 -70.5 265.5t-192.5 192t-267 70.5h-33q-52 215 -224.5 351.5t-392.5 136.5q-227 0 -401.5 -141.5t-221.5 -361.5q-138 -31 -242 -129.5t-145 -236.5v-2q-2 -4 -2 -8zM469 -243q0 39 28 64q24 25 63 25h959q39 0 65.5 -25.5 t26.5 -63.5t-27 -65t-65 -27h-959q-37 0 -64 27t-27 65z" />
|
||||
<glyph unicode="" horiz-adv-x="2370" d="M0 454q0 159 99 282.5t254 158.5q41 188 190 307.5t343 119.5q189 0 337.5 -116.5t192.5 -298.5h29q188 0 321 -132.5t133 -320.5t-133 -321.5t-321 -133.5h-990q-92 0 -176.5 36t-145.5 97t-97 145.5t-36 176.5zM155 454q0 -122 88 -209.5t212 -87.5h990q124 0 212 87.5 t88 209.5t-88 209t-212 87h-148q-16 0 -16 16l-7 52q-16 151 -126.5 250.5t-261.5 99.5t-262.5 -100t-125.5 -250l-7 -45q0 -16 -17 -16l-48 -7q-115 -10 -193 -95t-78 -201zM1099 1384q-16 -15 8 -22q69 -30 115 -59q18 -5 24 3q97 92 226 92t223.5 -86.5t105.5 -213.5 l10 -68h151q104 0 179 -74.5t75 -177.5q0 -96 -66 -167t-163 -82q-16 0 -16 -17v-121q0 -17 16 -17q161 10 272 127t111 277q0 169 -119.5 288.5t-288.5 119.5h-16q-42 160 -175.5 263.5t-298.5 103.5q-226 0 -373 -169z" />
|
||||
<glyph unicode="" horiz-adv-x="2641" d="M0 86q0 39 27 65t67 26h1991q40 0 65.5 -25.5t25.5 -65.5q0 -37 -26.5 -62t-64.5 -25h-1991q-40 0 -67 25t-27 62zM279 421q0 39 28 64q24 24 63 24h1992q37 0 62 -25.5t25 -62.5q0 -38 -25 -64.5t-62 -26.5h-1992q-38 0 -64.5 27t-26.5 64zM293 675q0 -14 16 -14h153 q10 0 21 17q38 83 113.5 136t165.5 60l59 8q18 0 18 19l7 53q17 173 146.5 288.5t303.5 115.5q173 0 301.5 -114t146.5 -286l8 -61q0 -18 21 -18h170q103 0 187.5 -55t125.5 -146q11 -17 22 -17h153q19 0 15 24q-47 164 -186 268t-317 104h-34q-53 213 -223.5 348.5 t-389.5 135.5q-224 0 -398 -140.5t-223 -358.5q-136 -32 -238.5 -129t-142.5 -232v4q-1 -3 -1 -10zM465 -241q0 38 28 63q24 24 64 24h1993q38 0 64.5 -25t26.5 -62q0 -38 -27 -65t-64 -27h-1993q-37 0 -64.5 27.5t-27.5 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2210" d="M0 528q0 -213 148.5 -366t362.5 -163q18 0 18 18v143q0 18 -18 18q-137 7 -233 109t-96 241q0 132 90 230t223 114l57 3q21 0 21 20l6 57q17 173 146.5 289.5t304.5 116.5q174 0 304 -116.5t148 -289.5l8 -62q0 -18 19 -18h172q142 0 246 -102t104 -242 q0 -139 -96.5 -241t-232.5 -109q-21 0 -21 -18v-143q0 -18 21 -18q139 4 256 76t184.5 192.5t67.5 260.5q0 143 -71 263.5t-193 190t-265 69.5h-34q-52 214 -224.5 350t-392.5 136q-225 0 -400 -139.5t-224 -357.5q-177 -41 -291.5 -184.5t-114.5 -327.5zM581 -240 q15 -34 49 -49q32 -16 66.5 -2t47.5 48q16 35 2.5 68.5t-48.5 46.5q-32 17 -65.5 3t-49.5 -50q-15 -26 -2 -65zM648 61q0 -25 16.5 -48.5t49.5 -34.5q31 -18 66 -1.5t47 63.5l96 361q10 40 -8.5 71.5t-56.5 38.5q-13 3 -26 3q-26 0 -50.5 -16t-34.5 -47l-94 -362 q-5 -23 -5 -28zM847 -535q0 -19 6 -31q14 -35 48 -48q15 -8 35 -8q10 0 32 6q35 13 50.5 48t-0.5 70t-47.5 49t-66.5 0q-30 -13 -43.5 -38t-13.5 -48zM925 -257q0 -59 67 -78q18 -4 26 -4q24 0 41 8q33 13 45 61l178 671q10 38 -6.5 69t-52.5 41q-13 3 -29 3 q-26 0 -51.5 -16t-31.5 -47l-182 -676q-4 -22 -4 -32zM1291 -208q0 -19 8 -34q13 -31 47 -47q18 -7 37 -7q10 0 32 6q34 13 49 47q12 35 -1 67t-45 48q-36 17 -69.5 3t-49.5 -50q-8 -15 -8 -33zM1368 66q0 -23 17 -48t48 -35q25 -5 29 -5q15 0 39 11q32 15 43 56l96 356 q3 27 3 28q0 25 -16.5 49t-48.5 33q-14 3 -28 3q-26 0 -50 -15.5t-33 -47.5l-96 -358z" />
|
||||
<glyph unicode="" horiz-adv-x="1502" d="M0 -283h42l734 1086q15 29 -16 29h-303l319 581q14 29 -21 29h-406q-17 0 -31 -19l-296 -789q-4 -29 20 -29h293zM907 392h29l557 818q8 13 4 21t-18 8h-224l233 430q19 32 -19 32h-292q-21 0 -32 -20l-222 -585q-5 -14 1 -22t20 -8h218z" />
|
||||
<glyph unicode="" horiz-adv-x="2209" d="M0 522q0 -211 149 -364t361 -160q19 0 19 18v142q0 19 -19 19q-135 7 -232 108.5t-97 236.5q0 134 90.5 233.5t223.5 110.5l56 8q20 0 20 19l8 53q16 175 145.5 293t305.5 118q173 0 303 -117t149 -289l7 -62q0 -19 20 -19h171q144 0 247 -103t103 -245 q0 -135 -96.5 -236.5t-232.5 -108.5q-21 0 -21 -19v-142q0 -18 21 -18q213 7 360.5 159.5t147.5 364.5q0 143 -71 264.5t-193 192t-265 70.5h-33q-53 214 -225 350.5t-392 136.5q-225 0 -400 -140t-224 -357q-180 -46 -293 -188.5t-113 -328.5zM577 -227q0 -27 17.5 -54 t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8t-42.5 -57l-15 -63q-2 -6 -2 -20zM658 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63zM723 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5 t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q0 -3 -2 -12.5t-2 -15.5zM847 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-15 -63q-3 -14 -3 -24zM930 -250q0 -35 27 -62 q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM997 -8q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1291 -237q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2 q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -4 -2 -13t-2 -14zM1370 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1435 325q0 -27 17.5 -51.5t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10 q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97q0 -4 -2 -12.5t-2 -12.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2213" d="M0 525q0 -179 104.5 -318.5t272.5 -190.5q14 -3 26 8l124 153q-142 0 -243 102t-101 246q0 135 90 234.5t224 110.5l56 7q17 0 17 14l8 59q20 176 148.5 291.5t303.5 115.5q176 0 306.5 -116.5t146.5 -290.5l8 -62q4 -18 23 -18h173q144 0 245 -101t101 -244 q0 -133 -90 -232.5t-221 -115.5q-19 0 -52 -6q-31 -3 -44 -24l-252 -298q-23 -29 -17.5 -67t33.5 -61q17 -20 60 -20q42 0 65 37l226 260q199 20 336 172t137 355q0 108 -41.5 206t-112 168.5t-168 112.5t-205.5 42h-34q-53 212 -226.5 347.5t-396.5 135.5 q-149 0 -280.5 -63.5t-221.5 -177t-121 -258.5q-180 -40 -293.5 -183.5t-113.5 -329.5zM361 -330q0 -10 6 -32q14 -34 47 -47q35 -16 71 -2t49 48q16 35 2 69t-49 46q-36 17 -69 3t-49 -50q-8 -17 -8 -35zM558 -70v-11q3 -36 32 -60q36 -20 66 -20q36 0 65 35l248 295 q23 28 21 70q-4 34 -29.5 57t-55.5 23q-9 0 -15 -1q-37 -7 -60 -35l-252 -296q-20 -23 -20 -57zM640 -573q0 -19 8 -34q13 -34 47 -50q17 -8 35 -8q20 0 33 8q37 15 50 44q16 35 2.5 71t-47.5 49q-35 16 -71.5 2t-48.5 -48q-8 -15 -8 -34zM818 -323v-12q4 -35 33 -58.5 t59 -23.5q36 0 67 35l464 559q18 20 18 55v13q-4 36 -29 57t-56 21h-14q-37 -2 -59 -33l-464 -555q-19 -28 -19 -58zM1193 -446q0 -14 6 -32q14 -35 49 -50q22 -6 33 -6q23 0 36 8q36 14 49 45q16 27 2 71q-13 33 -47 47l-38 10q-14 -3 -34 -8q-35 -13 -48 -47 q-8 -19 -8 -38z" />
|
||||
<glyph unicode="" horiz-adv-x="2211" d="M0 527q0 184 115 327.5t291 184.5q50 218 225 358t400 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -69.5t193 -190t71 -263.5q0 -140 -67.5 -260.5t-184.5 -192.5t-256 -76q-21 0 -21 18v142q0 19 21 19q136 7 232.5 109t96.5 241t-104 241.5t-246 102.5h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 289.5t-303.5 116.5q-175 0 -304.5 -116.5t-145.5 -289.5l-8 -57q0 -20 -21 -20l-56 -3q-133 -16 -223.5 -114t-90.5 -230q0 -139 96 -241t233 -109q18 0 18 -19v-142q0 -18 -18 -18q-214 10 -362.5 163t-148.5 366zM571 -186q0 7 4 21 l174 615q10 31 34.5 47t49.5 16q11 0 26 -3q38 -7 57.5 -39t8.5 -71l-174 -611q-20 -68 -88 -68q-6 0 -12 2q-9 3 -11 3q-35 10 -52 35.5t-17 52.5zM851 -486l260 936q7 31 32 47t52 16q14 0 29 -3q35 -10 52 -41.5t7 -68.5l-259 -937q-6 -27 -31 -46t-54 -19q-15 0 -27 5 q-32 8 -55 42q-18 28 -6 69zM1291 -189q0 6 4 24l174 615q9 31 32.5 47t49.5 16q13 0 28 -3q33 -9 49.5 -33t16.5 -50q0 -5 -2 -14.5t-2 -12.5l-174 -611q-6 -31 -30 -49.5t-54 -18.5l-26 5q-32 9 -49 34.5t-17 50.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2218" d="M0 525q0 185 116 329t297 185q47 220 221 361.5t400 141.5q223 0 396.5 -136t226.5 -352h36q144 0 265 -70.5t190.5 -192.5t69.5 -266q0 -214 -146.5 -367t-359.5 -160q-19 0 -19 18v143q0 18 19 18q135 11 231 111.5t96 236.5q0 143 -102 246t-244 103h-174 q-19 0 -23 19l-8 61q-11 114 -74.5 206.5t-163.5 145t-216 52.5q-176 0 -305.5 -116.5t-146.5 -290.5l-7 -58q0 -15 -17 -15l-56 -8q-135 -11 -225.5 -110t-90.5 -235q0 -139 94.5 -239.5t231.5 -108.5q19 0 19 -18v-143q0 -18 -19 -18q-105 5 -200 48t-163.5 113 t-108.5 165.5t-40 200.5zM578 -197q0 5 2 14t2 12l29 110q11 36 42.5 54.5t68.5 7.5q36 -11 55 -42.5t8 -68.5l-26 -108q-21 -70 -81 -70q-4 0 -9.5 0.5t-12 1.5t-10.5 1q-34 10 -51 36.5t-17 51.5zM719 317q0 4 1.5 12t1.5 10l32 112q10 31 34 47.5t50 16.5q4 0 8.5 -0.5 t10 -1.5t8.5 -1q36 -11 54.5 -42.5t7.5 -68.5l-26 -107q-11 -44 -43 -62.5t-69 -2.5q-35 10 -52.5 36t-17.5 52zM850 -531q0 5 2 13.5t2 12.5l31 106q10 38 42.5 57.5t69.5 8.5q36 -11 54 -43.5t7 -69.5l-27 -111q-17 -65 -85 -65q-8 0 -26 4q-35 6 -52.5 32.5t-17.5 54.5z M993 -22q0 9 4 27l29 110q11 36 43.5 54.5t69.5 7.5q36 -10 54 -41.5t6 -69.5l-26 -106q-20 -72 -77 -72q-7 0 -33 6q-35 7 -52.5 31.5t-17.5 52.5zM1294 -201q0 11 3 26l30 106q11 38 43.5 57.5t67.5 9.5q37 -11 56.5 -43.5t9.5 -67.5l-31 -113q-16 -65 -84 -65 q-15 0 -28 3q-32 6 -49 32.5t-18 54.5zM1441 307q0 5 5 28l32 110q6 34 31 50.5t52 14.5q7 1 26 -3q35 -8 55 -41q19 -27 8 -69l-26 -110q-21 -69 -81 -69q-10 0 -36 6q-33 10 -49.5 33.5t-16.5 49.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2211" d="M0 523q0 185 113.5 328.5t292.5 187.5q50 218 224.5 358t400.5 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -70.5t193 -192t71 -264.5q0 -212 -148 -365t-360 -160q-21 0 -21 18v142q0 19 21 19q136 7 232.5 108.5t96.5 237.5q0 142 -103 245t-247 103h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 290t-303.5 117q-176 0 -305.5 -118t-146.5 -293l-6 -53q0 -20 -21 -20l-56 -7q-133 -11 -223.5 -110.5t-90.5 -233.5q0 -136 96.5 -237.5t232.5 -108.5q18 0 18 -19v-142q0 -18 -18 -18q-214 7 -362.5 160t-148.5 365zM679 89 q0 36 25.5 62t62.5 26t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5t-62.5 26.5t-25.5 64.5zM679 -298q0 38 26 64q25 24 62 24t62.5 -25t25.5 -63t-25.5 -63t-62.5 -25t-62.5 25t-25.5 63zM1019 -117q0 37 27 66q26 26 61 26q37 0 64.5 -27.5t27.5 -64.5t-27 -63.5 t-65 -26.5q-36 0 -62 26.5t-26 63.5zM1019 269q0 37 27 64q28 26 61 26q38 0 65 -26.5t27 -63.5t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1019 -507q0 36 27 65q26 26 61 26q38 0 65 -27t27 -64t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1363 89q0 35 27 61.5 t64 26.5t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5q-38 0 -64.5 27t-26.5 64zM1363 -298q0 35 27 64q26 24 64 24t63 -25t25 -63t-25 -63t-63 -25t-64.5 25.5t-26.5 62.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2210" d="M0 527q0 184 115 327.5t291 184.5q49 218 224 357.5t401 139.5q220 0 392 -136t225 -350h33q143 0 265 -69.5t193 -190t71 -263.5q0 -214 -147.5 -368t-360.5 -161q-21 0 -21 18v142q0 19 21 19q137 7 233 109t96 241t-104 241.5t-246 102.5h-171q-20 0 -20 18l-7 62 q-17 172 -147.5 289t-304.5 117q-175 0 -305 -116.5t-147 -289.5l-6 -58q0 -19 -21 -19l-56 -3q-131 -6 -222.5 -107t-91.5 -237q0 -139 96 -241t233 -109q18 0 18 -19v-142q0 -18 -18 -18q-214 10 -362.5 163t-148.5 366zM632 433q0 39 39 105.5t73 107.5q34 38 41 45 l38 -43q41 -44 76.5 -108.5t35.5 -106.5q0 -63 -43 -105t-107 -42q-63 0 -108 43t-45 104zM950 8q0 44 25.5 102t62.5 109q29 41 71 89.5t64 69.5q11 10 26 25l26 -25q60 -53 136 -156q38 -53 63 -111t25 -103q0 -103 -72.5 -175.5t-177.5 -72.5q-103 0 -176 72t-73 176z M1107 718q0 67 104 171l26 -27q28 -34 51 -75.5t23 -68.5q0 -41 -29.5 -70.5t-70.5 -29.5q-43 0 -73.5 29.5t-30.5 70.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2212" d="M0 527q0 -177 105.5 -317t273.5 -191l-69 -179q-5 -23 15 -23h227l-111 -403h30l423 557q6 7 2 14.5t-15 7.5h-232l264 495q10 22 -15 22h-314q-15 0 -24 -15l-115 -306q-114 29 -188.5 124t-74.5 214q0 133 90 230.5t224 113.5l56 8q21 0 21 18l8 55q16 173 145.5 290 t304.5 117q174 0 304.5 -117t149.5 -290l6 -62q0 -19 20 -19h172q145 0 247.5 -101t102.5 -243q0 -136 -95 -235.5t-234 -109.5q-21 0 -21 -20v-146q0 -18 21 -18q104 3 198.5 47t162.5 114.5t108 167t40 200.5q0 144 -71.5 265.5t-193.5 192t-265 70.5h-34 q-53 213 -225 348t-393 135q-226 0 -401 -140t-224 -358q-176 -41 -291 -184.5t-115 -328.5zM870 -525q0 -25 16.5 -49.5t49.5 -34.5q22 -5 27 -5q14 0 40 11q34 15 45 56l30 112q10 35 -8.5 67t-56.5 43q-35 10 -67.5 -8.5t-43.5 -56.5l-29 -107q-3 -27 -3 -28zM1013 -16 q0 -23 16.5 -46.5t48.5 -35.5q36 -12 68 5t43 56l32 111q10 35 -9 67.5t-57 43.5q-36 10 -69 -8.5t-44 -55.5l-26 -108q-3 -27 -3 -29zM1314 -192q0 -27 17.5 -54t50.5 -37q4 0 12.5 -2t12.5 -2q21 0 40 8q30 11 44 61l27 108q11 37 -6.5 70.5t-53.5 44.5q-40 10 -72.5 -9 t-39.5 -57l-29 -110q-3 -9 -3 -21zM1459 319q-1 -25 16 -50t52 -40q12 -6 28 -6q17 0 36 9q33 16 47 61l31 110q3 21 3 23q0 27 -17.5 52.5t-52.5 35.5q-4 0 -12 2t-12 2q-27 0 -52 -16.5t-35 -51.5l-29 -108q-3 -12 -3 -23z" />
|
||||
<glyph unicode="" horiz-adv-x="2213" d="M0 527q0 -177 106 -317t275 -191l-70 -179q-5 -23 15 -23h227l-105 -459h30l418 613q6 7 1.5 14.5t-15.5 7.5h-232l264 495q11 23 -15 23h-314q-15 0 -25 -16l-114 -306q-114 29 -189 124t-75 214q0 133 90.5 231t224.5 114l56 7q21 0 21 19l7 54q17 173 146.5 290 t304.5 117q174 0 304.5 -117t149.5 -290l7 -62q0 -18 19 -18h171q145 0 248 -101.5t103 -243.5q0 -136 -95 -235.5t-235 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 361.5 161t148.5 368q0 144 -71 265.5t-193.5 192t-266.5 70.5h-33q-53 213 -225.5 348t-392.5 135 q-226 0 -401 -140t-224 -358q-177 -41 -292 -184.5t-115 -328.5zM869 -509q0 -63 62 -82q2 0 12 -1.5t15 -1.5q27 0 52.5 15.5t34.5 51.5l240 927q10 38 -7 69t-53 42q-27 3 -28 3q-26 0 -50.5 -16t-33.5 -48l-241 -930q-3 -14 -3 -29zM1312 -182q0 -21 11 -40 q22 -35 54 -47q17 -5 32 -5t34 8q33 14 45 61l154 605q5 23 5 29q0 24 -17 48t-49 34q-27 3 -28 3q-27 0 -50 -15.5t-32 -48.5l-156 -608q0 -3 -1.5 -11.5t-1.5 -12.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2209" d="M0 678q0 36 25 60t61 24h1289q35 0 58 -23.5t23 -60.5q0 -35 -23 -58t-58 -23h-1289q-36 0 -61 23t-25 58zM258 987q0 35 25 59q24 24 60 24h1290q34 0 57.5 -24t23.5 -59t-23.5 -59.5t-57.5 -24.5h-1290q-35 0 -60 24.5t-25 59.5zM430 375q0 34 26 58q23 23 58 23h1291 q36 0 60 -23t24 -58t-24.5 -60t-59.5 -25h-1291q-35 0 -59.5 25t-24.5 60zM1559 678q0 37 23.5 60.5t60.5 23.5h482q37 0 60.5 -24t23.5 -60q0 -35 -24 -58t-60 -23h-482q-37 0 -60.5 23t-23.5 58z" />
|
||||
<glyph unicode="" horiz-adv-x="2564" d="M0 89q0 -37 29 -64q27 -27 65 -27h612q42 0 73.5 -30.5t31.5 -72.5q0 -43 -31.5 -74t-73.5 -31q-41 0 -73 32q-29 26 -65 26q-38 0 -64 -26t-26 -64q0 -36 26 -64q84 -84 202 -84t201.5 83t83.5 202q0 118 -83.5 202t-201.5 84h-612q-38 0 -66 -27.5t-28 -64.5zM0 411 q0 -35 29 -62q28 -26 65 -26h1157q118 0 201.5 83t83.5 201t-83.5 200.5t-201.5 82.5q-122 0 -202 -81q-24 -25 -24 -65t24.5 -64t62.5 -24t66 24q30 30 73 30q41 0 72 -30t31 -73q0 -42 -31 -73t-72 -31h-1157q-38 0 -66 -27.5t-28 -64.5zM269 662q0 -14 17 -14h153 q13 0 23 16q36 87 111.5 143.5t168.5 63.5l56 8q20 0 20 18l8 55q17 173 147 289.5t305 116.5t304.5 -116t147.5 -290l7 -62q0 -19 20 -19h173q145 0 247 -101t102 -243t-102.5 -244t-246.5 -102h-737q-18 0 -18 -19v-146q0 -18 18 -18h737q143 0 264.5 71t192.5 193t71 265 q0 141 -73 264q117 113 161 275l16 72q3 3 3 8q0 7 -15 17l-64 22q-134 41 -204.5 145t-70.5 215q0 39 10 84l14 66q4 16 -14 24l-85 26q-70 17 -133 17q-59 0 -120 -14t-125.5 -43.5t-125.5 -85t-107 -130.5q-113 48 -247 48q-226 0 -399.5 -140t-220.5 -357 q-137 -32 -242 -131t-145 -235v-3q-2 -3 -2 -9zM1680 1397q50 88 138 134.5t182 46.5q22 0 33 -1q-2 -14 -2 -38q0 -151 84 -289t232 -207q-25 -60 -80 -110q-142 122 -337 122h-35q-43 201 -215 342z" />
|
||||
<glyph unicode="" horiz-adv-x="2699" d="M0 86q0 -38 27 -63t67 -25h1003q38 0 63 25t25 63q0 40 -25 65.5t-63 25.5h-1003q-40 0 -67 -26t-27 -65zM281 411q0 -38 28 -64q26 -27 64 -27h1005q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1005q-38 0 -65 -25.5t-27 -62.5zM392 661q0 -15 19 -15h152 q14 0 24 15q36 87 111 144t168 64l59 8q19 0 19 18l7 55q17 174 147.5 290.5t306.5 116.5q175 0 303 -115t150 -289l8 -62q0 -18 19 -18h172q145 0 247 -102t102 -246q0 -141 -103.5 -244.5t-245.5 -103.5h-737q-18 0 -18 -18v-143q0 -18 18 -18h737q144 0 266 70t193 191.5 t71 265.5t-69 264q115 103 161 275l19 73q1 2 1 7q0 13 -16 17l-66 23q-70 21 -124 61t-85.5 89.5t-47 100.5t-15.5 101q0 38 12 93l14 65q7 15 -14 24l-88 26q-70 17 -133 17q-60 0 -121 -14t-126 -43.5t-125.5 -85t-105.5 -130.5q-124 51 -253 51q-226 0 -400.5 -140.5 t-221.5 -360.5q-139 -32 -243.5 -130.5t-145.5 -235.5v-3q-2 -2 -2 -8zM469 -245q0 -39 27 -64q26 -27 64 -27h1006q38 0 65 27t27 64t-27 62.5t-65 25.5h-1006q-38 0 -64.5 -25.5t-26.5 -62.5zM1811 1394q55 88 143.5 136.5t181.5 46.5q18 0 27 -1v-26q0 -156 84.5 -297.5 t231.5 -211.5q-28 -64 -81 -114q-141 126 -341 126h-34q-40 193 -212 341z" />
|
||||
<glyph unicode="" horiz-adv-x="2325" d="M0 527q0 -213 148.5 -366t362.5 -163q19 0 19 18v143q0 18 -19 18q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 3q21 0 21 19l8 58q17 173 146.5 290t304.5 117q173 0 304 -117t149 -290l8 -62q0 -18 18 -18h172q142 0 246 -102.5t104 -242.5q0 -139 -96 -241 t-233 -109q-21 0 -21 -18v-143q0 -18 21 -18q213 7 361 161t148 368q0 137 -69 257q126 119 165 279l14 73q3 2 3 7q0 12 -17 17l-60 18q-91 27 -155.5 90.5t-91.5 133t-27 140.5q-1 39 8 84l15 62q5 14 -15 23l-85 27q-67 20 -140 20q-56 0 -115.5 -13.5t-124.5 -43 t-126.5 -85t-106.5 -130.5q-120 52 -253 52q-226 0 -401 -140t-224 -358q-177 -41 -292 -184.5t-115 -328.5zM584 -223q14 -34 49 -48q31 -16 66 -2.5t48 47.5q16 35 2.5 69t-47.5 47q-32 16 -66 2t-50 -49q-16 -25 -2 -66zM651 79q0 -24 17 -48t49 -34q41 -16 71.5 0.5 t42.5 60.5l94 342q11 40 -8.5 71.5t-57.5 39.5q-35 11 -67 -7t-43 -54l-94 -343q0 -3 -2 -13t-2 -15zM850 -518q0 -20 6 -31q14 -35 48 -48q15 -8 35 -8q10 0 32 6q36 13 51.5 48t-0.5 70t-47.5 49t-65.5 0q-31 -13 -45 -38t-14 -48zM929 -235q0 -61 68 -83q15 -5 25 -5 q18 0 37 9q37 13 50 61l176 653q10 38 -7.5 69t-53.5 42q-37 11 -69.5 -7t-42.5 -54l-179 -658q-4 -18 -4 -27zM1296 -191q0 -20 7 -33q13 -32 47 -47q19 -8 37 -8q10 0 32 6q35 14 48 47q13 35 0.5 67.5t-44.5 48.5q-35 16 -69.5 2.5t-50.5 -49.5q-7 -13 -7 -34zM1373 82 q0 -26 16.5 -49t48.5 -33q27 -3 29 -3q65 0 82 65l93 338q10 38 -7.5 69t-53.5 42q-37 11 -68.5 -7t-42.5 -54l-94 -339q-3 -14 -3 -29zM1442 1389q50 92 138.5 140t187.5 47q18 0 27 -2v-33q0 -156 83.5 -293.5t231.5 -207.5q-31 -70 -80 -114q-141 125 -347 125h-34 q-41 200 -207 338z" />
|
||||
<glyph unicode="" horiz-adv-x="2320" d="M0 527q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l8 55q17 173 146 289.5t304 116.5q174 0 304 -116t148 -290l8 -62q0 -19 19 -19h172q145 0 247.5 -101t102.5 -243 q0 -136 -95 -235.5t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 143 -73 264q128 116 165 275l16 77q1 1 1 7q0 12 -17 17l-62 18q-91 26 -155 88t-91 131.5t-27 140.5q0 39 10 84l15 66q5 15 -15 24l-84 26q-70 17 -133 17q-58 0 -119 -14 t-127 -43.5t-128 -85t-107 -130.5q-113 48 -249 48q-226 0 -400.5 -139.5t-224.5 -357.5q-176 -42 -291 -185.5t-115 -327.5zM818 31q-8 -23 15 -23h230l-140 -442h32l445 596q6 7 3 14.5t-14 7.5h-235l246 449q11 23 -15 23h-314q-13 0 -23 -15zM1437 1391q53 91 141.5 139 t183.5 48q20 0 29 -2v-33q0 -154 83 -291t231 -209q-25 -59 -80 -114q-147 126 -343 126h-34q-45 200 -211 336z" />
|
||||
<glyph unicode="" horiz-adv-x="2332" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 110t-97 238q0 136 90.5 235.5t224.5 110.5l57 7q21 0 21 19l7 54q17 176 146.5 293.5t305.5 117.5q174 0 305.5 -117t149.5 -290l8 -61q0 -20 18 -20h173q145 0 248.5 -103t103.5 -246 q0 -88 -44 -166.5t-120.5 -127.5t-166.5 -54q-21 0 -21 -18v-143q0 -18 21 -18q141 4 258 76t184.5 191.5t67.5 259.5q0 141 -73 268q133 119 169 280l15 73q3 3 3 8q0 9 -18 17l-59 19q-92 27 -157 90.5t-92.5 133t-27.5 137.5q-3 34 10 88l14 62q7 16 -14 25l-85 26 q-65 18 -138 18q-58 0 -119.5 -14t-127 -44t-127.5 -86.5t-107 -131.5q-130 49 -251 49q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -46 -293.5 -189t-113.5 -329zM577 -227q0 -27 17.5 -54t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8 t-42.5 -57l-15 -63q-2 -6 -2 -20zM658 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63zM723 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98 q0 -3 -2 -12.5t-2 -15.5zM847 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-15 -63q-3 -14 -3 -24zM930 -250q0 -35 27 -62q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM997 -8 q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1291 -237q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63 q0 -4 -2 -13t-2 -14zM1370 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1435 325q0 -27 17.5 -51.5t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97 q0 -4 -2 -12.5t-2 -12.5zM1442 1397q51 92 140 142.5t184 49.5q15 0 32 -3v-34q-2 -157 82.5 -294.5t236.5 -206.5q-31 -65 -85 -118q-148 122 -344 122h-33q-50 208 -213 342z" />
|
||||
<glyph unicode="" horiz-adv-x="2333" d="M0 525q0 -179 106.5 -320.5t274.5 -188.5q14 -3 26 8l120 150q-140 0 -242.5 104t-102.5 247q0 134 90 231.5t225 109.5l53 7q20 0 20 20l8 57q20 174 150 291t305 117q174 0 305 -117.5t150 -290.5l7 -62q0 -18 19 -18h173q141 0 243.5 -102t102.5 -243 q0 -136 -90 -236.5t-221 -111.5q-72 -9 -92 -30l-249 -310q-25 -28 -20 -67q4 -38 33.5 -63t60.5 -25q36 0 68 40l218 276q99 10 187.5 55.5t151.5 115.5t100 163t37 193q0 139 -73 260q130 118 169 280v10l21 82l-81 28q-92 27 -156.5 89t-92 131t-27.5 140q0 41 9 85 l20 83l-89 25q-1 0 -3 1.5t-4 2.5t-4.5 2t-3.5 1q-70 17 -133 17q-61 -1 -122.5 -15t-128 -44t-128.5 -86t-107 -132q-120 52 -250 52q-226 0 -401 -140t-225 -358q-181 -44 -294 -186.5t-113 -327.5zM395 -327q0 -21 7 -33q14 -35 46 -49q35 -16 71 -3t49 47 q16 35 1.5 71.5t-48.5 48.5q-35 16 -70.5 2.5t-48.5 -48.5q-7 -15 -7 -36zM592 -66v-12q3 -36 35 -59q21 -24 58 -23t70 34l248 311q22 28 18 66.5t-32 61.5t-67 19t-61 -36l-248 -305q-21 -24 -21 -57zM653 -622q14 -34 49 -48q17 -8 35 -8q10 0 32 6q34 14 47 47 q13 35 1 69t-47 51q-35 13 -67 -0.5t-48 -46.5q-17 -30 -2 -70zM823 -338v-9q4 -36 34 -61.5t60 -25.5q35 0 64 36l460 572q23 27 20 66t-31 62q-32 23 -70.5 19.5t-60.5 -31.5l-456 -572q-20 -25 -20 -56zM1197 -456q0 -18 8 -35q13 -36 50 -50q36 -14 65 -2q35 14 49 49 q16 35 3.5 68.5t-47.5 49.5q-35 13 -69.5 0t-50.5 -45q-8 -19 -8 -35zM1441 1391q50 92 138.5 140.5t187.5 46.5q19 0 28 -1v-32q0 -155 85.5 -293.5t233.5 -209.5q-40 -75 -84 -119q-142 126 -343 126h-34q-48 205 -212 342z" />
|
||||
<glyph unicode="" horiz-adv-x="2331" d="M0 528q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231.5t224.5 114.5l57 4q21 0 21 18l7 58q17 173 147 290.5t305 117.5q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q143 0 247.5 -102.5t104.5 -243.5 q0 -139 -96.5 -241t-233.5 -110q-22 0 -22 -18v-143q0 -18 22 -18q213 7 361 161.5t148 368.5q0 141 -73 262q129 117 169 279l15 77q2 1 2 7q0 12 -17 17l-60 19q-91 26 -156 88.5t-92.5 131.5t-27.5 137q-3 36 9 88l15 65q7 16 -15 26l-84 26q-72 16 -135 16 q-60 0 -122 -14t-128 -43.5t-128 -85t-107 -130.5q-132 48 -249 48q-226 0 -401.5 -140.5t-225.5 -359.5q-177 -41 -292 -185t-115 -329zM593 -201q0 -27 17.5 -52.5t52.5 -35.5q37 -11 68.5 4.5t42.5 59.5l153 626q10 40 -9 72t-56 39q-35 11 -67.5 -7t-43.5 -54l-154 -629 q0 -2 -2 -10t-2 -13zM871 -529q0 -25 16.5 -49t47.5 -33q18 -4 26 -4q70 0 87 63l240 953q10 39 -7.5 69.5t-53.5 41.5q-37 11 -70.5 -7.5t-41.5 -53.5l-241 -952q0 -2 -1.5 -12.5t-1.5 -15.5zM1315 -210q0 -57 67 -79q22 -6 32 -6q18 0 37 8q33 13 42 62l153 626 q10 38 -8 69t-54 42q-37 11 -70 -7t-41 -54l-153 -629q-5 -28 -5 -32zM1441 1395q51 93 139.5 141.5t187.5 46.5q19 0 29 -1v-32q-2 -155 82 -293t236 -210q-36 -73 -84 -114q-147 121 -344 121h-33q-44 203 -213 341z" />
|
||||
<glyph unicode="" horiz-adv-x="2331" d="M0 527q0 -213 148.5 -366t362.5 -163q18 0 18 18v146q0 19 -18 19q-139 11 -234 110.5t-95 235.5q0 132 90 230t224 114l56 8q21 0 21 18l8 55q17 173 146 289.5t304 116.5q174 0 304 -116t148 -290l8 -62q0 -19 19 -19h172q144 0 247 -101t103 -243q0 -136 -95 -235.5 t-234 -110.5q-21 0 -21 -19v-146q0 -18 21 -18q213 7 360.5 161t147.5 368q0 139 -69 259q130 117 169 279v14l20 84l-81 22q-130 39 -202 144.5t-72 216.5q0 42 9 83l21 85l-91 27l-14 4q-75 15 -133 15q-60 0 -122 -14t-128.5 -44t-128 -85.5t-106.5 -131.5 q-119 52 -252 52q-226 0 -399.5 -140t-220.5 -358q-180 -41 -295.5 -184t-115.5 -328zM576 -195q0 -24 16 -47.5t48 -35.5q35 -12 68 5.5t44 54.5l30 113q11 33 -7.5 66t-54.5 44q-37 10 -69.5 -9t-44.5 -57l-25 -106q-5 -25 -5 -28zM714 310q0 -18 11 -38q12 -28 57 -41 q39 -10 70 6.5t43 55.5l30 110q11 37 -7.5 68.5t-54.5 41.5q-39 10 -71 -7.5t-43 -55.5l-29 -108q-6 -22 -6 -32zM848 -528q0 -27 16.5 -52.5t48.5 -35.5q17 -5 24 -5q14 0 40 11q32 13 46 59l32 112q11 34 -7.5 67t-54.5 44q-39 10 -71.5 -8.5t-43.5 -56.5l-27 -108 q-3 -13 -3 -27zM990 -19q0 -24 16 -47.5t49 -35.5q36 -11 68 6t43 56l29 111q11 34 -6.5 66.5t-52.5 43.5q-39 10 -72.5 -9t-44.5 -57l-26 -107zM1289 -207q0 -60 68 -80q14 -3 26 -3q24 0 39 7q34 13 47 61l29 109q10 40 -8.5 71.5t-56.5 39.5q-37 11 -68.5 -7.5 t-42.5 -54.5l-29 -111q0 -4 -2 -15.5t-2 -16.5zM1437 307q0 -25 16.5 -49t49.5 -34q23 -5 25 -5q14 0 40 11q33 13 47 59l30 111q10 35 -9 67t-57 43q-35 11 -67 -7.5t-43 -55.5l-28 -113q-4 -18 -4 -27zM1441 1391q51 90 141.5 140t193.5 50h22q-1 -14 -1 -40 q0 -152 83.5 -289t231.5 -209q-35 -69 -83 -117q-149 129 -347 129h-34q-40 189 -207 336z" />
|
||||
<glyph unicode="" horiz-adv-x="2331" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 109.5t-97 238.5t90.5 235t224.5 110l57 8q21 0 21 18l7 55q17 175 146.5 293t305.5 118q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q145 0 248.5 -103t103.5 -246q0 -136 -97 -238.5 t-233 -109.5q-22 0 -22 -18v-143q0 -18 22 -18q140 4 257 76t184.5 192t67.5 259q0 146 -69 265q118 106 162 275l18 77q2 2 2 8q0 12 -17 17l-65 18q-70 21 -124.5 61t-86 89.5t-47 101t-15.5 101.5q0 43 11 92l12 66q4 15 -15 24l-85 26q-70 17 -133 17q-59 0 -120 -14 t-126 -44t-126 -85.5t-106 -130.5q-129 53 -254 53q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -45 -293.5 -188t-113.5 -329zM681 89q0 -38 25.5 -64.5t62.5 -26.5q38 0 63.5 26.5t25.5 64.5q0 36 -25.5 62t-63.5 26q-37 0 -62.5 -26t-25.5 -62zM681 -299q0 -36 26 -62 t62 -26q38 0 63.5 25t25.5 63t-25.5 63t-63.5 25t-63 -25t-25 -63zM1023 -118q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5 q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299 q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1441 1395q50 87 138.5 134.5t182.5 49.5q24 0 35 -2v-33q0 -155 83.5 -292.5t231.5 -209.5q-25 -58 -81 -114q-142 126 -344 126h-33q-44 197 -213 341z" />
|
||||
<glyph unicode="" horiz-adv-x="2323" d="M0 529q0 -213 148.5 -366t362.5 -164q19 0 19 19v142q0 19 -19 19q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 4q21 0 21 19l8 58q17 173 146.5 289.5t304.5 116.5q174 0 305 -117t149 -289l7 -61q0 -20 19 -20h173q142 0 245.5 -102.5t103.5 -242.5 q0 -139 -96 -241t-233 -109q-20 0 -20 -19v-142q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 260.5q0 139 -73 261q125 119 164 275l15 78q2 1 2 7q0 12 -17 17l-61 18q-91 26 -156 87.5t-92.5 129.5t-27.5 137q0 46 12 91l14 65q4 16 -14 25l-85 26q-72 16 -135 16 q-58 0 -119 -14t-126.5 -43t-127.5 -84t-107 -128q-130 49 -249 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -291.5 -185.5t-114.5 -328.5zM633 435q0 -61 44.5 -104t108.5 -43t107 42.5t43 104.5q0 41 -37 109t-69 105q-17 19 -44 46l-37 -44q-43 -47 -79.5 -110.5 t-36.5 -105.5zM952 10q0 -105 73 -177t176 -72q105 0 177.5 73t72.5 176q0 88 -85 213q-71 93 -137 159q-13 9 -28 24l-25 -24q-63 -58 -136 -158q-38 -53 -63 -111t-25 -103zM1109 721q0 -41 30.5 -70t74.5 -29q41 0 70 29t29 70q0 68 -99 173l-27 -29q-29 -32 -53.5 -74.5 t-24.5 -69.5zM1435 1395q56 91 143 137.5t183 46.5q19 0 29 -2v-32q0 -154 84 -292t233 -210q-25 -60 -80 -110q-148 122 -342 122h-35q-49 210 -215 340z" />
|
||||
<glyph unicode="" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM872 -523 q0 -25 16.5 -50t48.5 -35q25 -5 29 -5q15 0 39 11q33 16 45 56l30 112q10 35 -8.5 67.5t-56.5 43.5q-35 10 -67.5 -9t-43.5 -57l-29 -107zM1015 -16q0 -69 65 -80q22 -5 29 -5q60 0 82 67l32 109q10 35 -9 67.5t-57 43.5q-36 11 -68.5 -7.5t-43.5 -56.5l-27 -108 q-3 -14 -3 -30zM1314 -194q2 -27 19 -51.5t51 -36.5q26 -6 35 -6q55 0 76 72l26 109q11 37 -6.5 70t-53.5 44q-40 10 -72.5 -9t-39.5 -57l-31 -110q0 -4 -2 -12.5t-2 -12.5zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129 q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337zM1461 318q0 -69 69 -88q22 -4 32 -4q58 0 79 69l30 111q1 8 1 23q2 27 -15 52.5t-52 35.5q-2 0 -10.5 1.5t-13.5 1.5q-26 0 -51 -16.5t-35 -50.5l-31 -109q0 -1 -1.5 -11t-1.5 -15z" />
|
||||
<glyph unicode="" horiz-adv-x="2330" d="M0 531q0 -178 106 -317.5t275 -190.5l-70 -180q-4 -22 16 -22h226l-104 -374h31l417 527q6 8 1.5 15.5t-15.5 7.5h-232l264 494q11 23 -14 23h-316q-14 0 -24 -15l-114 -307q-115 29 -190 124.5t-75 214.5q0 133 90.5 231.5t224.5 114.5l56 8q21 0 21 18l8 55 q17 173 146.5 290t304.5 117q173 0 304.5 -117.5t150.5 -289.5l7 -63q0 -18 19 -18h173q145 0 248 -101.5t103 -244.5q0 -136 -96 -236t-235 -111q-20 0 -20 -18v-147q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 261.5q0 139 -70 261q127 121 166 280l15 77q2 2 2 8 q0 11 -17 16l-60 19q-91 26 -156 87.5t-92.5 131.5t-27.5 141q0 42 9 85l15 65q7 16 -15 25q-34 14 -96.5 28t-122.5 14q-58 0 -119 -14t-126.5 -43.5t-127.5 -85t-107 -130.5q-132 48 -254 48q-226 0 -401 -140t-225 -358q-177 -42 -292 -186t-115 -329zM864 -517 q0 -26 15.5 -49.5t47.5 -32.5q17 -3 32 -3q65 0 81 67l247 938q10 38 -7.5 69.5t-53.5 41.5q-37 11 -69.5 -6.5t-42.5 -52.5l-247 -943q-3 -14 -3 -29zM1309 -195q0 -26 15.5 -49t49.5 -33q5 0 16.5 -1.5t17.5 -1.5q61 0 77 67l160 616q10 39 -8 70t-54 41q-37 11 -69 -6 t-42 -53l-160 -621q-3 -16 -3 -29zM1441 1398q53 91 141.5 139t187.5 48q20 0 29 -1v-34q0 -154 83.5 -291t231.5 -210q-29 -67 -84 -114q-147 126 -343 126h-34q-45 199 -212 337z" />
|
||||
<glyph unicode="" horiz-adv-x="1512" d="M0 786q0 153 60 293t161.5 241.5t242 162t293.5 60.5h122q25 -7 25 -30l5 -94q6 -203 146 -346t340 -151l88 -7q26 0 26 -25v-104q1 -205 -99.5 -379.5t-274 -276t-378.5 -101.5q-156 0 -296.5 60t-241 161.5t-160 241.5t-59.5 294zM195 786q0 -122 48.5 -230t127 -181 t180 -115.5t206.5 -42.5q93 0 187.5 36.5t175.5 102t139.5 167.5t75.5 223q-261 54 -418.5 223.5t-181.5 398.5q-151 -8 -276.5 -93t-194.5 -215.5t-69 -273.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2548" d="M0 93q0 -38 29 -64q29 -29 65 -29h627q42 0 73.5 -30t31.5 -73q0 -41 -32 -72.5t-73 -31.5q-40 0 -72 32q-30 28 -66 28q-37 0 -63 -27t-26 -65t26 -64q83 -83 201 -83q119 0 202 82.5t83 200.5q0 119 -83.5 203t-201.5 84h-627q-38 0 -66 -27t-28 -64zM0 414 q0 -36 29 -62q24 -26 65 -26h1172q118 0 201.5 83t83.5 201t-83.5 200.5t-201.5 82.5q-122 0 -202 -80q-24 -27 -24 -67q0 -38 24 -62.5t64 -24.5t65 24q30 30 73 30q41 0 72 -30t31 -73t-31 -74t-72 -31h-1172q-38 0 -66 -27t-28 -64zM283 664q0 -13 18 -13h153q13 0 23 15 q36 87 111.5 144t169.5 64l56 7q20 0 20 20l7 53q17 173 147 289.5t305 116.5t304 -115.5t148 -290.5l7 -61q0 -19 19 -19h174q144 0 246 -101t102 -243q0 -143 -102 -244.5t-246 -101.5h-737q-18 0 -18 -19v-146q0 -19 18 -19h737q143 0 264.5 71t192 193t70.5 266 q0 119 -45 216q122 160 122 355q0 114 -44.5 217.5t-119.5 178t-178.5 118.5t-216.5 44q-247 0 -414 -185q-125 65 -283 65q-226 0 -399.5 -139.5t-220.5 -357.5q-136 -32 -241 -131t-146 -233v-4q-3 -8 -3 -10zM1726 1371q115 109 264 109q156 0 267.5 -112t111.5 -267 q0 -97 -54 -197q-153 153 -370 153h-35q-37 171 -184 314z" />
|
||||
<glyph unicode="" horiz-adv-x="2681" d="M0 91q0 -40 29 -64q27 -28 65 -28h1018q37 0 62.5 27t25.5 65t-25.5 65t-62.5 27h-1018q-38 0 -66 -27.5t-28 -64.5zM281 414q0 -36 29 -62q26 -26 64 -26h1019q38 0 63 25t25 63t-25.5 64.5t-62.5 26.5h-1019q-38 0 -65.5 -27t-27.5 -64zM403 663q0 -12 21 -12h152 q14 0 24 15q36 87 112 144t169 64l58 8q19 0 19 19l8 54q17 173 147 290t306 117t306 -116t148 -291l8 -61q0 -20 18 -20h173q146 0 248.5 -101t102.5 -244q0 -142 -102.5 -244t-248.5 -102h-737q-18 0 -18 -18v-147q0 -19 18 -19h737q145 0 267.5 71t194 193t71.5 266 q0 113 -47 214q123 161 123 351q0 152 -75.5 281.5t-204.5 204.5t-282 75q-244 0 -410 -178q-136 65 -290 65q-149 0 -280.5 -63t-221 -177t-120.5 -259q-140 -32 -244.5 -128.5t-145.5 -231.5zM469 -239q0 -37 28 -62q26 -26 64 -26h1020q38 0 64.5 25t26.5 63t-27 65 t-64 27h-1020q-37 0 -64.5 -27.5t-27.5 -64.5zM1856 1369q108 104 263 104q158 0 269 -110.5t111 -268.5q0 -101 -52 -189q-157 153 -375 153h-34q-39 175 -182 311z" />
|
||||
<glyph unicode="" horiz-adv-x="2282" d="M0 529q0 -143 70 -264.5t191 -192.5t264 -71h1153q143 0 264.5 71t192.5 192.5t71 264.5q0 102 -45 213q121 148 121 352q0 152 -74 280.5t-202.5 203.5t-280.5 75q-239 0 -413 -186q-122 69 -287 69q-225 0 -397.5 -139t-221.5 -357q-179 -40 -292.5 -183t-113.5 -328z M182 529q0 133 89 230t224 113l73 3l7 77q22 173 150 289.5t300 116.5q175 0 305 -117t147 -289l11 -80h190q141 0 243 -101.5t102 -241.5q0 -144 -101.5 -247t-243.5 -103h-1153q-139 0 -241 104t-102 246zM1465 1365q110 106 260 106q158 0 268.5 -109.5t110.5 -267.5 q0 -99 -55 -196q-153 153 -371 153h-33q-44 178 -180 314z" />
|
||||
<glyph unicode="" horiz-adv-x="2294" d="M0 529q0 -213 148.5 -366t362.5 -164q19 0 19 19v142q0 19 -19 19q-137 7 -233 109t-96 241q0 133 90 231t224 114l56 8q21 0 21 19l8 54q17 173 146.5 289.5t304.5 116.5q174 0 305 -117t149 -289l7 -62q0 -19 19 -19h173q145 0 247 -101t102 -244q0 -139 -96 -241 t-233 -109q-20 0 -20 -19v-142q0 -19 20 -19q140 5 257.5 77t185 192.5t67.5 260.5q0 118 -46 214q126 153 126 354q0 151 -75.5 280t-204.5 204.5t-280 75.5q-249 0 -414 -185q-131 70 -289 70q-226 0 -401 -140.5t-225 -358.5q-176 -42 -291 -185.5t-115 -328.5zM573 -215 q14 -35 49 -49q32 -16 66.5 -2.5t47.5 47.5q14 35 1 69.5t-47 50.5q-32 13 -65.5 -1t-49.5 -46q-16 -27 -2 -69zM640 87q0 -25 16.5 -49t49.5 -33q36 -11 69 6t46 59l105 332q12 39 -8 71t-59 40q-35 11 -66.5 -6.5t-42.5 -53.5l-107 -339zM839 -511q0 -11 6 -31 q15 -36 49 -48q13 -8 35 -8q10 0 32 6q35 13 50.5 48.5t-0.5 70.5t-48 49t-66 1q-31 -13 -44.5 -38.5t-13.5 -49.5zM918 -226q0 -28 16 -51t51 -30q3 0 12 -2t14 -2q69 5 86 66l188 647q11 39 -6.5 69.5t-53.5 41.5q-37 11 -69 -6.5t-43 -53.5l-192 -647q0 -4 -1 -10.5 t-1.5 -12t-0.5 -9.5zM1285 -183q0 -16 5 -34q13 -34 49 -47q15 -7 38 -7q19 0 31 6q36 14 49 46q13 35 0.5 69t-44.5 51q-35 13 -69.5 -1t-50.5 -46q-8 -17 -8 -37zM1361 88q0 -57 66 -80q22 -6 32 -6q19 0 36 9q28 14 43 59l105 332q12 37 -6.5 68.5t-54.5 42.5 q-37 11 -68 -6.5t-43 -53.5l-105 -334q-5 -28 -5 -31zM1471 1369q110 106 264 106q156 0 266.5 -111t110.5 -267q0 -99 -55 -196q-157 157 -372 157h-35q-49 185 -179 311z" />
|
||||
<glyph unicode="" horiz-adv-x="2285" d="M0 525q0 -105 40 -200.5t108.5 -165t162.5 -112.5t199 -48q19 0 19 18v143q0 18 -19 18q-139 10 -234 110t-95 237q0 134 90.5 233t223.5 111l56 6q20 0 20 19l8 55q11 114 74 207t162 145.5t215 52.5q174 0 303.5 -115t148.5 -287l7 -62q0 -18 20 -18h171 q144 0 247 -102.5t103 -244.5q0 -137 -95 -237t-234 -110q-21 0 -21 -18v-143q0 -18 21 -18q214 10 361 161.5t147 364.5q0 102 -50 220q127 159 127 349q0 152 -75.5 281t-204 204t-279.5 75q-254 0 -413 -185q-130 68 -284 68q-225 0 -400 -140.5t-224 -359.5 q-179 -41 -292.5 -184t-113.5 -328zM816 32q-4 -22 15 -22h231l-141 -445h31l446 595q6 7 2.5 14.5t-14.5 7.5h-233l245 452q12 23 -15 23h-314q-12 0 -22 -15zM1463 1366q107 106 264 106t266.5 -110t109.5 -268q0 -95 -55 -192q-155 149 -368 149h-33q-47 190 -184 315z " />
|
||||
<glyph unicode="" horiz-adv-x="2307" d="M0 527q0 -139 68 -259t186 -192.5t259 -76.5q20 0 20 18v143q0 19 -20 19q-137 7 -234 109.5t-97 238.5t91 235.5t225 110.5l56 8q21 0 21 18l8 55q17 176 147.5 294.5t306.5 118.5q174 0 305 -117.5t149 -291.5l8 -62q0 -18 19 -18h173q144 0 247.5 -103.5t103.5 -247.5 q0 -136 -97 -238.5t-233 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185 192.5t67.5 259q0 116 -45 215q129 159 129 359q0 153 -75.5 282.5t-205 205t-281.5 75.5q-119 0 -229 -49.5t-190 -136.5q-141 69 -289 69q-227 0 -403 -140.5t-226 -359.5 q-180 -46 -294 -190t-114 -330zM569 -227q0 -27 17.5 -54t50.5 -37q37 -11 68 4t42 60l15 65q8 36 -10 67.5t-55 42.5q-36 11 -68.5 -8t-42.5 -57l-15 -63q-2 -6 -2 -20zM650 82q0 -34 27 -61q25 -27 60 -27q38 0 64 25.5t26 62.5t-26 62.5t-64 25.5q-37 0 -62 -25t-25 -63z M715 325q-2 -25 14.5 -48.5t51.5 -34.5q33 -10 66 7.5t44 54.5l30 96q12 39 -7 69.5t-58 41.5q-35 11 -67.5 -7t-43.5 -53l-26 -98q0 -3 -2 -12.5t-2 -15.5zM839 -560q0 -28 16.5 -53t51.5 -35q13 -3 27 -3q68 0 84 65l15 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5 l-15 -63q-3 -14 -3 -24zM922 -250q0 -35 27 -62q26 -26 61 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM989 -8q-2 -24 14 -50t48 -32q37 -10 68 6t44 60l29 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1283 -237 q0 -26 16.5 -51t49.5 -35q5 0 14.5 -2t14.5 -2q65 0 81 70l15 64q11 34 -7 67t-54 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -4 -2 -13t-2 -14zM1362 78q0 -36 27 -61q24 -26 61 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1427 325q0 -27 17.5 -51.5 t52.5 -34.5q3 0 13 -2t15 -2q16 0 38 10q34 18 44 56l26 96q10 36 -8 67.5t-54 42.5q-37 11 -68 -6t-42 -54l-30 -97q0 -4 -2 -12.5t-2 -12.5zM1477 1370q111 111 268 111t267.5 -111.5t110.5 -268.5q0 -107 -54 -197q-154 154 -378 154h-34q-45 187 -180 312z" />
|
||||
<glyph unicode="" horiz-adv-x="2323" d="M0 515q0 -181 106.5 -321t279.5 -192q16 -2 27 8l121 156q-143 0 -246.5 102.5t-103.5 246.5q0 138 91.5 239t228.5 112l56 8q17 0 17 15l8 60q19 176 150.5 294t307.5 118q178 0 310.5 -117t149.5 -292l8 -63q4 -18 22 -18h174q144 0 248 -105t104 -251 q0 -135 -91 -235.5t-224 -113.5q-76 0 -97 -30l-233 -256q-25 -29 -20.5 -66.5t33.5 -67.5q21 -28 62.5 -24.5t64.5 40.5l209 222q132 13 243 87.5t175.5 192t64.5 251.5q0 101 -46 222q123 156 123 354q0 156 -76 286.5t-207 206t-285 75.5q-251 0 -416 -182 q-139 69 -296 69q-229 0 -404.5 -142t-225.5 -366q-183 -41 -298 -186.5t-115 -336.5zM405 -285q0 -23 5 -34q13 -34 47 -47q36 -16 72.5 -2.5t48.5 48.5q16 35 2 71.5t-49 49.5q-36 13 -70 -0.5t-50 -47.5q-6 -13 -6 -38zM601 -24q0 -37 34 -71q68 -58 134 16l234 260 q24 28 19.5 65.5t-33.5 60.5q-29 22 -67 17t-63 -31l-235 -254q-23 -34 -23 -63zM670 -550q0 -19 8 -34q14 -36 44 -49q19 -8 39 -8q12 0 34 6q34 15 47 48q16 32 2.5 68t-47.5 49q-36 17 -70 3t-52 -51q-5 -15 -5 -32zM848 -295v-14q3 -39 34 -64q23 -29 63.5 -25.5 t63.5 40.5l450 524q25 29 21 68t-37 61q-28 23 -64.5 20t-61.5 -32l-450 -525q-19 -20 -19 -53zM1235 -384q-11 -36 0 -66q14 -35 48 -52q17 -8 38 -8q10 0 32 6q36 14 49 49q16 36 3 70t-47 47q-36 17 -70.5 3.5t-52.5 -49.5zM1491 1368q109 109 264 109 q161 0 273.5 -112.5t112.5 -273.5q0 -100 -55 -194q-156 156 -379 156h-34q-40 182 -182 315z" />
|
||||
<glyph unicode="" horiz-adv-x="2291" d="M0 525q0 -105 40 -200.5t108.5 -165t163 -112.5t199.5 -48q18 0 18 18v143q0 18 -18 18q-139 10 -234 110t-95 237q0 134 90.5 233.5t223.5 110.5l56 6q21 0 21 20l6 54q17 174 146.5 289.5t305.5 115.5q175 0 304.5 -114.5t147.5 -286.5l7 -62q0 -19 20 -19h171 q144 0 247 -102.5t103 -244.5q0 -137 -95 -237t-234 -110q-21 0 -21 -18v-143q0 -18 21 -18q214 10 361.5 161.5t147.5 364.5q0 115 -45 212q125 151 125 358q0 150 -75 279t-204 204.5t-279 75.5q-249 0 -414 -185q-141 69 -288 69q-226 0 -400.5 -140.5t-224.5 -360.5 q-176 -41 -291 -184.5t-115 -327.5zM585 -187q0 -64 69 -83q33 -11 67 6.5t44 53.5l160 611q10 35 -9.5 67t-57.5 43q-35 11 -67 -7.5t-42 -55.5l-160 -608q-4 -18 -4 -27zM862 -513q0 -19 9 -39q16 -33 54 -46q4 0 10.5 -1t12 -1.5t9.5 -0.5q69 0 81 70l245 932 q11 35 -6.5 67t-53.5 43q-39 11 -72 -7.5t-40 -55.5l-246 -933q-3 -15 -3 -28zM1305 -186q0 -25 17 -50t48 -34q10 -3 24 -3q27 0 52 14.5t34 48.5l160 611q12 33 -7 66t-55 44q-39 11 -70.5 -7.5t-38.5 -55.5l-160 -608q-4 -18 -4 -26zM1469 1362q107 107 264 107 q156 0 266 -109t110 -265q0 -100 -55 -197q-153 153 -373 153h-33q-45 187 -179 311z" />
|
||||
<glyph unicode="" horiz-adv-x="2293" d="M0 526q0 -105 40 -200.5t108.5 -165.5t163.5 -113t200 -48q19 0 19 18v143q0 18 -19 18q-136 7 -232.5 109.5t-96.5 238.5t90 235t224 110l57 7q16 0 16 16l8 57q18 175 149 291.5t307 116.5q174 0 304.5 -115.5t149.5 -288.5l7 -61q0 -20 19 -20h173q142 0 244 -102 t102 -246q0 -136 -95 -238.5t-231 -109.5q-20 0 -20 -18v-143q0 -18 20 -18q214 10 362 162t148 365q0 103 -44 213q121 159 121 351q0 151 -75.5 280.5t-204.5 205t-280 75.5q-245 0 -412 -178q-139 69 -288 69q-227 0 -402 -141t-224 -361q-181 -42 -294.5 -183.5 t-113.5 -330.5zM575 -194q0 -27 15.5 -51.5t51.5 -36.5q18 -9 39.5 -7.5t43 21t29.5 51.5l30 108q10 40 -8.5 72t-56.5 39q-34 11 -67 -7.5t-44 -53.5l-30 -111q-3 -14 -3 -24zM715 315q1 -31 18 -55.5t51 -29.5q28 -5 32 -5q60 0 81 70l30 107q10 37 -8.5 70.5t-56.5 44.5 q-36 10 -68 -8.5t-43 -55.5l-32 -112q-4 -20 -4 -26zM847 -528q0 -28 16.5 -53t51.5 -35q22 -5 30 -5q14 0 40 11q27 13 41 59l32 108q10 40 -9 72.5t-56 39.5q-35 11 -68.5 -7.5t-44.5 -54.5l-30 -111q-3 -14 -3 -24zM989 -16q0 -27 17 -52.5t52 -35.5q36 -11 67.5 5 t43.5 60l30 108q11 40 -7.5 71t-56.5 38q-35 12 -68 -6.5t-44 -54.5l-30 -111q-4 -14 -4 -22zM1293 -202q-2 -25 14.5 -49.5t49.5 -35.5l27 -3q18 -1 40 8q34 13 45 58l30 112q11 37 -7.5 68.5t-54.5 42.5q-40 10 -71.5 -9t-38.5 -57l-31 -107q-3 -27 -3 -28zM1437 310 q0 -28 17.5 -53t51.5 -32l27 -3q69 0 86 66l30 110q10 40 -9 72t-57 39q-37 11 -68.5 -7.5t-41.5 -56.5l-32 -109q-4 -18 -4 -26zM1473 1366q107 103 261 103q156 0 266 -111.5t110 -267.5q0 -102 -51 -189q-154 154 -372 154h-34q-39 175 -180 311z" />
|
||||
<glyph unicode="" horiz-adv-x="2297" d="M0 529q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231t224.5 114l56 4q21 0 21 19l8 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5 q0 -138 -97 -240.5t-234 -110.5q-20 0 -20 -18v-143q0 -18 20 -18q214 7 362.5 161.5t148.5 368.5q0 114 -46 214q126 154 126 354q0 152 -75.5 281.5t-204.5 204.5t-280 75q-248 0 -415 -185q-129 69 -289 69q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5 t-115 -328.5zM681 90q0 -35 26 -61q27 -27 62 -27q37 0 62.5 25t25.5 63t-25 63t-63 25t-63 -25t-25 -63zM681 -297q0 -38 26 -62q26 -26 62 -26q38 0 63 25t25 63t-25.5 64.5t-62.5 26.5t-62.5 -26.5t-25.5 -64.5zM1022 -112q0 -37 27 -65.5t62 -28.5q37 0 64 28t27 66 q0 35 -27 61.5t-64 26.5q-35 0 -62 -26.5t-27 -61.5zM1022 271q0 -36 26 -62t63 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63.5t-64.5 26.5q-36 0 -62.5 -26.5t-26.5 -63.5zM1022 -504q0 -37 26.5 -64t62.5 -27q37 0 64 26.5t27 64.5q0 35 -27 61.5t-64 26.5q-35 0 -62 -26.5 t-27 -61.5zM1367 90q0 -33 26 -61q27 -27 64 -27t62.5 25t25.5 63t-25 63t-63 25t-64 -25t-26 -63zM1367 -297q0 -36 26 -62t64 -26t63 25t25 63t-25.5 64.5t-62.5 26.5t-63.5 -26.5t-26.5 -64.5zM1472 1369q108 108 265 108t266.5 -111t109.5 -269q0 -94 -54 -196 q-154 154 -373 154h-33q-47 186 -181 314z" />
|
||||
<glyph unicode="" horiz-adv-x="2296" d="M-2 529q0 -213 148.5 -366.5t363.5 -163.5q18 0 18 18v146q0 20 -18 20q-140 10 -235.5 110t-95.5 236q0 135 91 234.5t225 110.5l56 7q20 0 20 20l7 53q17 173 147 290t306 117q175 0 305 -116.5t149 -290.5l6 -61q0 -19 20 -19h171q145 0 248 -101.5t103 -243.5 q0 -136 -95 -236t-234 -110q-22 0 -22 -20v-146q0 -18 22 -18q213 7 361.5 161.5t148.5 368.5q0 118 -46 214q126 153 126 358q0 151 -75.5 280.5t-204.5 205t-280 75.5q-244 0 -419 -187q-132 67 -284 67q-226 0 -401.5 -140t-224.5 -359q-177 -42 -292 -185.5t-115 -328.5 zM631 435q0 -60 45.5 -104t108.5 -44t106.5 43t43.5 105q0 41 -37.5 109t-70.5 107q-3 4 -19.5 21.5t-22.5 25.5l-38 -43q-44 -48 -80 -112.5t-36 -107.5zM950 10q0 -101 73.5 -175t175.5 -74q103 0 177 74t74 175q0 43 -25 103t-60 111q-74 95 -138 159q-9 7 -28 26 l-62 -62q-71 -68 -129 -166.5t-58 -170.5zM1107 725q0 -43 30 -71.5t76 -28.5q41 0 70 28.5t29 71.5q0 65 -99 172l-27 -28q-30 -32 -54.5 -74.5t-24.5 -69.5zM1469 1369q107 106 265 106q156 0 266 -109t110 -265q0 -101 -54 -197q-160 154 -374 154h-33q-45 188 -180 311z " />
|
||||
<glyph unicode="" horiz-adv-x="2294" d="M0 533q0 -176 106.5 -317.5t274.5 -191.5l-69 -177q-7 -22 15 -22h226l-122 -436h31l435 586q6 7 1.5 15t-15.5 8h-232l264 498q12 23 -14 23h-316q-15 0 -20 -15l-118 -312q-114 29 -189.5 125t-75.5 216q0 134 90.5 233.5t224.5 111.5l56 7q21 0 21 18l8 55 q17 174 146.5 290.5t305.5 116.5q175 0 305 -116.5t149 -290.5l7 -62q0 -18 19 -18h173q145 0 248 -101.5t103 -243.5q0 -137 -96 -237.5t-235 -110.5q-20 0 -20 -19v-147q0 -18 20 -18q213 7 361.5 162t148.5 370q0 116 -44 213q122 160 122 351q0 114 -45 217.5 t-120 178.5t-179 119.5t-217 44.5q-118 0 -226 -48t-186 -134q-131 70 -288 70q-227 0 -402 -139.5t-225 -359.5q-177 -41 -292 -185t-115 -328zM872 -520q0 -28 17 -54.5t49 -32.5q3 0 8.5 -1t10 -1.5t8.5 -0.5q68 5 85 65l31 113q10 35 -9.5 67.5t-56.5 43.5 q-35 10 -67.5 -9t-43.5 -57l-27 -107q-5 -25 -5 -26zM1015 -11q0 -24 16.5 -48t49.5 -36q35 -12 67 5.5t43 56.5l32 111q10 40 -8.5 72t-56.5 39q-36 11 -68.5 -7.5t-44.5 -56.5l-27 -109q0 -3 -1 -8.5t-1.5 -10t-0.5 -8.5zM1317 -184q0 -30 17 -55.5t50 -34.5q25 -5 29 -5 q63 0 82 64l26 113q11 35 -6 67t-53 44q-40 10 -73 -9.5t-40 -56.5l-30 -106q-2 -8 -2 -21zM1462 322q0 -26 17 -50.5t52 -36.5q27 -3 28 -3q19 0 40 9q31 16 42 56l31 111q10 35 -9.5 67.5t-56.5 43.5q-36 11 -68 -7.5t-43 -56.5l-30 -109q-3 -14 -3 -24zM1473 1373 q106 102 261 102q157 0 267 -110.5t110 -267.5q0 -101 -52 -190q-158 154 -372 154h-34q-49 185 -180 312z" />
|
||||
<glyph unicode="" horiz-adv-x="2288" d="M0 529q0 -178 106 -318t273 -187l-68 -179q-8 -23 15 -23h226l-111 -447h30l423 600q6 7 1.5 15t-15.5 8h-232l264 492q11 23 -15 23h-314q-14 0 -24 -15l-114 -306q-114 28 -188.5 122t-74.5 215q0 133 89.5 230.5t223.5 113.5l57 4q19 0 19 19l8 57q11 113 74 206.5 t162.5 146.5t214.5 53q173 0 303 -117t148 -289l8 -60q0 -20 18 -20h173q142 0 245.5 -102t103.5 -242q0 -138 -96 -239.5t-232 -108.5q-21 0 -21 -19v-143q0 -18 21 -18q139 4 256 76.5t184 192.5t67 259q0 117 -45 214q125 148 125 353q0 113 -44.5 216t-119.5 178 t-178 119.5t-216 44.5q-247 0 -412 -185q-129 69 -288 69q-225 0 -400 -139.5t-224 -357.5q-176 -41 -291 -184.5t-115 -327.5zM846 -525q0 -26 15.5 -49t48.5 -33l27 -3q67 0 85 64l259 948q10 37 -7 68.5t-52 42.5q-37 11 -69.5 -6.5t-42.5 -53.5l-261 -949q-3 -27 -3 -29 zM1288 -201q0 -64 66 -85q27 -3 28 -3q18 0 37 8q32 14 45 59l175 624q10 37 -8 68.5t-54 42.5q-37 11 -69 -6.5t-42 -53.5l-173 -628q-5 -23 -5 -26zM1466 1367q108 102 264 102q155 0 265 -109t110 -264q0 -101 -54 -197q-154 154 -371 154h-34q-45 183 -180 314z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M0 1160q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137t-135.5 -57q-80 0 -137 57t-57 137zM94 1160q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 71t-71 30q-42 0 -71 -29.5t-29 -71.5zM509 688q0 -123 68 -219q36 -50 99 -79.5t143 -29.5q234 0 293 178 q6 23 -6.5 43.5t-35.5 24.5q-23 6 -43 -7t-25 -36q0 -1 -1.5 -5.5l-2.5 -7.5q-18 -30 -48 -48q-50 -30 -131 -30q-50 0 -89 17q-64 27 -91 95q-18 44 -18 104v344q0 24 3 48q6 61 48 111q47 56 147 56q83 0 131 -29q32 -19 48 -48q1 -3 2.5 -8.5t1.5 -6.5q6 -22 25 -32.5 t43 -5.5q23 5 35.5 24.5t6.5 42.5v1l-9 25q-8 18 -29.5 46t-48.5 47q-33 24 -87.5 40t-118.5 16q-81 0 -143.5 -28.5t-97.5 -77.5q-69 -95 -69 -221v-344z" />
|
||||
<glyph unicode="" horiz-adv-x="2216" d="M0 531q0 -214 149 -367t363 -163q18 0 18 18v143q0 19 -18 19q-137 7 -233.5 109t-96.5 241q0 133 90.5 231.5t224.5 114.5l56 3q21 0 21 18l8 59q16 173 145.5 289.5t305.5 116.5q174 0 305 -116.5t149 -289.5l8 -62q0 -18 18 -18h173q142 0 246.5 -103t104.5 -243 q0 -139 -97 -241t-234 -109q-20 0 -20 -19v-143q0 -18 20 -18q140 4 257.5 76.5t185 192.5t67.5 261q0 144 -71 265t-193 190.5t-266 69.5h-35q-52 214 -224.5 351t-393.5 137q-226 0 -401 -140t-225 -359q-176 -41 -291.5 -185.5t-115.5 -328.5zM743 368q0 -38 26 -64 l276 -278q20 -25 61 -25q45 0 65 25l277 278q26 28 26 64q0 37 -26 62t-64 25t-66 -25l-120 -118v425q0 38 -27 63t-65 25t-63 -25t-25 -63v-425l-117 118q-28 25 -67 25q-40 0 -65.5 -24.5t-25.5 -62.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2212" d="M0 527q0 -105 40 -200.5t108.5 -165t163 -112.5t199.5 -48q18 0 18 18v142q0 20 -18 20q-139 10 -234 110t-95 236q0 134 90.5 233.5t223.5 110.5l56 8q21 0 21 18l8 55q11 114 73.5 207.5t162 146t214.5 52.5q175 0 305.5 -115t148.5 -288l6 -61q0 -19 20 -19h172 q144 0 247 -103t103 -245q0 -136 -95 -236t-234 -110q-21 0 -21 -20v-142q0 -18 21 -18q214 10 361.5 161.5t147.5 364.5q0 143 -71.5 264.5t-193.5 192.5t-265 71h-34q-53 213 -225.5 350t-392.5 137q-225 0 -400 -141.5t-225 -360.5q-177 -42 -291.5 -185.5t-114.5 -327.5 zM664 392q0 -119 59.5 -220.5t161 -161.5t219.5 -60q184 0 315 130.5t131 311.5q0 37 -27 64t-65 27t-65.5 -27t-27.5 -64q0 -107 -76.5 -184t-184.5 -77q-106 0 -182.5 77t-76.5 184q0 96 57 171t140 82l-44 -42q-24 -24 -24 -61q0 -40 24 -70q22 -24 56.5 -25t74.5 25 l194 199q27 27 27 62q0 40 -27 65l-194 195q-30 28 -66 28q-37 0 -63 -27t-26 -65t24 -62l37 -38q-160 -27 -265.5 -149t-105.5 -288z" />
|
||||
<glyph unicode="" horiz-adv-x="2211" d="M0 530q0 -213 148.5 -366t362.5 -163q18 0 18 18v142q0 20 -18 20q-137 7 -233 108.5t-96 240.5q0 132 90 230t224 114h56q21 0 21 19l6 61q17 173 147 290t305 117q173 0 303.5 -117t148.5 -290l8 -61q0 -19 19 -19h172q142 0 246 -102.5t104 -241.5q0 -138 -96.5 -240 t-232.5 -109q-21 0 -21 -20v-142q0 -18 21 -18q139 4 256 76t184.5 192.5t67.5 260.5q0 107 -42 204t-113 167t-169 111.5t-205 41.5h-34q-53 214 -225 350.5t-392 136.5q-226 0 -401 -140.5t-224 -358.5q-177 -41 -291.5 -184.5t-114.5 -327.5zM741 463q0 -40 26 -68 q24 -24 65 -24q39 0 66 24l118 122v-424q0 -38 25 -65t63 -27q37 0 64 27t27 65v420l120 -118q64 -49 130 0q26 24 26 66q0 38 -26 66l-276 274q-26 26 -64 26q-39 0 -63 -26l-275 -274q-26 -26 -26 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="2216" d="M0 530q0 184 115 328t292 185q50 219 225 359.5t401 140.5q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -141 -67.5 -261t-185 -192.5t-257.5 -76.5h-1194q-214 10 -363 163t-149 367zM182 530q0 -139 96.5 -241.5t233.5 -109.5h1194 q137 7 234 109.5t97 241.5q0 140 -104 242.5t-247 102.5h-173q-18 0 -18 19l-8 61q-18 173 -149 290t-305 117q-175 0 -304.5 -117t-146.5 -290l-8 -61q0 -19 -21 -19h-56q-134 -16 -224.5 -114t-90.5 -231z" />
|
||||
<glyph unicode="" horiz-adv-x="386" d="M0 1349q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137.5t-135.5 -57.5t-136.5 57.5t-57.5 137.5zM94 1349q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 70.5t-71 29.5q-42 0 -71 -29t-29 -71z" />
|
||||
<glyph unicode="" horiz-adv-x="677" d="M0 542q0 -31 20.5 -51.5t50.5 -20.5h306q30 0 50.5 20.5t20.5 51.5q0 30 -20.5 49.5t-50.5 19.5h-132l414 414q19 22 19 53q0 29 -19 49q-20 19 -53 19q-32 0 -51 -19l-412 -413v133q0 31 -20.5 51.5t-51.5 20.5q-30 0 -50.5 -21t-20.5 -51v-305z" />
|
||||
<glyph unicode="" horiz-adv-x="690" d="M0 574q0 -35 27 -59l256 -261q25 -25 62 -25q38 0 63 25l256 261q26 23 26 59t-24 60.5t-60 24.5t-61 -25l-113 -112v703q0 36 -25.5 60t-61.5 24t-61.5 -24t-25.5 -60v-703l-113 112q-25 25 -59 25q-36 0 -61 -24.5t-25 -60.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1138" d="M0 1157q0 80 57 137t137 57q79 0 135.5 -57t56.5 -137t-56.5 -137.5t-135.5 -57.5t-136.5 57.5t-57.5 137.5zM94 1157q0 -42 29 -71q30 -30 71 -30t71 30t30 71t-30 70.5t-71 29.5q-42 0 -71 -29t-29 -71zM565 422q0 -23 16.5 -39.5t39.5 -16.5t39.5 16.5t16.5 39.5v404 h305q23 0 39.5 17t16.5 40q0 24 -16 40t-40 16h-305v291h408q23 0 38 16t15 40t-15 40t-38 16h-509q-11 0 -11 -12v-908z" />
|
||||
<glyph unicode="" horiz-adv-x="2324" d="M0 635q0 42 29 66q23 24 66 24h222q39 0 64.5 -25.5t25.5 -64.5q0 -38 -26 -65t-64 -27h-222q-39 0 -67 27t-28 65zM99 93q0 37 28 65q26 25 65 25h1942q39 0 66 -26t27 -64t-27.5 -65.5t-65.5 -27.5h-1942q-38 0 -65.5 27.5t-27.5 65.5zM317 1391q0 41 25 63 q27 29 66 29q38 0 65 -29l154 -156q28 -26 28 -64q0 -40 -25.5 -65.5t-64.5 -25.5q-35 0 -64 26l-159 157q-25 22 -25 65zM594 635q0 -139 57 -249q5 -15 26 -15h178q12 0 14.5 6.5t-7.5 17.5q-85 104 -85 240q0 159 114 271t272 112q159 0 271.5 -112t112.5 -271 q0 -137 -85 -240q-6 -10 -6 -13q-1 -5 3 -8t11 -3h181q14 0 22 15q60 113 60 249q0 153 -77 284.5t-208.5 208.5t-284.5 77t-284.5 -77t-208 -208.5t-76.5 -284.5zM1071 1481v223q0 38 27 66t65 28t66 -28t28 -66v-223q0 -38 -28 -66t-66 -28t-65 28t-27 66zM1671 1234 q0 39 26 64l154 156q27 29 66 29q40 0 66.5 -26.5t26.5 -65.5q0 -41 -24 -65l-161 -157q-26 -24 -63 -24q-40 -1 -65.5 24t-25.5 65zM1919 635q0 43 26 66q23 24 63 24h223q39 0 66.5 -25.5t27.5 -64.5q0 -38 -28 -65t-66 -27h-223q-37 0 -63 27t-26 65z" />
|
||||
<glyph unicode="" horiz-adv-x="2148" d="M0 94q0 42 30 66q22 25 67 25h1956q40 0 68 -26t28 -65q0 -38 -28.5 -66.5t-67.5 -28.5h-1956q-40 0 -68.5 28.5t-28.5 66.5zM210 978q0 42 25 67q27 28 69 28q37 0 64 -28l160 -160q29 -29 29 -67q0 -37 -29 -66q-24 -29 -64.5 -28.5t-68.5 28.5l-160 160q-25 24 -25 66 zM523 382q-7 -25 16 -25h159q11 0 24 18q48 102 142 162t209 60q116 0 212 -60t144 -162q13 -18 24 -18h158q20 0 16 25q-54 181 -207.5 294t-346.5 113q-192 0 -344 -113t-206 -294zM982 1071v228q0 40 26 68t65 28q40 0 67 -27.5t27 -68.5v-228q0 -41 -27 -68t-67 -27 q-39 0 -65 27.5t-26 67.5zM1592 818q0 38 27 67l164 160q25 28 66 28q39 0 64 -27t25 -68q0 -42 -25 -66l-158 -160q-27 -27 -60 -30q-36 -4 -69.5 26t-33.5 70z" />
|
||||
<glyph unicode="" horiz-adv-x="1080" d="M0 734q0 -38 25 -63l262 -256q23 -26 58 -26q36 0 61 24t25 60t-25 61l-112 112h703q36 0 59.5 25.5t23.5 61.5t-23.5 61.5t-59.5 26.5h-703l112 113q25 25 25 59q0 36 -25 61t-61 25q-33 0 -58 -28l-262 -256q-25 -25 -25 -61z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M40 1090q-61 129 18 243q56 79 169 97l20 3h23q155 -5 227 -139q35 -62 17 -140q-12 -61 -45 -112q-65 -104 -143 -175q-4 -5 -12 -9q-44 -35 -91 -3q-18 12 -26 20q-106 110 -157 215zM45 1169q1 -10 5 -30q15 -68 62.5 -105t116.5 -43q16 -2 18.5 0.5t2.5 19.5l-3 27 q-13 72 -69 105q-11 7 -90 40q-12 4 -29 4t-14 -18zM286 1013q-1 -17 3 -20t20 -2q14 2 42 8q56 13 94 60q29 35 44 110q2 11 -1.5 15t-14.5 3q-32 -3 -58 -13q-121 -45 -129 -161zM314 427q-60 128 19 243q56 79 169 97l19 3h23q155 -5 227 -139q35 -63 18 -140 q-12 -59 -46 -112q-63 -102 -143 -174q-8 -8 -11 -10q-45 -35 -92 -3q-15 10 -26 21q-107 111 -157 214zM319 506q1 -6 3.5 -16.5t2.5 -12.5q15 -68 62 -105.5t116 -43.5q16 -1 19 1.5t3 19.5l-4 26q-13 72 -68 105q-9 6 -91 40q-15 5 -28 5q-18 0 -15 -19zM560 350 q-1 -17 3 -20t20 -2q14 2 42 8q55 13 94 61q29 36 44 109q2 11 -1.5 15.5t-14.5 3.5q-28 -3 -58 -14q-121 -45 -129 -161zM634 1090q-60 128 19 243q56 79 169 97l19 3h23q155 -5 227 -139q35 -63 18 -140q-12 -59 -46 -112q-65 -104 -143 -175q-6 -6 -11 -9q-45 -35 -92 -3 q-18 12 -26 20q-106 110 -157 215zM639 1169l6 -30q15 -68 62 -105t116 -43q16 -2 19 1t3 19l-4 27q-13 72 -68 105q-9 6 -91 40q-12 4 -28 4q-18 0 -15 -18zM880 1013q-1 -17 3 -20t20 -2q14 2 42 8q56 13 94 60q29 35 44 110q2 11 -1.5 15t-14.5 3q-32 -3 -58 -13 q-121 -45 -129 -161z" />
|
||||
<glyph unicode="" horiz-adv-x="2632" d="M0 99q0 -36 27 -61t66 -25h1985q38 0 64.5 25t26.5 61q0 39 -26 65.5t-65 26.5h-1985q-38 0 -65.5 -27t-27.5 -65zM278 431q0 -38 28 -63q22 -29 63 -29h1985q37 0 62 27t25 65q0 37 -25 62t-62 25h-1985q-38 0 -64.5 -25t-26.5 -62zM294 689v5q-7 -24 13 -24h154 q9 0 20 16q38 83 113.5 136t165.5 60l57 8q20 0 20 19l6 53q17 172 145.5 287.5t302.5 115.5q172 0 301 -114t147 -285l7 -61q0 -19 22 -19h169q103 0 187 -55t125 -145q11 -16 23 -16h151q19 0 16 24q-35 89 -49 113q116 104 160 274l18 70q4 10 -1.5 17t-12.5 7l-66 23 q-143 41 -217.5 169t-39.5 273l14 62q8 15 -14 25l-90 25q-175 43 -343 -28t-263 -226q-127 49 -244 49q-222 0 -395.5 -140t-223.5 -357q-135 -32 -236.5 -129t-141.5 -232zM463 -226q0 -38 28 -63q27 -29 63 -29h1989q37 0 63 27t26 65q0 37 -26 62t-63 25h-1989 q-38 0 -64.5 -25t-26.5 -62zM1690 1403q56 92 150.5 142t199.5 40q-11 -167 75 -312.5t237 -215.5q-24 -56 -80 -114q-147 121 -335 121h-34q-51 210 -213 339z" />
|
||||
<glyph unicode="" horiz-adv-x="686" d="M0 741q0 -126 61 -232t167.5 -167.5t232.5 -61.5q30 0 51.5 23t21.5 54t-21 51.5t-52 20.5q-130 0 -220.5 91t-90.5 221q0 124 85 216t200 92l-35 -34q-24 -24 -22 -52q0 -29 21 -51.5t52 -22.5q32 0 54 22l161 160q21 17 21 54q0 35 -21 50l-161 163q-21 22 -52 22 t-53.5 -22t-22.5 -53q0 -33 23 -54l32 -30q-184 -13 -308 -144.5t-124 -315.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1115" d="M0 674q0 -151 75.5 -279.5t204 -203t278.5 -74.5q153 0 281 74t202 202t74 281q0 38 -25.5 65t-62.5 27t-64 -27t-27 -65q0 -157 -110.5 -267.5t-267.5 -110.5q-155 0 -264 110.5t-109 267.5q0 136 84.5 246.5t196.5 117.5l-41 -39q-26 -28 -26 -62q0 -36 26 -64 q58 -56 129 0l196 194q26 20 26 66q0 41 -26 61l-196 198q-28 26 -61 26q-40 0 -67 -26.5t-27 -64.5q0 -39 26 -65l41 -38q-200 -35 -333 -191.5t-133 -358.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1081" d="M1 799q0 -36 24.5 -61t59.5 -21h702l-110 -115q-26 -26 -26 -59q0 -36 25.5 -61t61.5 -25q34 1 57 29l261 257q25 25 25 62q-1 38 -26 62l-263 255q-24 26 -58 25q-36 0 -61 -24t-25 -60t25 -61l113 -115h-703q-36 -1 -59.5 -26.5t-22.5 -61.5z" />
|
||||
<glyph unicode="" horiz-adv-x="851" d="M0 1027q0 41 40.5 108t77.5 111q10 12 25 29.5t17 19.5l39 -46q44 -49 81 -114t37 -108q0 -66 -45.5 -113t-111.5 -47t-113 47t-47 113zM333 584q0 46 26 107.5t64 113.5q73 98 140 163q7 5 28 26l27 -26q62 -59 141 -162q41 -55 66.5 -115t25.5 -107q0 -110 -75 -184.5 t-185 -74.5q-108 0 -183 76t-75 183zM495 1320q0 69 107 181l27 -30q30 -35 54 -78.5t24 -72.5q0 -44 -30.5 -73.5t-74.5 -29.5q-46 0 -76.5 29.5t-30.5 73.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2539" d="M0 521q0 -39 30 -66q26 -30 67 -30h1567q46 0 78 -32t32 -79q0 -46 -31.5 -76.5t-78.5 -30.5t-78 31q-26 28 -64 28q-40 0 -68.5 -27.5t-28.5 -65.5q0 -40 30 -67q90 -88 209 -88q125 0 214 86t89 210t-89.5 213.5t-213.5 89.5h-1567q-40 0 -68.5 -28t-28.5 -68zM0 871 q0 -37 30 -65q28 -28 67 -28h2138q125 0 214.5 87t89.5 210q0 124 -89.5 212t-214.5 88q-123 0 -208 -85q-29 -26 -29 -71q0 -41 27.5 -67t67.5 -26q39 0 67 26q30 33 75 33q46 0 77.5 -32t31.5 -78t-31.5 -77t-77.5 -31h-2138q-40 0 -68.5 -28t-28.5 -68z" />
|
||||
<glyph unicode="" horiz-adv-x="2613" d="M0 693q0 40 32 74q36 31 75 31h248q43 0 72 -31t29 -74q0 -46 -29 -77t-72 -31h-248q-43 0 -75 32.5t-32 75.5zM355 1544q0 43 28 73q36 31 75 31q42 0 73 -31l175 -176q30 -35 30 -74q0 -45 -29 -75t-70 -30q-39 0 -75 31l-179 173q-28 34 -28 78zM568 104q0 45 31 73 q28 28 73 28h281l332 312q16 13 36 0l337 -312h295q43 0 73.5 -29.5t30.5 -71.5q0 -43 -30.5 -74t-73.5 -31h-361q-16 0 -31 8l-257 242l-255 -242q-13 -8 -30 -8h-347q-43 0 -73.5 31t-30.5 74zM667 693q0 -155 66 -282q4 -19 27 -19h201q12 0 16 9t-2 20 q-102 123 -102 272q0 180 128 306t308 126q179 0 305.5 -126t126.5 -306q0 -150 -101 -272q-7 -11 -3.5 -20t16.5 -9h203q21 0 25 19q66 123 66 282q0 130 -51 248t-136.5 203.5t-203.5 136t-247 50.5q-130 0 -248.5 -50.5t-205 -136t-137.5 -203.5t-51 -248zM1203 1648v245 q0 46 30 75.5t76 29.5q45 0 74.5 -30t29.5 -75v-245q0 -46 -29.5 -75.5t-74.5 -29.5q-46 0 -76 29.5t-30 75.5zM1880 1367q0 40 29 74l173 176q31 31 75 31t74 -30.5t30 -73.5q0 -46 -28 -78l-180 -173q-34 -31 -75 -31q-43 0 -70.5 29.5t-27.5 75.5zM2159 693q0 43 28.5 74 t70.5 31h251q43 0 74 -31t31 -74q0 -44 -31 -76t-74 -32h-251q-43 0 -71 31t-28 77z" />
|
||||
<glyph unicode="" horiz-adv-x="2585" d="M0 681q0 44 32 72q28 28 73 28h246q43 0 71 -28.5t28 -71.5q0 -45 -28.5 -75.5t-70.5 -30.5h-246q-43 0 -74 31.5t-31 74.5zM351 1519q0 45 27 72q32 32 75 32q46 0 72 -32l173 -174q74 -70 0 -144q-30 -30 -69 -30q-35 0 -72 30l-179 174q-27 29 -27 72zM561 103 q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-335 -303q-20 -14 -35 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5zM661 681q0 -159 62 -280q9 -17 29 -17h199q13 0 16 8t-8 19 q-95 119 -95 270q0 176 126 299.5t304 123.5q176 0 301.5 -124t125.5 -299q0 -151 -95 -270q-11 -11 -8 -19t16 -8h201q21 0 26 17q66 125 66 280q0 127 -50.5 244.5t-135.5 202.5t-202 135.5t-245 50.5t-245 -50.5t-202 -135.5t-135.5 -202.5t-50.5 -244.5zM1190 1621v248 q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5v-248q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM1859 1345q0 45 28 72l174 174q26 32 72 32q44 0 73 -30.5t29 -73.5q0 -45 -27 -72l-177 -174q-37 -30 -74 -30q-42 0 -70 29.5t-28 72.5zM2135 681 q0 43 28 71.5t71 28.5h247q43 0 73.5 -29t30.5 -71q0 -43 -30.5 -74.5t-73.5 -31.5h-247q-42 0 -70.5 30.5t-28.5 75.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185z" />
|
||||
<glyph unicode="" horiz-adv-x="538" d="M0 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69 178t-168 91v783q0 10 -11 20.5t-24 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />
|
||||
<glyph unicode="" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185zM270 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69.5 178 t-168.5 91v783q0 10 -10.5 20.5t-23.5 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />
|
||||
<glyph unicode="" horiz-adv-x="1484" d="M0 718q0 -71 74 -121q135 -95 408 -95q123 0 228 21q111 24 181 75t70 120q0 21 -8 42q142 35 223 94.5t81 136.5q0 19 -6 41q234 83 234 224q0 90 -102 160q-200 133 -586 133q-182 0 -330 -32q-159 -32 -257.5 -102t-98.5 -159q0 -53 33 -97q-121 -69 -121 -168 q0 -77 75 -135q-98 -57 -98 -138zM41 411q0 -75 92.5 -117.5t232.5 -42.5q142 0 235 42.5t93 117.5q0 28 -18 47t-46 19q-23 0 -41 -16t-23 -39q-20 -16 -75 -29.5t-125 -13.5q-113 0 -183 32q16 16 17.5 41t-10.5 42q-16 22 -41.5 27t-47.5 -9q-60 -40 -60 -101zM128 718 q0 1 13 12q9 9 38.5 23t65.5 24l8 4q166 -55 387 -55q97 0 176 11l18 -16q-9 -16 -43 -34q-41 -22 -127 -39t-182 -17t-182.5 17t-128.5 39q-34 15 -43 31zM136 143q0 -65 73.5 -100t182.5 -35q111 0 186 35t75 100q0 26 -19 46t-45 20q-48 0 -63 -49q-40 -25 -134 -25 q-82 0 -131 25q-15 49 -63 49q-26 0 -44 -19t-18 -47zM150 991q0 8 10 19q25 31 97 60q197 -105 540 -105q175 0 329 32v-6q0 -15 -19 -31q-42 -37 -156 -70q-124 -37 -311 -37q-188 0 -312 37q-119 33 -159 70q-19 15 -19 31zM239 1256q0 18 24 40q46 43 183 83 q146 43 351 43q206 0 354 -43q138 -40 183 -83q23 -23 23 -40t-23 -38q-45 -43 -183 -84q-148 -43 -354 -43q-205 0 -351 43q-138 40 -183 84q-24 21 -24 38z" />
|
||||
<glyph unicode="" horiz-adv-x="676" d="M0 557q0 -31 18 -50q20 -19 54 -19q31 0 50 19l412 413v-133q0 -31 20.5 -51.5t51.5 -20.5q30 0 50.5 21t20.5 51v306q0 31 -20.5 51.5t-50.5 20.5h-307q-30 0 -50 -20.5t-20 -51.5q0 -30 20 -50t50 -20h133l-414 -414q-18 -21 -18 -52z" />
|
||||
<glyph unicode="" horiz-adv-x="691" d="M1 1013q-1 -36 23.5 -61.5t60.5 -24.5q35 -2 60 25l113 112v-703q-1 -36 24.5 -60t62.5 -23q35 -2 61 22t27 60v703l112 -112q24 -25 60 -25q37 0 61.5 24.5t24.5 60.5q-2 37 -27 58l-255 262q-25 24 -63 27q-38 -2 -63 -28l-256 -260q-26 -22 -26 -57z" />
|
||||
<glyph unicode="" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM491 521l90 239q5 10 0 21l-90 235q-5 10 1 16t17 1l598 -252q11 -2 11 -11q0 -8 -11 -10l-598 -257q-11 -4 -17 1.5t-1 16.5z " />
|
||||
<glyph unicode="" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM435 761q0 7 12 10l604 250q11 2 16.5 -3.5t1.5 -16.5l-248 -604q-2 -11 -11 -11q-11 0 -16 11l-103 230q-9 14 -14 15 l-230 104q-12 5 -12 15z" />
|
||||
<glyph unicode="" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM518 998q-2 11 3.5 17t15.5 2l602 -249q12 -2 12 -10q0 -9 -12 -14l-229 -104q-10 -4 -15 -15l-104 -230q-5 -11 -14 -11 q-8 0 -10 11z" />
|
||||
<glyph unicode="" d="M0 765q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 765q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM503 507l256 600q2 11 10 11t10 -11l255 -600q4 -11 -1.5 -17t-16.5 0l-237 89q-10 4 -20 0l-239 -89q-10 -6 -16 0t-1 17z" />
|
||||
<glyph unicode="" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM375 777q0 10 10 14l231 104q10 5 15 15l103 229q9 12 16 12q8 0 11 -12l248 -605q2 -11 -2 -15t-16 -2l-606 248q-10 3 -10 12 z" />
|
||||
<glyph unicode="" horiz-adv-x="1533" d="M0 769q0 156 60.5 298.5t163 244.5t244 163t297.5 61q157 0 299 -61t245 -163.5t164 -244.5t61 -297q0 -156 -61 -298.5t-164 -245.5t-245 -163.5t-298 -60.5q-155 0 -297 60.5t-244.5 163t-163.5 244.5t-61 299zM168 769q0 -162 80.5 -299.5t218.5 -217t299 -79.5 q121 0 232 47.5t191.5 127.5t128 190.5t47.5 231.5q0 244 -178 422q-178 176 -422 176q-121 0 -231.5 -48t-190.5 -128t-127.5 -191t-47.5 -232zM525 536l250 605q1 10 10 10q10 0 14 -10l104 -231q2 -9 16 -14l230 -104q11 -4 11 -14q0 -9 -11 -12l-605 -248q-10 -4 -15 1 t-4 17z" />
|
||||
<glyph unicode="" horiz-adv-x="1538" d="M0 766q0 156 61.5 298.5t164.5 245.5t245 163.5t298 60.5t298.5 -60.5t245.5 -163.5t164 -245t61 -299t-61 -299t-164 -244.5t-245.5 -163t-298.5 -60.5t-298.5 61t-245.5 164t-164 245t-61 297zM170 766q0 -245 177 -422q176 -176 422 -176q163 0 301.5 80.5t219 218 t80.5 299.5q0 121 -47.5 232t-128.5 191.5t-192 128t-233 47.5q-121 0 -231.5 -47.5t-191 -128t-128.5 -191.5t-48 -232zM504 1025q-5 11 1 16.5t16 0.5l238 -89q10 -4 23 0l235 89q10 5 16 -0.5t2 -16.5l-253 -599q-3 -10 -13 -10q-7 0 -10 10z" />
|
||||
<glyph unicode="" horiz-adv-x="1541" d="M0 769q0 157 61.5 300t165 246.5t246 164.5t298.5 61t299 -61t246 -164.5t164.5 -246.5t61.5 -300t-61.5 -300t-165 -245.5t-246 -163.5t-298.5 -61q-157 0 -300 61t-246 164.5t-164 246t-61 298.5zM170 769q0 -245 179 -424q177 -177 422 -177q163 0 302 81t220 219.5 t81 300.5t-81 300.5t-220 219.5t-302 81q-162 0 -300.5 -81t-219.5 -219.5t-81 -300.5zM418 769q0 9 12 10l601 258q11 5 16.5 -1.5t0.5 -16.5l-89 -240q-7 -10 0 -20l89 -238q5 -10 -0.5 -16t-16.5 -1l-601 255q-12 1 -12 10z" />
|
||||
<glyph unicode="" horiz-adv-x="1816" d="M0 1000q0 150 94.5 268.5t239.5 150.5q41 180 184.5 295t328.5 115q180 0 322 -112.5t184 -286.5h29q180 0 307 -125.5t127 -304.5q0 -96 -39.5 -181.5t-109.5 -146.5v-3q0 -95 -59.5 -169.5t-149.5 -94.5q-23 -100 -97 -169t-174 -85q46 -55 46 -121q0 -77 -54.5 -132 t-131.5 -55t-131.5 55t-54.5 132q0 31 11 61h-11q-93 0 -160 67t-67 160q0 64 32 114q-83 46 -120 133h-125h-2h-9v1q-172 11 -291 136t-119 298zM149 1026q0 -128 90 -218t217 -90q79 0 146 36q19 -119 111 -198t216 -79q139 0 237 98q66 -76 164 -76q91 0 155.5 64.5 t64.5 155.5q64 43 101 110.5t37 146.5q0 127 -91 215.5t-219 88.5q-89 0 -163 -47q9 39 9 84q0 154 -110 262t-266 108q-150 0 -259 -104t-114 -253q-3 0 -9 0.5t-10 0.5q-126 0 -216.5 -89.5t-90.5 -215.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1636" d="M0 562q0 36 25 59.5t68 23.5h609q43 0 68 -23.5t25 -59.5q0 -44 -24.5 -68.5t-68.5 -24.5h-609q-43 0 -68 24.5t-25 68.5zM0 1193q0 36 25 59t68 23h316q43 0 68.5 -23t25.5 -59q0 -43 -25.5 -68.5t-68.5 -25.5h-316q-43 0 -68 25t-25 69zM105 247q0 35 29.5 64.5 t64.5 29.5q41 0 66.5 -28.5t25.5 -65.5q0 -44 -24.5 -69t-67.5 -25q-37 0 -65.5 26t-28.5 68zM257 879q0 37 23.5 65.5t57.5 28.5q42 0 68 -28.5t26 -65.5q0 -44 -25 -69t-69 -25q-36 0 -58.5 25.5t-22.5 68.5zM362 247q0 37 26 65.5t68 28.5h409l94 -94q0 -42 -28.5 -68 t-65.5 -26h-409q-44 0 -69 25.5t-25 68.5zM503 879q0 35 29.5 64.5t64.5 29.5h409q42 0 67.5 -28.5t25.5 -65.5q0 -44 -25 -69t-68 -25h-409q-37 0 -65.5 26t-28.5 68zM584 1193q0 36 25.5 59t68.5 23h609q36 0 65 -24t29 -58q0 -42 -28.5 -68t-65.5 -26h-609 q-44 0 -69 25.5t-25 68.5zM865 562q0 34 29 58.5t65 24.5t65 -24.5t29 -58.5q0 -42 -28.5 -67.5t-65.5 -25.5t-65.5 25.5t-28.5 67.5zM1029 247q0 37 25.5 65.5t67.5 28.5h199q42 0 67.5 -28t25.5 -66q0 -44 -24.5 -69t-68.5 -25h-199q-43 0 -68 25t-25 69zM1122 562 q0 34 29 58.5t65 24.5h327q35 0 58 -24t23 -59q0 -43 -22.5 -68t-58.5 -25h-327q-37 0 -65.5 25.5t-28.5 67.5zM1169 879q0 35 29.5 64.5t64.5 29.5h209q34 0 58 -29t24 -65q0 -43 -23 -68.5t-59 -25.5h-209q-37 0 -65.5 26t-28.5 68zM1461 1193q0 35 23.5 58.5t58.5 23.5 q43 0 68.5 -23t25.5 -59q0 -43 -25.5 -68.5t-68.5 -25.5q-36 0 -59 25.5t-23 68.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2211" d="M0 523q0 185 113.5 328.5t292.5 187.5q50 218 224.5 358t400.5 140q220 0 392.5 -136.5t224.5 -350.5h34q143 0 265 -70.5t193 -192t71 -264.5q0 -212 -148 -365t-360 -160q-21 0 -21 18v142q0 19 21 19q136 7 232.5 108.5t96.5 237.5q0 142 -103 245t-247 103h-172 q-19 0 -19 18l-8 62q-18 173 -148.5 290t-303.5 117q-176 0 -305.5 -118t-146.5 -293l-6 -53q0 -20 -21 -20l-56 -7q-133 -11 -223.5 -110.5t-90.5 -233.5q0 -136 96.5 -237.5t232.5 -108.5q18 0 18 -19v-142q0 -18 -18 -18q-214 7 -362.5 160t-148.5 365zM587 -298 q0 37 27 64q26 24 61 24q37 0 62.5 -25t25.5 -63t-25.5 -63t-62.5 -25t-62.5 25t-25.5 63zM679 89q0 36 25.5 62t62.5 26t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5t-62.5 26.5t-25.5 64.5zM882 -507q0 36 27 65q26 26 61 26q38 0 65 -27t27 -64t-27 -62.5 t-65 -25.5q-36 0 -62 25.5t-26 62.5zM974 -117q0 38 26 66q26 26 62 26q37 0 64 -27t27 -65q0 -37 -26.5 -63.5t-64.5 -26.5q-36 0 -62 26.5t-26 63.5zM1019 269q0 37 27 64q28 26 61 26q38 0 65 -26.5t27 -63.5t-27 -62.5t-65 -25.5q-36 0 -62 25.5t-26 62.5zM1272 -298 q0 36 26 64q26 24 64 24t63 -25t25 -63t-25 -63t-63 -25t-64 25.5t-26 62.5zM1363 89q0 35 27 61.5t64 26.5t62.5 -26t25.5 -62q0 -38 -25.5 -64.5t-62.5 -26.5q-38 0 -64.5 27t-26.5 64z" />
|
||||
<glyph unicode="" horiz-adv-x="2864" d="M0 525q0 -138 68 -257t185.5 -191t256.5 -76q18 0 18 18v142q0 20 -18 20q-136 7 -232.5 108.5t-96.5 235.5q0 132 90.5 230t223.5 114l56 6q19 0 19 20l8 54q17 175 145.5 291.5t303.5 116.5q174 0 304.5 -116.5t147.5 -288.5l8 -62q0 -18 18 -18h172q144 0 246 -102.5 t102 -244.5q0 -134 -96.5 -235.5t-231.5 -108.5q-20 0 -20 -20v-142q0 -18 20 -18q212 7 360 160t148 364q0 121 -46 217q126 151 126 352q0 150 -75 278.5t-204 203.5t-279 75q-246 0 -413 -185q-130 70 -287 70q-225 0 -399 -139.5t-223 -356.5q-179 -44 -292 -187 t-113 -328zM585 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM879 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25 t26.5 63t-27 64.5t-64 26.5q-35 0 -61.5 -27t-26.5 -64zM895 1832q0 -39 26 -63l70 -70q26 -26 57 -27q33 -5 65 23.5t32 67.5t-26 68l-68 65q-24 27 -62 27q-40 0 -67 -26.5t-27 -64.5zM970 -112q0 -35 27 -64q26 -26 61 -26q38 0 65 26t27 64q0 37 -27 63.5t-65 26.5 q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63t-64.5 26q-36 0 -62 -26t-26 -63zM1269 -294q0 -34 25 -61q28 -26 64 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63.5 -25.5t-25.5 -62.5zM1360 93q0 -38 26 -65t63 -27 t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1464 1365q110 106 263 106q155 0 265 -111t110 -266q0 -100 -54 -196q-153 153 -371 153h-34q-47 187 -179 314zM1635 1921q0 -37 27 -62t65 -25t63 25t25 62v218q0 38 -25.5 65t-62.5 27t-64.5 -27.5 t-27.5 -64.5v-218zM2223 1679q0 -37 27 -63q24 -25 59.5 -27.5t66.5 27.5l153 153q28 28 28 65q0 38 -27.5 65t-64.5 27q-35 0 -62 -27l-153 -156q-27 -25 -27 -64zM2309 421q0 -40 26 -66l68 -67q39 -26 68 -26q33 0 59.5 27.5t26.5 65.5q0 36 -28 62l-66 69q-28 26 -65 26 t-63 -26.5t-26 -64.5zM2463 1094q0 -38 28 -63q27 -29 66 -29h216q37 0 64 27t27 65t-27 64.5t-64 26.5h-216q-38 0 -66 -27t-28 -64z" />
|
||||
<glyph unicode="" horiz-adv-x="2297" d="M0 529q0 -213 149 -366.5t363 -163.5q19 0 19 18v143q0 18 -19 18q-137 8 -233.5 110t-96.5 241q0 133 90.5 231t224.5 114l56 4q21 0 21 19l8 58q17 173 146.5 290t304.5 117q174 0 305 -117t149 -290l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5 q0 -138 -97 -240.5t-234 -110.5q-20 0 -20 -18v-143q0 -18 20 -18q214 7 362.5 161.5t148.5 368.5q0 114 -46 214q126 154 126 354q0 152 -75.5 281.5t-204.5 204.5t-280 75q-248 0 -415 -185q-129 69 -289 69q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5 t-115 -328.5zM585 -294q0 -33 26 -61q28 -26 62 -26q38 0 63 25t25 62q0 38 -25.5 63t-62.5 25t-62.5 -25t-25.5 -63zM677 93q0 -38 25.5 -65t62.5 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-62.5 -26t-25.5 -62zM879 -502q0 -35 26 -61q27 -27 62 -27q38 0 64.5 25 t26.5 63t-27 64.5t-64 26.5q-35 0 -61.5 -27t-26.5 -64zM970 -112q0 -35 27 -64q26 -26 61 -26q38 0 65 26t27 64q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1016 272q0 -36 26 -62t62 -26q38 0 64.5 25.5t26.5 62.5t-26.5 63t-64.5 26q-36 0 -62 -26t-26 -63z M1269 -294q0 -34 25 -61q28 -26 64 -26q38 0 63 25t25 62q0 38 -25 63t-63 25t-63.5 -25.5t-25.5 -62.5zM1360 93q0 -38 26 -65t63 -27t62.5 27t25.5 65q0 36 -25.5 62t-62.5 26t-63 -26t-26 -62zM1472 1369q108 108 265 108t266.5 -111t109.5 -269q0 -94 -54 -196 q-154 154 -373 154h-33q-47 186 -181 314z" />
|
||||
<glyph unicode="" horiz-adv-x="2331" d="M0 525q0 -212 149 -366t363 -161q19 0 19 18v143q0 18 -19 18q-136 7 -233 109.5t-97 238.5t90.5 235t224.5 110l57 8q21 0 21 18l7 55q17 175 146.5 293t305.5 118q174 0 305 -117.5t149 -290.5l8 -61q0 -19 18 -19h173q145 0 248.5 -103t103.5 -246q0 -136 -97 -238.5 t-233 -109.5q-22 0 -22 -18v-143q0 -18 22 -18q140 4 257 76t184.5 192t67.5 259q0 146 -69 265q118 106 162 275l18 77q2 2 2 8q0 12 -17 17l-65 18q-70 21 -124.5 61t-86 89.5t-47 101t-15.5 101.5q0 43 11 92l12 66q4 15 -15 24l-85 26q-70 17 -133 17q-59 0 -120 -14 t-126 -44t-126 -85.5t-106 -130.5q-129 53 -254 53q-226 0 -401.5 -140.5t-225.5 -359.5q-180 -45 -293.5 -188t-113.5 -329zM590 -299q0 -36 26 -62t62 -26q38 0 63.5 25t25.5 63t-25.5 63t-63.5 25t-63 -25t-25 -63zM635 89q0 -38 25.5 -64.5t62.5 -26.5q38 0 64 26.5 t26 64.5q0 36 -26 62t-64 26q-37 0 -62.5 -26t-25.5 -62zM886 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM954 -118q0 -38 27 -63q26 -26 61 -26q38 0 65.5 26t27.5 63q0 38 -27.5 65.5t-65.5 27.5 q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1277 -299q0 -36 26 -62t64 -26q37 0 62.5 25.5t25.5 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1322 89q0 -37 27 -64 t64 -27t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-64 -26.5t-27 -61.5zM1441 1395q50 87 138.5 134.5t182.5 49.5q24 0 35 -2v-33q0 -155 83.5 -292.5t231.5 -209.5q-25 -58 -81 -114q-142 126 -344 126h-33q-44 197 -213 341z" />
|
||||
<glyph unicode="" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32 q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15z M1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5 v220q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29 q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM841 -560q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63 q-4 -18 -4 -24zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32q37 -10 68 6t44 60l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5 t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15zM1365 78q0 -37 26 -61q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1475 1369q107 103 261 103 q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312z" />
|
||||
<glyph unicode="" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM841 -560 q0 -27 17 -52.5t52 -35.5q14 -3 26 -3q69 0 85 65l14 63q10 41 -9 73t-56 39q-34 11 -67 -7.5t-44 -54.5l-14 -63q-4 -18 -4 -24zM925 -250q0 -36 26 -62t62 -26q38 0 63 25t25 63q0 37 -25 62t-63 25t-63 -25t-25 -62zM991 -8q-2 -24 14.5 -50t48.5 -32q37 -10 68 6t44 60 l28 96q11 35 -7.5 67t-56.5 43q-35 11 -68 -8.5t-44 -56.5l-24 -96q-3 -13 -3 -29zM1286 -237q0 -27 16 -51.5t49 -34.5q5 0 15 -2t15 -2q65 0 81 70l15 64q11 34 -7.5 67t-54.5 44q-40 10 -72.5 -8.5t-43.5 -56.5l-10 -63q0 -2 -1.5 -12t-1.5 -15zM1365 78q0 -37 26 -61 q24 -26 62 -26t63 25t25 62q0 38 -25 63t-63 25t-63 -25t-25 -63zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337z" />
|
||||
<glyph unicode="" horiz-adv-x="2883" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM898 1841q0 -37 27 -64l69 -70q25 -25 59 -28q33 -5 65 24t32 68q0 37 -27 64l-67 70q-26 26 -64 26q-40 0 -67 -26t-27 -64zM1023 -118 q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27 q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25 t-26 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33q-47 190 -181 312zM1645 1931q0 -38 26.5 -65t64.5 -27t63.5 26.5t25.5 65.5v220q0 39 -25.5 65.5t-63.5 26.5t-64.5 -27t-26.5 -65v-220zM2240 1687 q0 -39 25 -64q22 -25 58.5 -27.5t67.5 27.5l154 154q28 26 28 64t-28 64q-26 28 -64 28q-37 0 -62 -28l-154 -154q-25 -25 -25 -64zM2323 416q0 -37 27 -64l69 -67q29 -27 66 -27l2 -2q35 0 58 29q28 26 28 64q0 37 -28 65l-66 66q-29 29 -65 29q-38 0 -64.5 -27.5 t-26.5 -65.5zM2479 1096q0 -39 28 -63q25 -28 64 -28h220q38 0 65 26.5t27 64.5t-26.5 63.5t-65.5 25.5h-220q-39 0 -65.5 -25.5t-26.5 -63.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2298" d="M0 530q0 -179 106.5 -320t275.5 -188l-70 -181q-8 -23 15 -23h227l-152 -449h31l465 604q6 7 2 14.5t-15 7.5h-234l266 496q12 23 -15 23h-316q-15 0 -25 -16l-114 -307q-115 29 -190 123.5t-75 215.5q0 135 90 233t225 114l54 3q19 0 24 15l8 63q17 173 146.5 290.5 t305.5 117.5q174 0 305.5 -117.5t149.5 -290.5l8 -63q0 -18 19 -18h172q143 0 246 -102.5t103 -244.5q0 -139 -95.5 -241.5t-232.5 -109.5q-21 0 -21 -19v-143q0 -18 21 -18q141 4 258.5 76.5t185.5 193t68 261.5q0 117 -46 215q122 154 122 351q0 152 -75.5 281.5t-205 205 t-281.5 75.5q-115 0 -223.5 -48t-187.5 -133q-129 69 -290 69q-227 0 -402.5 -140.5t-224.5 -359.5q-177 -41 -292.5 -186t-115.5 -330zM1023 -118q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270 q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5 t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25t-26 -63zM1475 1369q107 103 261 103q157 0 267.5 -109.5t110.5 -266.5q0 -105 -50 -193q-154 154 -375 154h-33 q-47 190 -181 312z" />
|
||||
<glyph unicode="" horiz-adv-x="2328" d="M0 529q0 -177 106 -316.5t275 -190.5l-69 -181q-7 -22 15 -22h226l-138 -446h30l451 600q6 7 2 14.5t-15 7.5h-232l264 495q11 23 -14 23h-316q-14 0 -24 -16l-114 -307q-114 29 -189.5 124.5t-75.5 214.5q0 133 90.5 231t224.5 114l56 8q21 0 21 19l8 54 q17 173 146.5 290t304.5 117q174 0 305 -117.5t149 -289.5l8 -61q0 -20 18 -20h173q145 0 248 -101.5t103 -243.5q0 -136 -96 -236t-235 -110q-20 0 -20 -20v-145q0 -19 20 -19q213 7 361.5 161.5t148.5 368.5q0 139 -70 261q122 118 161 280l20 73q1 1 1 7q0 13 -16 17 l-66 18q-92 27 -156 89.5t-90.5 130t-25.5 134.5q0 44 11 91l12 65q4 16 -15 25l-85 26q-75 15 -132 15q-59 1 -120.5 -12.5t-126.5 -43t-125.5 -84t-105.5 -128.5q-136 49 -254 49q-226 0 -401 -140.5t-225 -358.5q-177 -42 -292 -185.5t-115 -328.5zM1023 -118 q0 -39 26 -63q26 -26 62 -26q38 0 65 26t27 63q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1023 270q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM1023 -510q0 -35 26 -61q27 -27 62 -27 q38 0 65 25.5t27 62.5q0 38 -27 65.5t-65 27.5q-35 0 -61.5 -27.5t-26.5 -65.5zM1368 89q0 -38 26.5 -64.5t63.5 -26.5t62.5 26.5t25.5 64.5q0 36 -25.5 62t-62.5 26t-63.5 -26t-26.5 -62zM1368 -299q0 -36 26 -62t64 -26t63 25.5t25 62.5q0 38 -25 63t-63 25t-64 -25 t-26 -63zM1440 1395q53 89 143 137.5t188 48.5h23v-34q0 -102 36 -198t108.5 -177t171.5 -129q-27 -60 -81 -110q-146 125 -343 125h-35q-45 201 -211 337z" />
|
||||
<glyph unicode="" horiz-adv-x="2267" d="M0 771q0 39 27 66q28 26 64 26h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 32q0 37 25 65l157 152q24 25 63 25q38 0 63.5 -24t25.5 -61q0 -39 -26 -68l-152 -152q-65 -51 -131 0q-25 27 -25 63zM305 1509q0 37 25 65 q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM577 771q0 149 75 277.5t203.5 203.5t277.5 75q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74.5 -278t-202.5 -202.5t-278 -74.5 t-278 74.5t-203 202.5t-75 278zM1042 -58q0 38 26.5 64t64.5 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66v212zM1042 1595v218q0 37 27 64t64 27t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM1053 1134 q139 -17 233.5 -123t94.5 -249q0 -133 -83.5 -234.5t-211.5 -129.5q32 -4 47 -4q156 0 266.5 110.5t110.5 266.5q0 154 -110.5 263t-266.5 109q-41 0 -80 -9zM1631 189q0 37 24 60q24 25 60 25q39 0 64 -25l156 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152 q-24 27 -24 68zM1631 1354q0 40 24 63l152 157q28 26 63 26q38 0 64.5 -27t26.5 -64q0 -40 -26 -66l-156 -152q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 771q0 38 26 66q26 26 61 26h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5 t-25 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1110" d="M0 771q0 149 75 277.5t203 203.5t277 75q150 0 278 -75t203 -203t75 -278t-75 -278t-203 -202.5t-278 -74.5t-277.5 74.5t-202.5 202.5t-75 278zM475 1134q139 -17 233.5 -123t94.5 -249q0 -133 -83 -234.5t-211 -129.5q32 -4 46 -4q156 0 267 110.5t111 266.5 q0 154 -111 263t-267 109q-41 0 -80 -9z" />
|
||||
<glyph unicode="" horiz-adv-x="1688" d="M0 239q0 21 1 31v9q0 3 0.5 6t0.5 5t0.5 5t0.5 4v2q0 5 2 12.5t2 9.5v3q0 2 0.5 5t0.5 4l9 39q0 1 1 2v2l4 15q1 1 1 2q1 2 1 3v3q6 20 11 30q0 1 2 3q1 2 5 16q27 61 67 115l6 8q1 1 3 4t3 4q1 2 7 6q1 3 4 6t4 6q6 4 7 8q2 1 7 6l7 8l811 889l-41 -235l727 778 l-446 -868l446 337l-404 -811l289 199l-499 -889q0 -1 -2 -4.5t-3 -5.5q-1 -1 -2 -4t-2 -5q-1 -1 -2.5 -5t-2.5 -5q-69 -134 -198 -215t-285 -81q-147 0 -272 73t-198 198t-73 272zM128 239q0 -172 121.5 -293.5t293.5 -121.5q131 0 237 75.5t150 196.5q27 68 27 143 q0 172 -121 293t-293 121q-160 0 -277 -107q-65 -57 -101.5 -137t-36.5 -170z" />
|
||||
<glyph unicode="" horiz-adv-x="2317" d="M0 757q0 38 29 65q27 27 66 27h220q38 0 64.5 -27t26.5 -65q0 -40 -26.5 -67t-64.5 -27h-220q-40 0 -67.5 27t-27.5 67zM312 1505q0 37 26 66q30 27 70 27q34 0 63 -27l155 -158q27 -25 27 -64q0 -38 -26.5 -64.5t-63.5 -26.5q-41 0 -65 27l-160 154q-26 28 -26 66z M590 757q0 113 45.5 217.5t122 180t181.5 121t219 45.5q153 0 284 -76.5t207 -206.5t76 -281q0 -24 -3 -45q-45 27 -103 27q-39 0 -77 -16q1 11 1 34q0 156 -113 266.5t-272 110.5q-158 0 -270.5 -110.5t-112.5 -266.5v-19q-47 -3 -90 -27q-1 -1 -11 -8t-20 -14.5t-25 -20 t-28 -25.5q-11 51 -11 114zM593 367v16q-1 15 2 35q8 57 45 109q21 26 29 33q1 3 4 6l4 4q4 2 13 11q3 4 8.5 8t7.5 6q8 8 15 11l18 12q23 15 53 15h3q16 0 28 -3q5 -2 14 -7v-1q23 -10 36.5 -30.5t13.5 -44.5q0 -27 -15 -45q-10 -14 -24 -25q-3 -1 -6.5 -3t-4.5 -2l-6 -4 q-6 -5 -10.5 -9t-11.5 -11.5t-12 -14.5t-9.5 -16.5t-5.5 -18.5v-14v-2q6 -24 12 -38q11 -22 36 -47q2 -3 26 -27q138 -125 129 -267q-3 -48 -22.5 -92.5t-45.5 -75t-42 -45.5t-27 -22q-1 -1 -6 -4.5t-8 -4.5q-13 -6 -23 -7q-14 -2 -21 -2q-48 0 -76 32q-23 28 -19 63t35 57 l2 2q2 2 5 4.5t7.5 6.5t9 9t9 11t9 12.5t9 14.5t7.5 16t5 17.5t2 18.5q3 32 -16 64q-8 17 -24 35q-11 13 -16 17q-15 18 -16 19q-3 2 -7.5 6t-6.5 5q-24 22 -36 38q-20 25 -26 34q-31 42 -42 83q-7 23 -8 34q0 3 -2 8.5t-2 9.5zM1007 403q0 9 1 15q4 35 21 68.5t37.5 56.5 t40 40.5t33.5 26.5l13 8q24 15 53 15q18 0 32 -3q1 0 5.5 -2.5t6.5 -4.5q2 0 3 -1q1 0 8 -5q32 -19 40 -58q0 -3 0.5 -7t0.5 -5q0 -5 -2 -12.5t-2 -9.5q-11 -36 -45 -53q-53 -35 -56 -74q-1 -13 0 -23q4 -19 18 -42q18 -26 26 -34q25 -25 30 -29q20 -18 50 -54 q87 -104 79 -213q-3 -48 -22.5 -93t-45.5 -74.5t-43 -45.5t-27 -22l-13 -9q-17 -6 -22 -7q-18 -2 -21 -2h-3q-13 0 -20 2q-3 0 -8.5 1.5t-7.5 1.5q-1 0 -3 1t-4 2.5t-3 1.5q-24 17 -28 22q-25 29 -20 63.5t36 56.5l3 4q4 3 9.5 8.5l12.5 12.5t13.5 17t12.5 20.5t9.5 23.5 t4.5 26q2 64 -74 135q-30 27 -47 46q-89 105 -82 208zM1065 1593v221q0 39 27.5 66t65.5 27q39 0 66 -27t27 -66v-221q0 -38 -27 -63t-66 -25q-38 0 -65.5 25t-27.5 63zM1423 418q4 35 21 68.5t37.5 56.5t40 40.5t32.5 26.5l14 8q4 3 11 8q18 7 40 7q54 0 82 -41 q8 -11 11 -24q2 -4 2 -9v-12q0 -50 -48 -75q-51 -34 -56 -74q-6 -54 73 -128q140 -124 131 -267q-3 -48 -22.5 -92.5t-46 -75t-42 -45.5t-26.5 -22q-26 -16 -44 -17q-5 -1 -16 -1q-48 0 -74 32q-24 28 -20 63t34 57q5 2 19 15t30.5 41t18.5 56q3 64 -75 135q-66 58 -100 124 q-36 70 -27 145zM1667 1349q0 40 24 64l156 158q29 27 65 27q38 0 65.5 -27.5t27.5 -65.5q0 -40 -28 -66l-158 -154q-29 -27 -65 -27q-37 0 -62 26.5t-25 64.5zM1913 757q0 35 28 65q25 27 62 27h220q38 0 66.5 -27.5t28.5 -64.5q0 -39 -28 -66.5t-67 -27.5h-220 q-39 0 -64.5 27t-25.5 67z" />
|
||||
<glyph unicode="" horiz-adv-x="842" d="M3 781v2q-1 13 0.5 39t10.5 86t26.5 123t54.5 144t87.5 154t133.5 148.5t185 132.5q25 14 52.5 6t40.5 -33q14 -25 6.5 -53t-32.5 -42q-210 -115 -323 -325q86 40 174 40q172 0 295 -122.5t123 -294.5q0 -13 -0.5 -25.5t-4.5 -55t-12 -82t-25 -99t-40.5 -113t-62 -117.5 t-86 -119.5t-115.5 -112t-148 -101.5q-15 -9 -33 -9q-41 0 -62 37q-14 25 -6 52.5t33 40.5q215 120 326 329q-87 -41 -182 -41q-111 0 -206.5 55t-152 150t-57.5 206zM184 786q0 -98 69 -167t166 -69q91 0 158.5 60.5t77.5 150.5l1 24q0 4 1 5q-1 96 -70.5 162.5 t-167.5 66.5q-89 0 -155.5 -58t-77.5 -145l-2 -27v-3z" />
|
||||
<glyph unicode="" horiz-adv-x="1846" d="M0 1002q0 150 96.5 267t246.5 152q36 178 181.5 293.5t332.5 115.5q180 0 320.5 -110.5t183.5 -288.5h30q121 0 226 -52t167.5 -142.5t62.5 -196.5q0 -180 -138 -305q0 -56 -34.5 -128.5t-92.5 -131.5t-117 -72q-20 -99 -92 -167t-174 -91q48 -48 48 -113 q0 -79 -56 -134.5t-135 -55.5q-78 0 -134 55.5t-56 134.5q0 9 4.5 28t4.5 29h-9q-94 0 -161 67.5t-67 161.5q0 37 39 113q-78 41 -125 134h-133q-175 15 -297 138.5t-122 298.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1569" d="M118 673q-180 384 55 724q164 237 505 290q26 7 58 9h67q466 -14 683 -414q102 -189 51 -417q-41 -181 -137 -338q-207 -322 -427 -520q-12 -12 -32 -28q-74 -56 -136.5 -58t-139.5 48q-46 27 -79 63q-314 320 -468 641zM130 909q3 -17 10 -47t10 -43q45 -201 185 -312.5 t348 -131.5q46 -5 54.5 3.5t9.5 55.5q-2 13 -5 41.5t-6 41.5q-40 215 -203 313q-29 18 -66.5 36t-65 29t-73.5 28.5t-67 26.5q-25 10 -85 12q-55 0 -46 -53zM855 440q-4 -49 6.5 -59.5t58.5 -4.5q61 7 128 23q171 43 280 182q54 66 82.5 143t50.5 183q8 36 -3.5 49.5 t-46.5 8.5q-94 -16 -170 -43q-184 -69 -280 -185.5t-106 -296.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1609" d="M0 794q0 31 21 53t51 22q31 0 52 -22t21 -53q0 -30 -21.5 -51t-51.5 -21t-51 21.5t-21 50.5zM211 794q0 31 21 53t51 22h344l-243 243q-22 20 -22 50.5t22 52.5t52 22t52 -22l242 -242v342q0 31 22 53t53 22q30 0 51 -22t21 -53v-345l244 245q22 22 51.5 22t52.5 -22 q19 -22 19 -52.5t-19 -50.5l-243 -243h344q29 0 50.5 -22t21.5 -53q0 -29 -21.5 -50.5t-50.5 -21.5h-345l244 -244q19 -20 19 -50t-19 -52q-23 -22 -52.5 -22t-51.5 22l-244 245v-346q0 -31 -21 -52.5t-51 -21.5q-31 0 -53 21.5t-22 52.5v343l-242 -242q-22 -22 -52 -22 t-52 22t-22 52t22 50l245 244h-346q-30 0 -51 21.5t-21 50.5zM213 277.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -51.5t-52.5 -22t-50.5 22q-22 22 -22 51.5zM213 1313.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -52.5q-22 -22 -52.5 -22 t-50.5 22q-22 23 -22 52.5zM730 64q0 29 22 50.5t53 21.5q30 0 51 -21.5t21 -50.5q0 -31 -21 -52.5t-51 -21.5q-31 0 -53 21.5t-22 52.5zM730 1527q0 31 22 52.5t53 21.5q30 0 51 -21.5t21 -52.5q0 -29 -21 -50.5t-51 -21.5q-31 0 -53 21.5t-22 50.5zM1249 277.5 q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -51.5t-52.5 -22t-50.5 22q-22 22 -22 51.5zM1249 1313.5q0 29.5 22 51.5q20 22 50.5 22t52.5 -22t22 -51.5t-22 -52.5q-22 -22 -52.5 -22t-50.5 22q-22 23 -22 52.5zM1463 794q0 31 21.5 53t52.5 22q29 0 50.5 -22 t21.5 -53q0 -29 -21.5 -50.5t-50.5 -21.5q-31 0 -52.5 21.5t-21.5 50.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2054" d="M0 605q104 5 176 80.5t72 179.5q0 -104 72 -179.5t176 -80.5q-104 -5 -176 -80.5t-72 -179.5q0 104 -72 179.5t-176 80.5zM248 1373q202 10 342.5 156.5t140.5 349.5q0 -203 141 -349.5t343 -156.5q-133 -6 -244 -75.5t-175.5 -184t-64.5 -248.5q0 204 -140.5 351 t-342.5 157zM602 224q152 7 258 117.5t106 263.5q0 -153 105.5 -263.5t257.5 -117.5q-152 -7 -257.5 -117.5t-105.5 -263.5q0 153 -106 263.5t-258 117.5zM1329 730q152 7 257 117t105 264q0 -153 106 -263.5t258 -117.5q-152 -7 -258 -117t-106 -263q0 153 -105 263 t-257 117z" />
|
||||
<glyph unicode="" horiz-adv-x="1110" d="M1 704q0 -147 74.5 -274.5t202.5 -203t276 -75.5q149 0 278 75.5t204.5 203t75.5 274.5q0 96 -56 228.5t-134 245.5q-71 91 -166.5 200.5t-138.5 151.5q-24 20 -63 59l-137 -138q-99 -96 -191 -222t-158.5 -271.5t-66.5 -253.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1562" d="M1 923q0 159 62 304t167 249t249.5 166t302.5 62q159 0 303.5 -62t249 -166.5t166.5 -249t62 -303.5q0 -259 -153.5 -462.5t-395.5 -278.5v-351h-452v347q-247 72 -404 278t-157 467zM173 923q0 -248 180 -426q178 -179 429 -179q165 0 305.5 81t222.5 220.5t82 303.5 q0 123 -48.5 235.5t-130.5 194t-195 130t-236 48.5t-235.5 -48.5t-194.5 -130t-130.5 -194t-48.5 -235.5zM235 885v77h231v-77h-231zM351 1262l56 55l162 -162l-55 -56zM621 736q0 67 46.5 116t113.5 51l291 479l70 -37l-215 -515q28 -40 28 -94q0 -70 -49 -118.5 t-119 -48.5q-69 0 -117.5 48.5t-48.5 118.5zM761 1234v231h74v-231h-74zM1074 886v79h231v-79h-231z" />
|
||||
<glyph unicode="" horiz-adv-x="1514" d="M-10 497q0 141 77 323.5t198 353.5q250 330 433 498l80 77q40 -42 88 -77q66 -67 201 -222.5t231 -282.5q114 -162 193 -346.5t79 -323.5q0 -160 -62 -305.5t-167.5 -251.5t-252.5 -168.5t-310 -62.5q-160 0 -305.5 60.5t-251.5 165t-168.5 251t-62.5 311.5zM231 810 q0 -133 56 -212t170 -79q115 0 171.5 78.5t57.5 212.5q-1 134 -57.5 213t-171.5 79q-114 0 -170 -79t-56 -213zM399 810q0 24 0.5 37t2 35t5 34.5t9.5 26t16.5 19.5t24.5 6q22 0 35 -13t18.5 -41t6.5 -48t1 -56t-1 -55.5t-6.5 -47.5t-18.5 -41t-35 -13q-14 0 -24.5 6 t-16.5 19.5t-9.5 26t-5 34.5t-2 34.5t-0.5 36.5zM461 -17h141l532 1146h-144zM920 302q2 -134 58.5 -213t170.5 -79q115 0 170.5 78.5t56.5 213.5q-1 134 -56.5 212.5t-170.5 78.5q-114 0 -170.5 -78.5t-58.5 -212.5zM1088 302q0 36 1 55.5t6.5 47.5t18.5 41t35 13 q15 0 25.5 -6t17 -20t10.5 -25.5t5 -34.5l1.5 -34.5t0.5 -36.5q0 -26 -0.5 -37.5l-1.5 -34.5t-5 -34.5t-10.5 -25.5t-17 -20t-25.5 -6q-22 0 -35 13t-18.5 41t-6.5 48t-1 56z" />
|
||||
<glyph unicode="" horiz-adv-x="1737" d="M1 387h207v388h2l219 -388h212v710h-207v-379h-2l-207 379h-224v-710zM697 370h152l278 744h-151zM1003 387h221l31 101h226l30 -101h227l-259 710h-214zM1303 641l68 218h3l64 -218h-135z" />
|
||||
<glyph unicode="" horiz-adv-x="1771" d="M-8 117q0 8 2 22v508q44 -79 123 -126.5t172 -47.5q94 0 172.5 47.5t122.5 126.5q44 -79 122.5 -126.5t172.5 -47.5q93 0 171.5 47.5t122.5 126.5q45 -79 123 -126.5t171 -47.5t172 47.5t123 126.5v-513q0 -3 0.5 -8.5t0.5 -8.5q0 -2 -0.5 -7.5t-0.5 -8.5q-5 -37 -32 -64 t-64 -32q-3 0 -8.5 -1t-8.5 -1q-2 0 -7.5 1t-8.5 1h-1511q-3 0 -8 -1t-8 -1t-8.5 1t-7.5 1q-36 5 -62 30t-34 60q-2 14 -2 22zM580 1299.5q0 25.5 18 44.5l236 237l3 2q1 0 1 1q1 0 1 1q1 0 1 1h1q1 0 1 1t1 2h2l1 1h1l1 1h1l1 1h1q1 1 2 1h1q0 1 2 1q1 1 2 1l4 2h1q1 0 1 1 h2h1h3h1l1 1h2h1h6h2h2q1 0 2 -1h2h1h3q0 -1 1 -1h1h1q2 -2 3 -2l2 -1h1h1l1 -1h1l1 -1q1 0 1 -1h2q1 0 1 -0.5t1 -0.5q1 -1 2 -1q0 -2 1 -2l1 -1h2l1 -1l1 -1l1 -1l2 -2l237 -237q19 -19 19 -44.5t-19 -43.5q-18 -19 -43.5 -19t-43.5 19l-131 130v-736q0 -25 -18 -43 t-44 -18t-44.5 18t-18.5 43v736l-130 -130q-19 -19 -44.5 -19t-43.5 19q-18 18 -18 43.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2357" d="M0 939q0 148 92.5 265t233.5 149q41 176 181.5 289t321.5 113q176 0 314.5 -110.5t179.5 -282.5h28q176 0 300.5 -123.5t124.5 -299.5q0 -1 -0.5 -4t-0.5 -6q120 -128 120 -304q0 -121 -60.5 -224.5t-163 -163.5t-222.5 -60q-154 0 -273.5 95t-157.5 241h-609 q-171 7 -290 130.5t-119 295.5zM145 939q0 -112 77.5 -194.5t186.5 -87.5h605q6 4 12 4h104q5 0 9 -4h229q109 5 187 87.5t78 194.5q0 113 -84 195.5t-198 82.5h-138q-15 0 -15 15l-7 50q-14 139 -119 233.5t-243 94.5q-142 0 -246 -94t-118 -234l-6 -50q0 -15 -17 -15h-43 q-108 -12 -181 -91t-73 -187zM806 -22q-40 52 0 104l121 123q22 19 55 19q30 0 49 -19t19 -50q0 -32 -19 -51l-122 -126q-20 -20 -52 -20q-31 0 -51 20zM1168 513q34 -86 110.5 -139t170.5 -53q124 0 210.5 89t86.5 215q0 62 -20 112q-53 -98 -148.5 -159t-209.5 -65h-200z M1376 -40q0 30 21.5 50t51.5 20q29 0 53 -22q20 -20 20 -48v-175q0 -30 -21.5 -52t-51.5 -22t-51.5 22t-21.5 52v175zM1846 155q0 29 20.5 49t50.5 20q31 0 50 -19l126 -123q21 -23 21 -51q0 -30 -21.5 -51.5t-52.5 -21.5q-33 0 -53 20l-121 126q-20 23 -20 51zM1846 1095 q0 31 20 50l121 126q22 20 53 20q30 0 53 -20q21 -24 21 -54q0 -28 -21 -51l-126 -123q-20 -20 -50 -20t-50.5 20.5t-20.5 51.5zM2040 625q0 30 20 51t50 21h173q31 0 53 -21t22 -51q0 -31 -22 -52.5t-53 -21.5h-173q-30 0 -50 21.5t-20 52.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2436" d="M-1 899q0 184 115.5 328.5t291.5 185.5q50 219 225 359t401 140q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -184 -113 -329q103 -88 241 -93l70 -6q19 0 19 -20v-82q1 -162 -78 -299t-215.5 -216.5t-297.5 -79.5q-123 0 -233.5 47 t-189.5 127t-125.5 190t-46.5 231h-735q-214 10 -363 163t-149 367zM181 899q0 -139 96.5 -241t233.5 -109h1194q137 7 233.5 109t96.5 241q0 140 -104 243t-246 103h-173q-18 0 -18 18l-8 62q-18 173 -149 289.5t-305 116.5q-176 0 -305.5 -116.5t-145.5 -289.5l-8 -62 q0 -18 -21 -18h-56q-134 -16 -224.5 -114.5t-90.5 -231.5zM1400 369q0 -127 64 -231.5t164.5 -160.5t212.5 -56q99 0 194.5 48t169 145.5t91.5 223.5q-172 35 -290 139q-135 -104 -301 -108h-305z" />
|
||||
<glyph unicode="" horiz-adv-x="2436" d="M0 896q0 184 115 328t292 185q50 219 225 359.5t401 140.5q221 0 393.5 -137t224.5 -351h35q144 0 266 -69.5t193 -190.5t71 -265q0 -32 -3 -65q104 -82 164 -203.5t60 -259.5q0 -123 -47.5 -233.5t-127.5 -189.5t-190.5 -125.5t-231.5 -46.5q-120 0 -230 47 t-189.5 126.5t-127 189.5t-47.5 230h-734q-214 10 -363 163t-149 367zM182 896q0 -139 96.5 -241.5t233.5 -109.5h1194q137 7 234 109.5t97 241.5q0 140 -104 242.5t-247 102.5h-173q-18 0 -18 18l-8 62q-18 173 -149 290t-305 117q-175 0 -304.5 -117t-146.5 -290l-8 -62 q0 -18 -21 -18h-56q-134 -16 -224.5 -114t-90.5 -231zM1383 351q10 -180 146.5 -302t310.5 -122q96 0 181 37.5t143 99.5t91 141.5t33 162.5q0 78 -31.5 157t-90.5 144q-62 -132 -186 -215t-274 -88h-308q0 -3 2 -13q-12 -2 -17 -2z" />
|
||||
<glyph unicode="" horiz-adv-x="1755" d="M0 235q0 126 72.5 223t193.5 135q51 174 212 266v37q0 233 147.5 410.5t373.5 219.5q57 10 115 10h3q33 0 75 -5q41 -3 78 -12l97 -30q21 -11 17 -28l-14 -75q-12 -51 -12 -103q0 -56 17.5 -114.5t53 -115t97 -103t141.5 -70.5l76 -22q18 -4 18 -19q0 -6 -1 -8l-19 -73 q-9 -39 -23 -78q-24 -70 -75 -146q0 1 -1 1q-70 -101 -175 -168q22 -54 22 -132q0 -158 -110.5 -269.5t-265.5 -111.5h-731q-155 0 -268.5 113t-113.5 268zM211 235q0 -72 49.5 -122.5t121.5 -50.5h731q69 0 119.5 51t50.5 122q0 69 -50.5 119.5t-119.5 50.5h-140 q-17 0 -27 24l-9 68q-11 92 -79.5 154t-161.5 62q-91 0 -157.5 -62t-77.5 -154l-11 -59q0 -24 -20 -24l-67 -9q-66 -6 -109 -54.5t-43 -115.5zM683 918h13q148 0 265.5 -83.5t164.5 -223.5q124 0 217 -77q111 69 163 187q-166 84 -259.5 240t-93.5 332v36q-5 0 -13 0.5 t-13 0.5q-98 0 -189 -42t-154 -120l-3 2q-87 -108 -98 -252z" />
|
||||
<glyph unicode="" horiz-adv-x="2539" d="M0 521q0 -39 30 -66q26 -30 67 -30h1567q46 0 78 -32t32 -79q0 -46 -31.5 -76.5t-78.5 -30.5t-78 31q-26 28 -64 28q-40 0 -68.5 -27.5t-28.5 -65.5q0 -40 30 -67q90 -88 209 -88q125 0 214 86t89 210t-89.5 213.5t-213.5 89.5h-1567q-40 0 -68.5 -28t-28.5 -68zM0 871 q0 -37 30 -65q28 -28 67 -28h2138q125 0 214.5 87t89.5 210q0 124 -89.5 212t-214.5 88q-123 0 -208 -85q-29 -26 -29 -71q0 -41 27.5 -67t67.5 -26q39 0 67 26q30 33 75 33q46 0 77.5 -32t31.5 -78t-31.5 -77t-77.5 -31h-2138q-40 0 -68.5 -28t-28.5 -68zM168 133 q0 -38 26 -62q26 -26 62 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM269 1192q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5zM592 1438q0 -38 26 -62q26 -26 62 -26q39 0 66 25 t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM602 201q0 -37 27 -62q26 -26 61 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1048 1249q0 -38 26 -62q26 -26 62 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5 q-36 0 -62 -26.5t-26 -63.5zM1082 77q0 -37 27 -62q26 -26 61 -26q39 0 66 25t27 63q0 37 -27.5 63.5t-65.5 26.5q-36 0 -62 -26.5t-26 -63.5zM1560 1266q0 -37 26 -61q27 -27 62 -27q39 0 66 25t27 63q0 37 -27.5 64t-65.5 27q-35 0 -61.5 -27t-26.5 -64zM2103 513 q0 -38 26 -62q26 -26 62 -26q39 0 65.5 25t26.5 63q0 37 -27 63.5t-65 26.5q-36 0 -62 -26.5t-26 -63.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1755" d="M0 239q0 -155 113.5 -268.5t268.5 -113.5h731q155 0 265.5 112t110.5 270q0 77 -22 131q133 85 210.5 226.5t77.5 302.5q0 130 -50.5 248.5t-136.5 204t-204 136.5t-247 51q-175 0 -322.5 -86t-232 -233t-84.5 -321v-36q-161 -92 -212 -266q-121 -38 -193.5 -135 t-72.5 -223zM211 239q0 67 43 115t109 54l67 9q20 0 20 24l11 60q11 92 77.5 154t157.5 62q93 0 161.5 -62t79.5 -154l9 -69q10 -24 27 -24h140q69 0 119.5 -50t50.5 -119q0 -72 -50.5 -123t-119.5 -51h-731q-72 0 -121.5 51t-49.5 123zM683 921q11 175 135.5 294t298.5 119 q178 0 302.5 -127t124.5 -308q0 -112 -54 -207.5t-147 -154.5q-94 78 -217 78q-47 140 -164.5 223t-265.5 83h-13z" />
|
||||
<glyph unicode="" horiz-adv-x="2216" d="M3 768q2 54 53 168.5t142 245.5q298 417 841 440v47q0 33 22.5 53.5t51.5 20.5q30 0 53 -20.5t23 -53.5v-47q157 -7 293 -48t236.5 -106.5t172 -135t128.5 -150.5q66 -95 113 -202.5t65 -171.5t19 -65v-9v-11q0 -28 -22.5 -46.5t-52.5 -18.5q-50 0 -64 28 q-125 140 -272 140q-55 -3 -110 -24.5t-88 -44.5t-62 -46.5t-30 -24.5q-30 -28 -57 -28q-36 0 -55 19q-116 116 -214 141v-786v-8v-14t-0.5 -18t-1.5 -22t-4 -24.5t-6.5 -27t-9.5 -28t-13.5 -28.5t-18 -27.5t-22.5 -26.5q-81 -94 -233 -94q-162 0 -243 94q-19 19 -33.5 41 t-22 43.5t-13 41t-6.5 38.5t-1.5 31.5t0.5 25t1 13.5q0 29 25 50t59 15q28 0 47 -24.5t19 -59.5q-10 -65 27 -112q33 -47 141 -47q83 0 121 38q21 21 30.5 51t8.5 50l-1 20v785q-117 -28 -206 -122q-7 -13 -25 -24.5t-32 -11.5q-28 0 -64 36q-128 143 -272 140 q-64 -1 -120 -21t-84 -40.5t-58 -48t-34 -30.5q-33 -23 -54.5 -23t-51.5 18q-26 16 -31.5 34t-3.5 53zM226 920q108 57 205 57h9q184 0 336 -142q61 53 148 94t189 48h9q184 0 336 -142q61 53 148 94t189 48h10q90 0 187 -47q-71 137 -94 177q-287 374 -793 374 q-253 0 -452 -96t-325 -278q-40 -56 -102 -187z" />
|
||||
<glyph unicode="" horiz-adv-x="2884" d="M0 80q0 -38 29 -64q27 -27 65 -27h627q41 0 72.5 -30t31.5 -73t-31.5 -74t-72.5 -31t-73 32q-29 26 -65 26q-38 0 -64 -25.5t-26 -63.5t26 -64q85 -85 202 -85q118 0 201 83.5t83 201.5t-83 201.5t-201 83.5h-627q-38 0 -66 -27t-28 -64zM0 401q0 -36 29 -62 q26 -26 65 -26h1170q118 0 201.5 83.5t83.5 201.5t-83 200t-202 82q-121 0 -201 -81q-25 -26 -25 -65t24.5 -63.5t63.5 -24.5q38 0 66 25q30 30 72 30t72.5 -30t30.5 -73t-30.5 -74t-72.5 -31h-1170q-38 0 -66 -27.5t-28 -64.5zM617 1099q0 38 28 66q28 26 64 26h217 q37 0 62 -27t25 -65t-25 -64.5t-62 -26.5h-217q-38 0 -65 27t-27 64zM922 1837q0 37 25 65q31 26 68 26q35 0 63 -26l152 -157q26 -24 26 -63q0 -38 -26 -63.5t-63 -25.5q-39 0 -63 26l-157 152q-25 27 -25 66zM1194 1112v7q3 146 79 269.5t203 195t274 71.5 q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74 -277.5t-201 -202t-277 -75.5h-22q-11 0 -18.5 8t-7.5 19v130q0 21 23 21h26q154 1 263.5 111.5t109.5 265.5q0 154 -110.5 263t-266.5 109q-151 0 -260 -104t-115 -253q0 -9 -8.5 -18.5t-27.5 -9.5h-121 q-24 0 -24 26zM1659 58v212q0 38 26.5 64t64.5 26q40 0 65.5 -26t25.5 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64.5 27t-26.5 66zM1659 1923v218q0 37 26.5 64t64.5 27t64.5 -27t26.5 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64.5 24.5t-26.5 61.5zM2248 517q0 37 24 60 q24 25 61 25q39 0 64 -25l155 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM2248 1682q0 40 24 63l152 157q28 26 63 26q37 0 64 -27t27 -64q0 -40 -26 -66l-155 -152q-29 -26 -64 -26q-36 0 -60.5 25.5t-24.5 63.5zM2489 1099q0 38 26 66 q26 26 61 26h216q37 0 65 -27.5t28 -64.5t-28 -64t-65 -27h-216q-37 0 -62 26.5t-25 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2316" d="M0 528q0 185 113.5 328t292.5 183q37 165 149.5 288.5t269.5 176.5q99 34 206 34q130 0 251 -51q45 75 105.5 130t125 84.5t125.5 43.5t120 14q61 0 131 -17l87 -27q22 -9 15 -24l-15 -64q-11 -50 -11 -92q0 -50 15.5 -101t46.5 -100t85 -89t123 -61l66 -23q16 -4 16 -17 q0 -3 -2 -7l-19 -72q-44 -172 -160 -274q64 -112 69 -239q1 -8 1 -24q0 -143 -71 -264.5t-192.5 -192.5t-264.5 -71h-1153q-143 0 -264 71t-191 192.5t-70 264.5zM182 528q0 -142 102 -246t241 -104h1153q142 0 243.5 103t101.5 247q0 140 -102 241.5t-243 101.5h-190 l-11 80q-16 162 -134 276.5t-281 127.5q-5 0 -15.5 1t-15.5 1q-81 0 -164 -31v2q-117 -45 -196.5 -146t-95.5 -231l-7 -77l-73 -3q-135 -16 -224 -113t-89 -230zM1435 1393q170 -145 210 -339h34q199 0 338 -126q53 50 81 114q-146 69 -230 210t-84 297v26q-8 1 -26 1 q-93 2 -181 -46.5t-142 -136.5z" />
|
||||
<glyph unicode="" horiz-adv-x="676" d="M-1 778v305q0 31 20.5 51.5t50.5 20.5h306q30 0 50.5 -20.5t20.5 -51.5q0 -30 -20.5 -49.5t-50.5 -19.5h-133l414 -414q18 -21 18 -53q0 -30 -18 -49q-20 -19 -54 -19q-31 0 -50 19l-411 413v-133q0 -31 -20.5 -51.5t-51.5 -20.5q-30 0 -50.5 21t-20.5 51z" />
|
||||
<glyph unicode="" horiz-adv-x="677" d="M0 1067q0 31 18 50q20 19 54 19q31 0 50 -19l413 -413v133q0 31 20.5 51.5t51.5 20.5q30 0 50.5 -21t20.5 -51v-306q0 -31 -20.5 -51.5t-50.5 -20.5h-306q-30 0 -50.5 20.5t-20.5 51.5q0 30 20.5 50t50.5 20h132l-415 414q-18 21 -18 52z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767q0 -23 16.5 -40t40.5 -17q23 0 40 17t17 40v455q0 24 -17 40.5t-40 16.5q-24 0 -40.5 -16.5t-16.5 -40.5v-455z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5q23 0 40 -16.5t17 -40.5v-241l51 89q12 20 35.5 26t43.5 -6q20 -11 26.5 -34t-5.5 -43l-156 -267q-13 -36 -52 -36q-24 0 -40.5 16.5t-16.5 40.5z " />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v1v454q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-356l190 107q20 12 43 6t34 -28q12 -20 5.5 -43t-26.5 -35l-265 -148q-17 -15 -38 -15q-24 0 -40.5 16.5t-16.5 40.5z " />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-397h258q24 0 40.5 -16.5t16.5 -40.5q0 -23 -16.5 -40t-40.5 -17h-303q-3 -1 -12 -1q-24 0 -40.5 16.5t-16.5 40.5z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v455q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-420l245 -143q20 -12 26 -34.5t-6 -42.5q-16 -29 -49 -29q-17 0 -29 8l-261 152q-17 5 -28.5 20t-11.5 34z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 767v1v454q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-438l147 -262q12 -22 5.5 -44.5t-26.5 -34.5q-11 -6 -28 -6q-34 0 -50 28l-150 266q-12 15 -12 36z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM710 453v769q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-769q0 -24 -16.5 -41t-40.5 -17t-40.5 17t-16.5 41z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM556.5 477.5q-6.5 22.5 5.5 44.5l148 262v438q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-454v-1q0 -20 -13 -36l-149 -266q-16 -28 -51 -28q-16 0 -27 6q-21 12 -27.5 34.5z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM439 624.5q6 22.5 26 34.5l245 143v420q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -19 -11.5 -34t-28.5 -20l-262 -152q-12 -8 -28 -8q-33 0 -49 29q-12 20 -6 42.5z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM394 768q0 24 16.5 40.5t40.5 16.5h259v397q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -24 -16.5 -40.5t-40.5 -16.5q-10 0 -13 1h-303q-24 0 -40.5 17t-16.5 40z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM437 908q-7 23 5 43q11 20 34.5 27t43.5 -5l190 -107v356q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-454v-1q0 -24 -16.5 -40.5t-40.5 -16.5q-21 0 -38 15l-265 148q-20 12 -27 35 z" />
|
||||
<glyph unicode="" d="M0 767q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 767q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM553 1056q6 23 26 34q20 12 43.5 6t34.5 -26l53 -89v241q0 24 16.5 40.5t40.5 16.5t40.5 -16.5t16.5 -40.5v-455q0 -24 -16.5 -40.5t-40.5 -16.5q-41 0 -54 36l-154 267q-12 20 -6 43z" />
|
||||
<glyph unicode="" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM82 769q0 -139 54.5 -266.5t146.5 -219.5 t219.5 -146.5t266.5 -54.5q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-139 0 -266.5 -54.5t-219.5 -147t-146.5 -219.5t-54.5 -267z" />
|
||||
<glyph unicode="" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q135 -53 237 -140.5t160.5 -192.5t86.5 -214t28 -221q0 -66 -5 -125.5t-20 -127.5t-38.5 -127t-63 -118.5t-92 -108t-127.5 -91t-166 -71.5z" />
|
||||
<glyph unicode="" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q113 -60 197.5 -149.5t133 -193t72 -209.5t23.5 -216q0 -93 -9 -173.5t-36.5 -172.5t-72.5 -166t-124 -142.5t-184 -114.5z" />
|
||||
<glyph unicode="" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q175 -129 258 -335.5t83 -432.5q0 -92 -7 -170.5t-29.5 -168.5t-58.5 -163.5t-99 -144.5t-147 -122z" />
|
||||
<glyph unicode="" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q132 -142 194 -344.5t62 -423.5q0 -90 -5.5 -166.5t-22 -164.5t-44 -161.5t-74.5 -146.5t-110 -130z" />
|
||||
<glyph unicode="" d="M768 0q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q171 -297 171 -768q0 -239 -35.5 -430t-135.5 -339z" />
|
||||
<glyph unicode="" d="M768 0q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q171 -297 171 -768q0 -239 -35.5 -430t-135.5 -339z" />
|
||||
<glyph unicode="" d="M769 0q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103v-1537z" />
|
||||
<glyph unicode="" d="M695 769q0 -464 74 -769q209 0 385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103q-74 -381 -74 -768z" />
|
||||
<glyph unicode="" d="M622 769q0 -488 146 -769q209 0 386 103t280 280t103 386t-103 385.5t-280 279.5t-386 103q-146 -350 -146 -768z" />
|
||||
<glyph unicode="" d="M550 770q0 -245 48.5 -436.5t171.5 -333.5q156 0 298.5 61t245.5 164t164 245.5t61 299.5t-61 299t-164 245t-245.5 164t-298.5 61q-104 -149 -162 -350t-58 -419z" />
|
||||
<glyph unicode="" d="M477 770q0 -122 13.5 -225t45.5 -204t91 -187.5t143 -153.5q157 0 299 61t245 164t164 245.5t61 299.5q0 209 -103 386t-280 280t-386 103q-138 -133 -215.5 -336.5t-77.5 -432.5z" />
|
||||
<glyph unicode="" d="M403 770q0 -127 17 -233t57 -207.5t114 -185t179 -144.5q156 0 298.5 61t245.5 164t164 245.5t61 299.5t-61 299t-164 245t-245.5 164t-298.5 61q-171 -117 -269 -323.5t-98 -445.5z" />
|
||||
<glyph unicode="" d="M330 770q0 -105 12 -193.5t42.5 -177t79.5 -160t126.5 -133.5t179.5 -106q157 0 299 61t245 164t164 245.5t61 299.5q0 209 -103 386t-280 280t-386 103q-204 -102 -322 -310.5t-118 -458.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t280 -280t386 -103t385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103t-386 -103t-280 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q515 143 515 766q0 121 -28.5 230t-77 193t-115 153t-140.5 115t-154 73q-156 0 -298 -60.5t-244.5 -163t-163 -244t-60.5 -296.5z" />
|
||||
<glyph unicode="" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q443 177 443 766q0 142 -37 268.5t-100.5 220.5t-140.5 163t-165 113q-208 0 -384.5 -102.5t-279 -278.5t-102.5 -384z" />
|
||||
<glyph unicode="" d="M0 766q0 -125 38.5 -242t109.5 -211t165 -165t211 -109.5t242 -38.5q370 212 370 766q0 134 -30.5 255.5t-84 216.5t-117.5 168t-138 127q-156 0 -298 -60.5t-244.5 -163.5t-163 -245t-60.5 -298z" />
|
||||
<glyph unicode="" d="M0 767q0 -156 60.5 -298t163.5 -245t245 -163.5t298 -60.5q296 245 296 767q0 240 -83.5 434.5t-212.5 332.5q-208 0 -385 -103t-279.5 -279.5t-102.5 -384.5z" />
|
||||
<glyph unicode="" d="M0 767q0 -208 103 -384.5t279.5 -279.5t384.5 -103q222 282 222 767q0 406 -222 767q-208 0 -384.5 -102.5t-279.5 -279.5t-103 -385z" />
|
||||
<glyph unicode="" d="M0 768q0 -209 103 -385.5t279.5 -279.5t385.5 -103q147 315 147 768q0 354 -147 767q-156 0 -298.5 -60.5t-245 -163.5t-163.5 -245t-61 -298z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103v1537q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-102 322 -102 769q0 351 102 768q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t280 -280t386 -103q-206 281 -206 769q0 408 206 768q-209 0 -386 -103t-280 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-306 239 -306 769q0 238 85.5 437t220.5 331q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t280 -280t386 -103q-212 103 -311 295.5t-99 473.5q0 259 115.5 461t294.5 307q-209 0 -386 -103t-280 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-265 81 -388.5 274.5t-123.5 494.5q0 142 41 269.5t111.5 223.5t162 166.5t197.5 108.5q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t279.5 -280t385.5 -103q-149 57 -259 128t-175.5 143.5t-104.5 159.5t-52.5 165t-13.5 172q0 67 5.5 123.5t22 121t44 119.5t74 113.5t108.5 107.5t151 97t200 87q-209 0 -385.5 -103t-279.5 -279.5t-103 -385.5z" />
|
||||
<glyph unicode="" d="M0 765q0 209 103.5 386.5t280.5 280.5t385 103q156 0 298 -61t245 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245t-245 -163t-298 -60.5q-157 0 -299.5 61t-245.5 164t-163.5 244.5t-60.5 297.5zM169 765q0 -243 177 -422q177 -177 423 -177q162 0 300 80.5 t219 218.5t81 300t-81 300.5t-219 219t-300 80.5t-300 -80.5t-219 -219t-81 -300.5zM503 366l256 895q1 10 10 10t10 -10l255 -895q4 -11 -1.5 -17t-16.5 0l-237 89q-10 4 -20 0l-239 -89q-10 -6 -14.5 0t-2.5 17z" />
|
||||
<glyph unicode="" horiz-adv-x="2883" d="M0 526v1q0 185 115.5 329t292.5 186q49 219 224.5 360t402.5 141q159 0 290 -70q80 85 188 133.5t223 48.5q152 0 281.5 -75.5t205 -205t75.5 -281.5q0 -197 -122 -351q46 -98 46 -215q0 -141 -68 -261.5t-185.5 -193.5t-258.5 -77q-21 0 -21 19v143q0 19 21 19 q137 7 232.5 109.5t95.5 241.5q0 142 -103 244t-246 102h-172q-19 0 -19 18l-8 63q-18 173 -149.5 290.5t-305.5 117.5q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63q-5 -14 -24 -14l-54 -4q-135 -16 -225 -113.5t-90 -232.5v-5h3q2 -156 118 -259q35 -31 79 -52v-2 q66 -30 129 -33q18 0 18 -18v-143q0 -18 -18 -18q-83 5 -158 32v-2q-133 46 -225.5 153t-118.5 246v4q-1 1 -1 3q-8 40 -8 93zM587 -239q0 5 2 13.5t2 12.5l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54 -43.5t7 -66.5l-15 -64q-16 -70 -81 -70q-5 0 -15.5 1.5t-13.5 1.5 q-33 10 -49.5 35t-16.5 52zM666 75q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -61.5t-63 -24.5q-37 0 -61 26q-27 25 -27 60zM841 -563q0 6 4 24l14 62q11 36 44 54.5t67 7.5q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-8 0 -26 4q-35 10 -52 35.5t-17 52.5zM898 1838 q0 38 27 64t67 26q38 0 64 -26l67 -70q27 -27 27 -64q0 -39 -32 -68.5t-65 -24.5q-33 3 -59 29l-69 70q-27 27 -27 64zM925 -254q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-35 0 -62 27q-26 26 -26 61zM991 -11q0 15 3 28l24 96q11 37 44 56.5t68 8.5 q38 -11 56.5 -42.5t7.5 -66.5l-28 -96q-13 -44 -44 -60.5t-68 -6.5q-32 6 -48.5 32.5t-14.5 50.5zM1286 -240q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -69 -81 -69q-5 0 -16 1.5t-14 1.5q-32 10 -48.5 35t-16.5 52zM1365 74 q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -62 27q-26 24 -26 60zM1475 1366q134 -122 181 -312h33q220 0 375 -155q50 88 50 194q0 157 -110.5 266.5t-267.5 109.5q-154 0 -261 -103zM1645 1928v219q0 38 27 65.5t64 27.5q38 0 63.5 -27t25.5 -66v-219 q0 -39 -25.5 -66t-63.5 -27q-37 0 -64 27.5t-27 65.5zM2240 1683q0 39 25 64l154 155q24 27 62 27q39 0 64 -27q28 -26 28 -64t-28 -64l-154 -155q-31 -30 -67.5 -27.5t-58.5 27.5q-25 25 -25 64zM2323 413q0 38 26.5 65t64.5 27q37 0 65 -28l66 -67q28 -28 28 -65 q0 -38 -28 -64q-22 -28 -58 -28l-2 2q-38 0 -66 26l-69 68q-27 27 -27 64zM2479 1093q0 38 26.5 63.5t65.5 25.5h220q39 0 65.5 -25.5t26.5 -63.5t-27 -65t-65 -27h-220q-38 0 -64 29q-28 24 -28 63z" />
|
||||
<glyph unicode="" horiz-adv-x="2298" d="M0 519v1v1q0 185 115.5 330t292.5 186q49 219 224.5 359.5t402.5 140.5q159 0 290 -70q80 85 188 133.5t223 48.5q152 0 281.5 -75.5t205 -205t75.5 -281.5q0 -197 -122 -351q46 -98 46 -215q0 -141 -68 -261.5t-185.5 -193t-258.5 -76.5q-21 0 -21 18v143q0 19 21 19 q137 7 232.5 109.5t95.5 241.5q0 142 -103 244t-246 102h-172q-19 0 -19 19l-8 63q-18 173 -149.5 290.5t-305.5 117.5q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63q-5 -15 -24 -15l-54 -4q-135 -16 -225 -113.5t-90 -232.5v-4q2 -2 3 -2q1 -136 96 -237q45 -47 98 -71v-2 q60 -31 132 -36q18 0 18 -18v-143q0 -18 -18 -18q-78 4 -153 31q-121 40 -209.5 131.5t-125.5 213.5q-23 75 -23 153zM587 -246q0 5 2 14t2 13l10 62q11 38 44 57t72 9q36 -11 54 -44t7 -67l-15 -64q-16 -70 -81 -70q-5 0 -15.5 1.5t-13.5 1.5q-33 10 -49.5 35t-16.5 52z M666 69q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -61 26q-27 25 -27 61zM841 -569q0 6 4 24l14 63q11 36 44 54t67 7q37 -7 56 -39t9 -73l-14 -62q-17 -66 -85 -66q-8 0 -26 4q-35 10 -52 35.5t-17 52.5zM925 -259q0 37 25 61.5t63 24.5t63 -24.5 t25 -61.5q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -17q0 15 3 28l24 96q11 38 44 57t68 9q38 -11 56.5 -43t7.5 -67l-28 -96q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -246q0 5 1.5 15t1.5 12l10 62q11 38 44 57t72 9q36 -11 54.5 -44t7.5 -67 l-15 -64q-16 -70 -81 -70q-5 0 -16 1.5t-14 1.5q-32 10 -48.5 35t-16.5 52zM1365 69q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25t-62 26q-26 24 -26 61zM1475 1360q134 -122 181 -312h33q221 0 375 -154q50 88 50 193q0 157 -110.5 266.5t-267.5 109.5 q-154 0 -261 -103z" />
|
||||
<glyph unicode="" horiz-adv-x="2328" d="M0 504v6v2v5v5v1v2v9v7v2q7 179 121 317t286 178q50 218 225 358t401 140q118 0 254 -49q45 74 105.5 128.5t125.5 84t126.5 43t120.5 12.5q62 0 132 -14l85 -27q19 -9 15 -25l-12 -65q-11 -47 -11 -90q0 -49 15.5 -101t47 -101.5t85.5 -90.5t124 -62l66 -18 q16 -4 16 -17q0 -6 -1 -7l-20 -73q-39 -162 -161 -280q70 -122 70 -261q0 -214 -148.5 -368.5t-361.5 -161.5q-20 0 -20 20v145q0 19 20 19q139 10 235 110t96 236q0 143 -103 244.5t-248 101.5h-173q-18 0 -18 19l-8 62q-18 172 -149 289.5t-305 117.5q-175 0 -304.5 -117 t-146.5 -290l-8 -55q0 -18 -21 -18l-56 -8q-134 -16 -224.5 -114.5t-90.5 -231.5v-2l1 -1h2q1 -84 39 -158t104 -122h1l1 -1l1 -1q35 -25 66 -37q54 -24 114 -26q18 0 18 -18v-143q0 -19 -18 -19q-149 7 -272 88h-1q-106 69 -169.5 180t-68.5 241zM587 -240q0 5 2 13.5 t2 12.5l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54 -44t7 -67l-15 -64q-16 -69 -81 -69q-5 0 -15.5 1.5t-13.5 1.5q-33 10 -49.5 35t-16.5 52zM666 74q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-36 0 -61 27q-27 25 -27 60zM841 -566q0 6 4 24l14 63 q11 36 44 54.5t67 7.5q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-12 0 -26 3q-35 10 -52 35.5t-17 52.5zM925 -256q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -14q0 15 3 29l24 96q11 37 44 56.5t68 8.5q38 -11 56.5 -43t7.5 -67 l-28 -96q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -242q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -70 -81 -70q-5 0 -15 2t-15 2q-32 10 -48.5 35t-16.5 52zM1365 72q0 38 25 63t63 25t63 -25t25 -63 q0 -37 -25 -62t-63 -25t-62 26q-26 24 -26 61zM1440 1390q166 -136 211 -337h35q196 0 343 -126q54 49 81 111q-99 48 -171.5 129t-108.5 177t-36 198v33h-23q-99 0 -188.5 -48t-142.5 -137z" />
|
||||
<glyph unicode="" horiz-adv-x="2328" d="M0 523q0 185 115.5 330t292.5 186q49 219 224.5 359.5t402.5 140.5q130 0 235 -43q0 -1 1 -2q134 -52 236 -165h3q108 -117 146 -279h33q173 0 302 -92v1q85 -57 142.5 -142t77.5 -186q6 -34 8 -55v-1v-5q0 -1 1.5 -18t1.5 -26v-1v-2q0 -141 -68 -261.5t-185.5 -193 t-258.5 -76.5q-21 0 -21 18v143q0 20 21 20q137 7 232.5 109t95.5 241q0 142 -103 244.5t-246 102.5h-172q-19 0 -19 18l-8 63q-16 160 -135 276q-1 1 -2.5 3t-2.5 3q-2 2 -4 2q0 3 -2 3q-116 106 -273 120q-11 1 -36 1q-176 0 -305.5 -117.5t-146.5 -290.5l-8 -63 q-5 -15 -24 -15l-54 -3q-135 -16 -225 -114t-90 -233v-4h3q1 -76 32.5 -144t85.5 -116q33 -29 79 -51v-1q64 -31 129 -34q18 0 18 -19v-143q0 -18 -18 -18q-83 5 -158 32v-1q-133 46 -225.5 153t-118.5 246v3q-1 1 -1 4q-8 41 -8 93zM587 -242q0 5 2 13.5t2 12.5l10 63 q11 38 43.5 56.5t72.5 8.5q36 -11 54 -44t7 -67l-15 -64q-16 -70 -81 -70q-5 0 -14.5 2t-14.5 2q-33 10 -49.5 35t-16.5 52zM666 72q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62t-63 -25q-37 0 -61 26q-27 25 -27 61zM841 -567q0 6 4 24l14 63q11 36 44 54.5t67 7.5 q37 -7 56 -39t9 -73l-14 -63q-16 -65 -85 -65q-12 0 -26 3q-35 10 -52 35.5t-17 52.5zM925 -257q0 37 25 62t63 25t63 -25t25 -62q0 -38 -25 -63t-63 -25q-36 0 -62 26t-26 62zM991 -15q0 16 3 29l24 96q11 37 44 56.5t68 8.5q38 -11 56.5 -43t7.5 -67l-28 -96 q-13 -44 -44 -60t-68 -6q-32 6 -48.5 32t-14.5 50zM1286 -243q0 5 1.5 14t1.5 12l10 63q11 38 43.5 56.5t72.5 8.5q36 -11 54.5 -44t7.5 -67l-15 -64q-16 -70 -81 -70q-5 0 -15 2t-15 2q-32 10 -48.5 35t-16.5 52zM1365 71q0 38 25 63t63 25t63 -25t25 -63q0 -37 -25 -62 t-63 -25t-62 26q-26 24 -26 61z" />
|
||||
<glyph unicode="" horiz-adv-x="2267" d="M0 665q0 38 27 65q29 27 64 27h218q37 0 61.5 -27t24.5 -65t-24.5 -64.5t-61.5 -26.5h-218q-37 0 -64 27t-27 64zM305 1402q0 37 25 65q32 27 68 27q34 0 63 -27l152 -156q26 -24 26 -63q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-157 152q-25 27 -25 65zM322 409 q0 36 25 59t68 23h609q43 0 68.5 -23t25.5 -59q0 -43 -25 -68.5t-69 -25.5h-609q-43 0 -68 25t-25 69zM427 94q0 35 29.5 64t64.5 29q42 0 67.5 -28t25.5 -65q0 -44 -25 -69t-68 -25q-37 0 -65.5 26t-28.5 68zM578 634v7q5 201 139.5 350t330.5 180h2h3q31 6 81 6t81 -6h2h2 q196 -31 330.5 -180t139.5 -350v-7q0 -26 -24 -26h-121q-19 0 -27 10t-8 19q-6 149 -115 252.5t-260 103.5t-260 -103.5t-115 -252.5q0 -9 -8.5 -19t-27.5 -10h-121q-24 0 -24 26zM685 94q0 37 25.5 65t67.5 28h409q35 0 64.5 -29t29.5 -64q0 -42 -28.5 -68t-65.5 -26h-409 q-43 0 -68 25t-25 69zM1042 1489v217q0 38 27 65t64 27t64 -27t27 -65v-217q0 -37 -26.5 -62t-64.5 -25t-64.5 25t-26.5 62zM1187 409q0 34 29 58t65 24t65 -24t29 -58q0 -42 -28.5 -68t-65.5 -26t-65.5 26t-28.5 68zM1351 94q0 37 26 65t68 28h198q42 0 67.5 -28t25.5 -65 q0 -44 -24.5 -69t-68.5 -25h-198q-43 0 -68.5 25t-25.5 69zM1445 409q0 34 28.5 58t64.5 24h327q35 0 58 -23.5t23 -58.5q0 -43 -22.5 -68.5t-58.5 -25.5h-327q-37 0 -65 26t-28 68zM1631 1248q0 40 24 63l152 156q29 27 63 27q37 0 64 -27t27 -65q0 -39 -26 -65l-156 -152 q-29 -26 -64 -26q-36 0 -60 25.5t-24 63.5zM1872 665q0 37 26 65q27 27 61 27h216q37 0 64.5 -27.5t27.5 -64.5t-27.5 -64t-64.5 -27h-216q-37 0 -62 26.5t-25 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2149" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1423 315q0 -83 26 -146.5 t70 -100.5t97 -55t112 -18q82 0 150 27.5t111.5 74t75.5 101.5t48.5 115.5t24 110t7.5 91.5q0 155 -85.5 240t-226.5 85q-79 0 -152.5 -37.5t-131 -104t-92 -166.5t-34.5 -217zM1642 309q0 24 4.5 61.5t17.5 89t32.5 94.5t55 73.5t79.5 30.5t69 -28t25 -84 q0 -154 -53 -261.5t-131 -107.5q-99 0 -99 132z" />
|
||||
<glyph unicode="" horiz-adv-x="1990" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 0h263l176 851h-263z" />
|
||||
<glyph unicode="" horiz-adv-x="2165" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1366 0h706l43 202h-392v3 q32 15 92 39t101.5 41t92.5 47t82 61t53 79.5t22 106.5q0 89 -46 149.5t-115 86t-155 25.5q-155 0 -253.5 -83.5t-117.5 -246.5h223q0 59 34.5 100t97.5 41q48 0 72 -25.5t24 -57.5q0 -19 -3.5 -34.5t-16.5 -30t-22.5 -23.5t-36.5 -24t-42.5 -23t-56.5 -27 q-141 -69 -175 -89q-128 -77 -177 -190q-25 -56 -34 -127z" />
|
||||
<glyph unicode="" horiz-adv-x="2145" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1405 249q0 -43 17 -84t53 -79.5 t102.5 -62t155.5 -23.5q193 0 281 77t88 208q0 58 -32.5 106t-84.5 54v2q69 12 114.5 62t45.5 120q0 49 -18 87t-46.5 62t-68.5 39.5t-80.5 21.5t-85.5 6q-148 0 -243 -71.5t-117 -214.5h217q7 49 40.5 76.5t83.5 27.5q46 0 72.5 -19.5t26.5 -53.5q0 -75 -135 -75h-50 l-31 -149h47q109 0 109 -75q0 -50 -36 -77t-88 -27q-61 0 -89 36q-27 34 -22 95h-221q-5 -30 -5 -69z" />
|
||||
<glyph unicode="" horiz-adv-x="2155" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1395 160h381l-34 -165h235l38 165 h108l38 203h-107l96 463h-237l-472 -444zM1635 363l239 236h3l-52 -236h-190z" />
|
||||
<glyph unicode="" horiz-adv-x="2158" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1403 264q-4 -51 12.5 -97.5 t53 -86t104 -63t158.5 -23.5q92 0 163.5 24.5t111.5 60.5t65.5 84t34 87.5t8.5 78.5q0 107 -68.5 172t-176.5 65q-111 0 -155 -46h-2l37 109h368l42 201h-559l-155 -476h213q26 54 118 54q51 0 82 -26.5t31 -79.5q0 -54 -37 -87t-107 -33q-50 0 -78 18q-34 18 -38 64h-226z " />
|
||||
<glyph unicode="" horiz-adv-x="2168" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1439 334q0 -153 80 -246t244 -93 q152 0 250.5 92.5t98.5 243.5q0 103 -71 167.5t-176 64.5q-117 0 -183 -80h-2q53 186 176 186q40 0 62 -15q20 -14 25 -44h225q-2 50 -20.5 90t-47 66t-67 43t-79.5 24t-85 7q-100 0 -179 -38.5t-124.5 -95t-75.5 -128.5t-40.5 -131.5t-10.5 -112.5zM1658 286q0 59 39 89.5 t88 30.5q30 0 51.5 -9t32 -20.5t16.5 -28.5t7 -26.5t1 -20.5q0 -50 -34 -84t-91 -34q-49 0 -79.5 28.5t-30.5 74.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2187" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1504 -5h263q42 207 148.5 370.5 t230.5 260.5l41 199h-636l-44 -202h372q-316 -318 -375 -628z" />
|
||||
<glyph unicode="" horiz-adv-x="2153" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1395 233q0 -117 91.5 -177.5 t246.5 -60.5q95 0 168 19t114 47t66.5 66.5t33.5 70.5t8 65q0 66 -38 113.5t-100 60.5l2 3v-1q72 10 119 63.5t47 126.5q0 61 -28 104.5t-76 65.5t-98 31.5t-108 9.5q-76 0 -137 -15t-99 -39.5t-63 -57t-35 -64.5t-10 -66q0 -55 29 -96t80 -57v-3q-90 -10 -151.5 -65.5 t-61.5 -143.5zM1621 257q0 56 45 82t108 26q65 0 94.5 -29.5t29.5 -63.5v-14q0 -45 -40.5 -68t-103.5 -23l3 1q-22 0 -43 3t-43.5 12t-36 28t-13.5 46zM1702 585q0 51 39.5 74t95.5 23q48 0 81.5 -21.5t33.5 -67.5q0 -12 -5 -25t-18 -28.5t-42 -25.5t-70 -10 q-64 0 -89.5 24.5t-25.5 56.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2133" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1406 223q3 -63 30 -109t71.5 -71 t95.5 -36.5t111 -11.5q91 0 165.5 34t120.5 86.5t77.5 120.5t44 131.5t12.5 122.5q0 169 -86.5 259.5t-231.5 90.5q-149 0 -252 -91t-103 -239q0 -106 67.5 -173t173.5 -67q57 0 111.5 23t76.5 58h3q-19 -76 -62 -130t-113 -54q-46 0 -63 11q-20 17 -26 45h-223zM1680 530 q0 50 31 86.5t92 36.5q54 0 82.5 -27.5t28.5 -81.5q0 -15 -6 -33t-19 -38t-39 -33t-60 -13t-57.5 12t-34 30.5t-14.5 33.5t-4 27z" />
|
||||
<glyph unicode="" horiz-adv-x="2545" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1376 6h262l175 847h-261z M1823 317q0 -83 26 -147t70 -101t96.5 -55.5t111.5 -18.5q98 0 175 40t121 99t73 133.5t39 135t10 112.5q0 155 -85 240t-227 85q-165 0 -287.5 -146t-122.5 -377zM2042 307q0 25 4.5 62.5t17.5 89.5t32.5 95.5t55 74t79.5 30.5q43 0 69 -29t26 -84q0 -154 -53.5 -261.5 t-131.5 -107.5q-99 0 -99 130z" />
|
||||
<glyph unicode="" horiz-adv-x="2219" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 -5h263l176 852h-263z M1781 -5h262l176 852h-261z" />
|
||||
<glyph unicode="" horiz-adv-x="2563" d="M9 891q0 -28 18 -43q19 -18 45 -18h1109q28 0 49 -20t21 -49t-21 -50t-49 -21q-29 0 -50 22q-20 17 -43 17q-26 0 -43.5 -17t-17.5 -42q0 -26 18 -44q57 -57 136 -57t134.5 56t55.5 136q0 79 -55.5 135.5t-134.5 56.5h-1109q-26 0 -44.5 -18.5t-18.5 -43.5zM9 1107 q0 -27 18 -42q19 -17 45 -17h1473q79 0 135 56t56 135t-56 134.5t-135 55.5q-78 0 -135 -54q-17 -20 -17 -45q0 -26 17 -42.5t43 -16.5q24 0 44 17q19 19 48 19q28 0 49 -19.5t21 -48.5t-21 -50t-49 -21h-1473q-26 0 -44.5 -18t-18.5 -43zM1384 -5h263l176 852h-263z M1763 -5h706l43 203h-391v2q32 15 92 39t101 41t92 47t82 61.5t53 80t22 106.5q0 89 -46 149t-115 85t-155 25q-155 0 -253 -83.5t-117 -246.5h221q0 60 35 101t99 41q48 0 71.5 -25.5t23.5 -58.5q0 -52 -35 -81t-133 -77q-6 -2 -9 -4q-142 -68 -176 -88q-127 -76 -176 -186 q-26 -58 -35 -131z" />
|
||||
<glyph unicode="" horiz-adv-x="2708" d="M1 747q0 -38 28 -64q25 -27 64 -27h1005q37 0 62.5 26.5t25.5 64.5q0 37 -25 62.5t-63 25.5h-1005q-38 0 -65 -25.5t-27 -62.5zM37 91q0 -39 27 -64q26 -27 64 -27h1006q38 0 65 27t27 64t-27 62.5t-65 25.5h-1006q-38 0 -64.5 -25.5t-26.5 -62.5zM183 422q0 -38 27 -63 t67 -25h1003q38 0 63 25t25 63q0 40 -25 65.5t-63 25.5h-1003q-40 0 -67 -26t-27 -65zM442 1099q0 38 28 66q28 26 64 26h217q37 0 62 -27t25 -65t-25 -64.5t-62 -26.5h-217q-38 0 -65 27t-27 64zM747 1837q0 36 26 65q31 26 67 26q35 0 63 -26l152 -157q26 -24 26 -63 q0 -38 -25.5 -63.5t-63.5 -25.5q-39 0 -63 26l-156 152q-26 28 -26 66zM1019 1112v7q3 146 79 269.5t203 195t274 71.5q112 0 215 -44.5t177.5 -119t118.5 -177.5t44 -215q0 -150 -74 -277.5t-201 -202t-277 -75.5h-21q-11 0 -19 8t-8 19v130q0 21 23 21h26 q154 1 263.5 111.5t109.5 265.5q0 154 -110.5 263t-266.5 109q-151 0 -260 -104t-115 -253q0 -9 -8 -18.5t-27 -9.5h-122q-24 0 -24 26zM1485 58v212q0 38 26 64t64 26q39 0 65 -26t26 -64v-212q0 -39 -26.5 -66t-64.5 -27t-64 26.5t-26 66.5zM1485 1923v218q0 38 26.5 64.5 t63.5 26.5t64 -27t27 -64v-218q0 -37 -26.5 -61.5t-64.5 -24.5t-64 24.5t-26 61.5zM2073 517q0 37 24 60q24 25 61 25q39 0 64 -25l155 -152q26 -28 26 -65t-26 -63q-64 -50 -128 0l-152 152q-24 27 -24 68zM2073 1682q0 40 24 63l152 157q28 26 63 26q38 0 64.5 -27 t26.5 -64q0 -40 -26 -66l-155 -152q-29 -26 -64 -26q-36 0 -60.5 25.5t-24.5 63.5zM2314 1099q0 37 27 66q26 26 60 26h216q37 0 65 -27.5t28 -64.5t-28 -64t-65 -27h-216q-37 0 -62 26.5t-25 64.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2118" d="M0 65q0 26 18.5 45t43.5 19h43q-34 105 -56 221q-34 176 -34 319q0 274 97 513q98 234 275 401q179 170 416 258q241 92 524 92q170 0 320 -30q151 -35 291 -110l181 -97l-200 -42q-93 -21 -128 -83q-25 -52 3 -118l44 -101l-109 -5q-69 -5 -126 -29q-52 -25 -62 -53 q-17 -36 38 -107l86 -102l-134 -19q-248 -37 -406.5 -102.5t-250.5 -169.5q-90 -100 -133.5 -253t-47.5 -383h561v297l-41 -25q-22 -14 -48.5 -7.5t-39.5 29.5q-14 22 -8.5 48.5t28.5 40.5l407 254l2 2q1 0 1 1h2q2 0 3 1q11 4 24 7h3h3q2 -2 3 -2h1h1h3h1h1q0 -1 2 -1h1h2 l2 -1h1h1q2 -1 2 -3h2q1 0 1 -1q3 0 3 -1q1 0 3 -1l2 -1l407 -251q23 -14 28.5 -41t-8.5 -49q-13 -22 -39.5 -28t-48.5 8l-33 20v-296h102q25 0 42.5 -19t17.5 -45q1 -27 -17 -46t-43 -19h-1968q-26 0 -44 18.5t-18 46.5zM165 669q0 -114 32 -291q24 -130 58 -226h287 q8 232 48 383q56 204 171 330q117 131 308 209q131 55 332 93l-9 27q-16 73 10 131q36 82 137 129q11 5 20 8q-138 32 -277 15q-159 -20 -297 -91q-177 -93 -321 -264q-16 -19 -41 -19q-19 0 -33 11q-16 14 -18.5 36.5t11.5 39.5q160 190 356 291q157 79 335 101 q91 12 178 2t122 -18t48 -13l9 -3q8 49 26 90q25 47 68 85q-48 15 -111 30q-128 28 -287 28q-252 0 -471 -82q-214 -82 -365 -228q-157 -146 -238 -348q-88 -215 -88 -456zM1384 129h414v376l-211 129l-203 -127v-378z" />
|
||||
<glyph unicode="" horiz-adv-x="2080" d="M0 699q0 -25 18 -42.5t43 -17.5h318q23 0 40 14t21 36l96 562l173 -1406q4 -23 20.5 -38t38.5 -15q24 0 41 15t21 38l133 1032l111 -299q6 -18 21.5 -29t34.5 -11h5q19 1 34.5 14t20.5 33l163 732l76 -1406q1 -23 16 -39.5t38 -18.5t41 11t23 35l176 740h296 q25 0 43 17.5t18 42.5t-18 43t-43 18h-344q-21 0 -37.5 -13t-21.5 -33l-89 -378l-77 1426q-1 23 -17 39.5t-38 17.5q-23 2 -41.5 -11.5t-23.5 -36.5l-213 -957l-124 337q-7 19 -25.5 30t-38.5 9q-21 -2 -35.5 -17t-18.5 -36l-105 -801l-163 1339q-4 23 -20 37.5t-38 15.5 q-23 1 -40.5 -13t-21.5 -37l-158 -918h-268q-25 0 -43 -18t-18 -43z" />
|
||||
<glyph unicode="" horiz-adv-x="1628" d="M1 2q0 48 31 81.5t75 33.5v2l1404 -4q10 2 11 2q44 -1 75 -35t30 -82q0 -48 -31 -81t-75 -33v-1l-1391 3q-16 -2 -24 -2q-44 1 -75 34.5t-30 81.5zM89 585q-2 68 17 162q9 48 47 146q4 8 14 30q2 -3 4 -5t2 -3q17 -71 52 -128q33 -52 87 -74q42 -17 117 -19q3 0 8.5 -0.5 t8.5 -0.5q-53 53 -84 107q-48 83 -61 193q-10 86 10 209q4 24 31 108q24 75 68 137q52 78 149 161q59 50 166 114q11 7 37 20q0 -3 -0.5 -5.5t-0.5 -4v-2.5q-39 -92 -52 -185q-10 -84 26 -158q27 -58 98 -123q15 -15 63.5 -61.5t74.5 -72.5l27 -27q42 61 47 144 q7 88 -15 192q0 1 1 12q4 -3 32 -26q89 -80 137 -143q77 -100 113 -186q30 -73 40 -149q9 -68 8 -112q-2 -125 -27 -209q-11 -34 -20 -55q40 11 69 28q40 25 64 70q26 46 41 105q0 2 3 5q1 -3 5 -9.5t5 -10.5q20 -50 29 -103q12 -60 8 -121q-3 -46 -17 -86q-13 -38 -24 -62 q-30 -61 -66 -104q-10 -12 -15 -17h-1171q-2 2 -7 6t-8 7q-43 41 -88 121q-13 24 -31 74q-19 50 -22 111z" />
|
||||
<glyph unicode="" horiz-adv-x="1646" d="M11 -81q-20 44 10 86l149 285q2 6 12 16q7 7 41 31q3 2 73 53q76 52 179 127l192 318q27 44 77 44h75q-26 -30 -48 -64t-41 -91t-19 -114.5t30 -133t94 -148.5q44 -50 53 -99t-11 -89t-63 -78.5t-94 -67t-114 -55.5t-112.5 -43.5t-99.5 -30.5h-301q-26 0 -49 14.5 t-33 39.5zM305 1505q0 74 48.5 132.5t123.5 76.5q18 89 91 147t166 58q90 0 160 -55.5t92 -144.5h15q92 0 160 -57.5t68 -138.5q0 -89 -69 -152q0 -44 -38.5 -99.5t-83.5 -65.5q-10 -49 -46 -83.5t-87 -45.5q24 -26 24 -58q0 -40 -28 -67t-68 -27q-39 0 -67 27.5t-28 66.5 q0 5 2.5 15t2.5 14h-5q-46 0 -80 34t-34 80q0 19 19 57q-38 20 -61 67h-67q-87 8 -148.5 69.5t-61.5 149.5zM797.5 680q-0.5 26 8 57.5t17 50.5t22.5 47.5t20 43.5h40q44 0 70 -34l7 -11l140 -265l496 -558l4 -3q34 -43 9 -94q-24 -49 -80 -49h-600q28 25 46.5 42t48.5 52.5 t45 65.5t25 73.5t1 84t-40 89.5t-86 97t-93.5 93.5t-60 81.5t-30.5 73t-9.5 63z" />
|
||||
<glyph unicode="" horiz-adv-x="1549" d="M7 746q0 157 61.5 300.5t165.5 248t248 166.5t302 62h125q26 -7 26 -30l4 -96q6 -208 150.5 -355.5t349.5 -155.5l91 -7q25 0 25 -25v-108q1 -164 -62 -311h-219q81 119 103 270q-268 56 -429.5 230t-186.5 409q-155 -8 -283.5 -95.5t-199 -221.5t-70.5 -281 q0 -171 89 -311h-226q-64 148 -64 311zM37 105q0 46 30 73q28 28 74 28h281l331 312q16 13 37 0l337 -312h295q43 0 73.5 -29.5t30.5 -71.5q0 -43 -30.5 -74t-73.5 -31h-361q-16 0 -31 8l-257 242l-255 -242q-13 -8 -30 -8h-347q-43 0 -73.5 31t-30.5 74z" />
|
||||
<glyph unicode="" horiz-adv-x="1549" d="M0 746q0 157 61.5 300.5t165.5 248t248 166.5t302 62h125q26 -7 26 -30l5 -96q3 -103 43 -195.5t106.5 -160.5t157.5 -109.5t192 -45.5l91 -7q26 0 26 -25v-108q1 -162 -63 -311h-219q81 119 103 270q-268 56 -429.5 230t-186.5 409q-155 -8 -283.5 -95.5t-199 -221.5 t-70.5 -281q0 -171 89 -311h-226q-64 148 -64 311zM27 103q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-334 -303q-20 -14 -36 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5z" />
|
||||
<glyph unicode="" horiz-adv-x="2294" d="M0 979v34q0 16 11 26.5t27 10.5h809q16 0 27 -10.5t11 -26.5v-34q0 -16 -11 -26.5t-27 -10.5h-47v-176h226q4 45 37.5 76t79.5 31t79 -31t37 -76h141v362q-22 1 -37.5 17.5t-15.5 39.5v33q0 23 17.5 40t41.5 17h212q24 0 40.5 -17t16.5 -40v-33q0 -23 -14.5 -39.5 t-36.5 -17.5v-362h166q44 0 75.5 -32t31.5 -76v-312l398 -519h-506v324h-76q17 -42 17 -89q0 -97 -68.5 -166t-165.5 -69t-166 69t-69 166q0 47 17 89h-107q18 -44 18 -89q0 -97 -69.5 -166t-166.5 -69t-165.5 69t-68.5 166q0 47 17 89h-126q19 -47 19 -89q0 -97 -69.5 -166 t-166.5 -69t-166 69t-69 166q0 46 18 90q-39 6 -65 36t-26 70v92h-2v592h-45q-16 0 -27 10.5t-11 26.5zM219 558q0 -34 24 -57.5t58 -23.5h154q34 0 57 23.5t23 57.5v245q0 33 -23.5 56.5t-56.5 23.5h-154q-34 0 -58 -24t-24 -56v-245zM1230 1752q0 -66 50 -111 q0 -32 28 -72.5t60 -46.5q7 -36 33 -60.5t63 -32.5q-17 -17 -17 -42q0 -29 19.5 -48.5t48.5 -19.5t49 20t20 48q0 3 -1.5 10t-1.5 11h3q34 0 58 24.5t24 58.5q0 16 -13 40q28 15 44 50h48q63 5 107.5 49.5t44.5 107.5q0 54 -35 96t-89 55q-13 64 -66 106t-120 42 q-65 0 -115 -40t-66 -104h-12q-66 0 -115 -41.5t-49 -99.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1107" d="M0 -293v1829h110v-1829h-110zM184 746v790l923 -394z" />
|
||||
<glyph unicode="" horiz-adv-x="923" d="M0 -293v1829h110v-1829h-110zM184 -63v790l923 -394zM184 746v790l923 -394z" />
|
||||
<glyph unicode="" horiz-adv-x="1117" d="M0 -293v1829h121v-1829h-121zM206 832v704h912v-704h-912zM458 1046h406v267h-406v-267z" />
|
||||
<glyph unicode="" d="M0 -293v1829h121v-1829h-121zM206 35v704h912v-704h-912zM206 832v704h912v-704h-912zM458 249h406v268h-406v-268zM458 1046h406v267h-406v-267z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM863 1449q168 -92 275.5 -266.5t107.5 -413.5q0 -502 -352 -675q241 45 401 235t160 440 q0 170 -78 318t-213.5 243.5t-300.5 118.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM830 1453q152 -101 249 -276.5t97 -407.5q0 -492 -327 -682q169 20 307.5 115t218.5 244.5 t80 322.5q0 176 -83 328t-226 246.5t-316 109.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM808 1454q131 -113 214 -288t83 -397q0 -475 -284 -686q131 10 248 68t202 149t134.5 213.5 t49.5 255.5q0 179 -86 333.5t-235 248.5t-326 103z" />
|
||||
<glyph unicode="" horiz-adv-x="1755" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM792 1455q108 -130 175.5 -303t67.5 -383q0 -450 -234 -687q134 6 255 63t208.5 148.5 t139 215.5t51.5 260q0 182 -88.5 337.5t-241 249t-333.5 99.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM779 1455q187 -330 187 -686q0 -426 -181 -687q137 3 261 59t213.5 147.5t142.5 217 t53 263.5q0 184 -90.5 341t-246 249.5t-339.5 95.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM769 1455q126 -363 126 -686q0 -402 -121 -687q138 1 264.5 55.5t217.5 146.5t145 219 t54 266t-54.5 266t-146.5 219t-219 146.5t-266 54.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM755 82h13q140 0 267 54.5t219 146.5t146.5 219t54.5 267q0 139 -54.5 266t-146.5 219 t-219 146.5t-267 54.5h-13v-1373z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM658 769q0 -390 84 -687h26q140 0 267 54.5t219 146.5t146.5 219t54.5 267q0 139 -54.5 266 t-146.5 219t-219 146.5t-267 54.5h-23q-87 -368 -87 -686z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM561 769q0 -425 165 -686q15 -1 42 -1q140 0 267 54.5t219 146.5t146.5 219t54.5 267 q0 139 -54.5 266t-146.5 219t-219 146.5t-267 54.5q-24 0 -37 -1q-170 -322 -170 -685z" />
|
||||
<glyph unicode="" d="M0 769q0 208 103 385t280 280t385 103q156 0 298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298.5 61t-245 164t-163.5 245.5t-61 298.5zM464 769q0 -455 239 -684q7 0 20.5 -1t24 -1.5t20.5 -0.5q139 0 266.5 54.5 t219.5 146.5t146.5 219t54.5 267q0 139 -54.5 266t-146.5 219t-219.5 146.5t-266.5 54.5q-37 0 -55 -2q-111 -125 -180 -301.5t-69 -382.5z" />
|
||||
<glyph unicode="" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM368 770q0 -479 304 -681q45 -7 97 -7 q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-46 0 -81 -4q-143 -109 -231.5 -286.5t-88.5 -396.5z" />
|
||||
<glyph unicode="" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM271 769q0 -487 339 -668q75 -19 159 -19 q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-70 0 -126 -11q-167 -96 -269.5 -272.5t-102.5 -404.5z" />
|
||||
<glyph unicode="" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM183 769q0 -80 10 -147t39 -142.5t77 -138.5 t128 -127t189 -117q69 -15 143 -15q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-87 0 -158 -18q-90 -43 -160 -93.5t-115.5 -105.5t-77 -110.5t-47 -119t-22 -119.5t-6.5 -122z" />
|
||||
<glyph unicode="" d="M0 769q0 157 61 299.5t164 245.5t245.5 164t298.5 61q157 0 299.5 -61t245.5 -164t164 -245.5t61 -299.5q0 -156 -61 -298.5t-164 -245.5t-245.5 -164t-299.5 -61q-156 0 -298.5 61t-245.5 164t-164 245.5t-61 298.5zM82 769q0 -139 54.5 -266.5t146.5 -219.5 t219.5 -146.5t266.5 -54.5q140 0 267 54.5t219.5 146.5t147 219.5t54.5 266.5q0 186 -92.5 344.5t-251 251t-344.5 92.5q-139 0 -266.5 -54.5t-219.5 -147t-146.5 -219.5t-54.5 -267z" />
|
||||
<glyph unicode="" d="M0 770q0 209 103.5 385.5t280.5 279t386 102.5t385.5 -102.5t279 -279t102.5 -385.5t-102.5 -386t-279 -280.5t-385.5 -103.5t-386 103.5t-280.5 280.5t-103.5 386zM82 770q0 -139 55 -266.5t147 -219.5t219.5 -147t266.5 -55q88 0 156 19q85 45 148 107t99.5 126.5 t59 143t29.5 146t7 146.5q0 95 -20.5 187t-63.5 182.5t-117.5 170.5t-173.5 136q-41 9 -124 9q-139 0 -266.5 -54t-220 -146t-147 -218.5t-54.5 -266.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q37 0 82 5q95 58 160.5 138.5 t97.5 174.5t44.5 181t12.5 188q0 128 -31.5 248.5t-108.5 238.5t-192 197q-42 2 -65 2q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q34 0 50 1q80 62 134 144 t80.5 175.5t37 179.5t10.5 187q0 196 -66 378.5t-206 306.5q-13 1 -40 1q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h26q61 66 102.5 149.5t61.5 176 t28 177t8 184.5q0 193 -50 372.5t-157 313.5h-19q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5q27 0 40 1q79 136 107.5 307 t28.5 379q0 411 -139 685q-11 1 -37 1q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h26q69 255 69 687 q0 391 -70 686h-25q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h14v1373h-14q-139 0 -266 -54.5 t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -140 54.5 -267t146.5 -219t219 -146.5t266 -54.5h5q-60 273 -60 687 q0 347 62 686h-7q-139 0 -266 -54.5t-219 -146.5t-146.5 -219t-54.5 -266z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -139 54 -265.5t145 -218.5t216.5 -147t264.5 -56q-119 253 -119 687 q0 370 123 686q-139 0 -265.5 -55t-218 -147t-146 -218.5t-54.5 -265.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -137 52.5 -262.5t142 -217.5t213.5 -147.5t260 -59.5q-175 238 -175 687 q0 191 47 369t133 317q-184 -3 -338.5 -96t-244.5 -249.5t-90 -340.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -136 51.5 -260t138.5 -215t208 -148t255 -64q-127 122 -178.5 294t-51.5 393 q0 198 63 378.5t175 307.5q-181 -7 -333 -100.5t-240 -249t-88 -336.5z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -130 47.5 -250t129 -210t194.5 -149.5t240 -73.5q-179 106 -252.5 278t-73.5 405 q0 212 90 394.5t250 289.5q-129 -11 -245 -69.5t-199 -149.5t-132 -212t-49 -253z" />
|
||||
<glyph unicode="" d="M0 769q0 156 61 298t164 245t245 164t298 61t298.5 -61t245.5 -164t164 -245t61 -298t-61 -298.5t-164 -245.5t-245.5 -164t-298.5 -61t-298 61t-245 164t-164 245.5t-61 298.5zM82 769q0 -254 164.5 -446t411.5 -233q-103 51 -175 124t-111.5 162t-57 184t-17.5 209 q0 216 102 398.5t281 281.5q-167 -21 -303.5 -116t-215.5 -244t-79 -320z" />
|
||||
<glyph unicode="" d="M0 769q0 -209 103 -386t280 -280t386 -103t385.5 103t279.5 280t103 386t-103 385.5t-279.5 279.5t-385.5 103t-386 -103t-280 -279.5t-103 -385.5z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 181 KiB |