Browse Source

Initial commit

Damien Accorsi 10 years ago
commit
fb6389f283
100 changed files with 15997 additions and 0 deletions
  1. 61 0
      .gitignore
  2. 10 0
      .hgignore
  3. 215 0
      README.md
  4. 16 0
      bin/run.sh
  5. 75 0
      bin/setup.sh
  6. 18 0
      doc/apache.wsgi.example.txt
  7. 52 0
      doc/database/pod-create-database-and-user.sh
  8. 571 0
      doc/database/pod-init-database.sql
  9. 39 0
      install/requirements.txt
  10. 4 0
      pod/MANIFEST.in
  11. 24 0
      pod/README.txt
  12. 11 0
      pod/app.wsgi
  13. 141 0
      pod/development.ini.base
  14. 73 0
      pod/migration/env.py
  15. 22 0
      pod/migration/script.py.mako
  16. 0 0
      pod/migration/versions/empty.txt
  17. 2 0
      pod/pod/__init__.py
  18. 2 0
      pod/pod/config/__init__.py
  19. 93 0
      pod/pod/config/app_cfg.py
  20. 101 0
      pod/pod/config/deployment.ini_tmpl
  21. 9 0
      pod/pod/config/environment.py
  22. 39 0
      pod/pod/config/middleware.py
  23. 2 0
      pod/pod/controllers/__init__.py
  24. 72 0
      pod/pod/controllers/admingroup.py
  25. 128 0
      pod/pod/controllers/adminuser.py
  26. 378 0
      pod/pod/controllers/api.py
  27. 52 0
      pod/pod/controllers/apimenu.py
  28. 43 0
      pod/pod/controllers/apipublic.py
  29. 22 0
      pod/pod/controllers/controller.template
  30. 45 0
      pod/pod/controllers/debug.py
  31. 30 0
      pod/pod/controllers/error.py
  32. 178 0
      pod/pod/controllers/root.py
  33. 27 0
      pod/pod/controllers/secure.py
  34. 36 0
      pod/pod/controllers/template.py
  35. BIN
      pod/pod/i18n/fr_FR/LC_MESSAGES/pboard.mo
  36. 751 0
      pod/pod/i18n/fr_FR/LC_MESSAGES/pboard.po
  37. 24 0
      pod/pod/i18n/ru/LC_MESSAGES/pboard.po
  38. 2 0
      pod/pod/lib/__init__.py
  39. 18 0
      pod/pod/lib/app_globals.py
  40. 65 0
      pod/pod/lib/auth.py
  41. 36 0
      pod/pod/lib/base.py
  42. 579 0
      pod/pod/lib/dbapi.py
  43. 95 0
      pod/pod/lib/helpers.py
  44. 63 0
      pod/pod/model/__init__.py
  45. 233 0
      pod/pod/model/auth.py
  46. 496 0
      pod/pod/model/data.py
  47. 22 0
      pod/pod/model/model.template
  48. 91 0
      pod/pod/model/serializers.py
  49. 8 0
      pod/pod/public/css/bootstrap-datetimepicker.min.css
  50. 9 0
      pod/pod/public/css/bootstrap-responsive.min.css
  51. 6315 0
      pod/pod/public/css/bootstrap.css
  52. 874 0
      pod/pod/public/css/bootstrap.min.css
  53. 4 0
      pod/pod/public/css/external/font-awesome-4.1.0/css/font-awesome.min.css
  54. BIN
      pod/pod/public/css/external/font-awesome-4.1.0/fonts/FontAwesome.otf
  55. BIN
      pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.eot
  56. 504 0
      pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.svg
  57. BIN
      pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf
  58. BIN
      pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.woff
  59. 1 0
      pod/pod/public/css/external/google-code-prettify/prettify.css
  60. 418 0
      pod/pod/public/css/glyphicons.css
  61. 198 0
      pod/pod/public/css/style.css
  62. BIN
      pod/pod/public/favicon.ico
  63. BIN
      pod/pod/public/img/glyphicons-grey.png
  64. BIN
      pod/pod/public/img/glyphicons-halflings-white.original.png
  65. BIN
      pod/pod/public/img/glyphicons-halflings-white.png
  66. BIN
      pod/pod/public/img/glyphicons-halflings.original.png
  67. BIN
      pod/pod/public/img/glyphicons-halflings.png
  68. BIN
      pod/pod/public/img/glyphicons-white.png
  69. BIN
      pod/pod/public/img/glyphicons.png
  70. 26 0
      pod/pod/public/javascript/external/bootstrap-datetimepicker.min.js
  71. 201 0
      pod/pod/public/javascript/external/bootstrap-wysiwyg.js
  72. 2291 0
      pod/pod/public/javascript/external/bootstrap.js
  73. 7 0
      pod/pod/public/javascript/external/bootstrap.min.js
  74. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-apollo.js
  75. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-basic.js
  76. 18 0
      pod/pod/public/javascript/external/google-code-prettify/lang-clj.js
  77. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-css.js
  78. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-dart.js
  79. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-erlang.js
  80. 1 0
      pod/pod/public/javascript/external/google-code-prettify/lang-go.js
  81. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-hs.js
  82. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-lisp.js
  83. 1 0
      pod/pod/public/javascript/external/google-code-prettify/lang-llvm.js
  84. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-lua.js
  85. 6 0
      pod/pod/public/javascript/external/google-code-prettify/lang-matlab.js
  86. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-ml.js
  87. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-mumps.js
  88. 4 0
      pod/pod/public/javascript/external/google-code-prettify/lang-n.js
  89. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-pascal.js
  90. 1 0
      pod/pod/public/javascript/external/google-code-prettify/lang-proto.js
  91. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-r.js
  92. 1 0
      pod/pod/public/javascript/external/google-code-prettify/lang-rd.js
  93. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-scala.js
  94. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-sql.js
  95. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-tcl.js
  96. 1 0
      pod/pod/public/javascript/external/google-code-prettify/lang-tex.js
  97. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-vb.js
  98. 3 0
      pod/pod/public/javascript/external/google-code-prettify/lang-vhdl.js
  99. 2 0
      pod/pod/public/javascript/external/google-code-prettify/lang-wiki.js
  100. 0 0
      pod/pod/public/javascript/external/google-code-prettify/lang-xq.js

+ 61 - 0
.gitignore View File

@@ -0,0 +1,61 @@
1
+# Byte-compiled / optimized / DLL files
2
+__pycache__/
3
+*.py[cod]
4
+
5
+# C extensions
6
+*.so
7
+
8
+# Distribution / packaging
9
+.Python
10
+env/
11
+build/
12
+develop-eggs/
13
+eggs/
14
+#lib/
15
+lib64/
16
+parts/
17
+sdist/
18
+var/
19
+*.egg-info/
20
+.installed.cfg
21
+*.egg
22
+
23
+# Installer logs
24
+pip-log.txt
25
+pip-delete-this-directory.txt
26
+
27
+# Unit test / coverage reports
28
+htmlcov/
29
+.tox/
30
+.coverage
31
+.cache
32
+nosetests.xml
33
+coverage.xml
34
+
35
+# Mr Developer
36
+.mr.developer.cfg
37
+.project
38
+.pydevproject
39
+
40
+# Rope
41
+.ropeproject
42
+
43
+# Django stuff:
44
+*.log
45
+*.pot
46
+
47
+# Sphinx documentation
48
+docs/_build/
49
+
50
+# Vim and dev tools
51
+*.swp
52
+.idea
53
+
54
+# Virtualenv
55
+tg2env/
56
+
57
+# cache
58
+pboard/data/
59
+
60
+# Site-local config file
61
+development.ini

+ 10 - 0
.hgignore View File

@@ -0,0 +1,10 @@
1
+# use glob syntax.
2
+syntax: glob
3
+
4
+*.elc
5
+*.pyc
6
+*~
7
+
8
+tg2env/
9
+pboard/data
10
+

+ 215 - 0
README.md View File

@@ -0,0 +1,215 @@
1
+# Introduction to POD #
2
+
3
+Pod is collaborative software designed to allow people to work on and share various data and document types. 
4
+
5
+It is [AGPL licenced](http://fr.wikipedia.org/wiki/GNU_Affero_General_Public_License) software.
6
+
7
+Pod is licensed under the terms of the 
8
+[GNU Affero General Public License](http://www.gnu.org/licenses/agpl.txt)
9
+as published by the [Free Software Foundation](http://www.fsf.org/).
10
+
11
+It is currently unstable, it is recommended to use it for test purpose only.
12
+
13
+It's a python 3 web application based on [TurboGears](http://www.turbogears.org/); it uses [PostgreSQL](http://www.postgresql.org/) as storage engine.
14
+
15
+## Features ##
16
+
17
+* Data and document sharing: text documents, files, contact, calendar, comments
18
+* Data and document status
19
+* Full traceability
20
+* Access control management, document granularity.
21
+
22
+It allows to keep private and shared data in the same place.
23
+The ACL is based on share with groups or individual users.
24
+
25
+## Give it a try ##
26
+
27
+### Online demo ###
28
+The fastest way to test it is to test the demo:
29
+
30
+* http://demo.archipeldata.com
31
+* login: demo@archipeldata.com
32
+* password: demo
33
+
34
+### Install your own instance ###
35
+
36
+The other way to test it is to install it on your computer. See documentation below.
37
+
38
+## Installation ##
39
+
40
+### Dependencies###
41
+
42
+Note: the following information is for Debian. For other OS, adapt the package names.
43
+
44
+You'll need to install the following packages:
45
+
46
+    apt-get install realpath python3 python-virtualenv python3-dev python-pip build-essential postgresql-server-dev-all
47
+
48
+If you work on a local database, then you also need to install PostgreSQL:
49
+
50
+    apt-get install postgresql postgresql-client
51
+
52
+### Get the source ###
53
+
54
+Get the sources from Bitbucket:
55
+
56
+    git clone https://bitbucket.org/lebouquetin/pod.git
57
+
58
+**Note: Now everything is documented to be executed from the pod directory newly created.**
59
+
60
+### Setup a database ###
61
+
62
+#### Allowing local connections on PostgreSQL ####
63
+
64
+Check the pg_hba.conf file, it should allow connection for user/pass through loopback IP address.
65
+The file should include the following configuration:
66
+
67
+    # IPv4 local connections:
68
+    host    all             all             127.0.0.1/32            md5
69
+
70
+Note: on Debian, the pg\_hba file is found at /etc/postgresql/9.1/main/pg_hba.conf
71
+
72
+If you changed the file, reload PostgreSQL:
73
+
74
+    service postgresql reload
75
+
76
+#### Create a new database and user on PostgreSQL ####
77
+
78
+We suppose you will create a user named _poduser_ with passowrd _podpassword_
79
+and a database _poddb_
80
+
81
+First login as root, then su as postgre and run a PostgreSQL client:
82
+
83
+    root@hostname:~# su postgres
84
+    postgres@hostname:/root$ psql
85
+    psql (9.1.13)
86
+    Type "help" for help.
87
+    
88
+    postgres=# 
89
+    
90
+    
91
+Now, type the following commands:
92
+
93
+    CREATE ROLE poduser WITH LOGIN PASSWORD 'podpassword';
94
+    CREATE DATABASE poddb OWNER poduser;
95
+    GRANT ALL PRIVILEGES ON DATABASE poddb TO poduser;
96
+
97
+At the end, you can quit the psql client by running the \q quit command:
98
+
99
+    postgres=# \q
100
+    postgres@mozart:/root$
101
+
102
+#### Test the database access ####
103
+
104
+You can test your newly created user by running the following command:
105
+
106
+    psql -h 127.0.0.1 -W -U poduser poddb -c 'SELECT NOW();'
107
+
108
+The result should be similar to:
109
+
110
+    user@hostname:~$ psql -h 127.0.0.1 -W -U poduser poddb -c 'SELECT NOW();'
111
+    Password for user poduser: 
112
+                  now              
113
+    -------------------------------
114
+     2014-06-16 11:35:48.590838+02
115
+    (1 row)
116
+
117
+#### Setup the database schema and initial data ####
118
+
119
+Your database is now ready. Fill it with the required schema and data by importing SQL:
120
+
121
+    psql -h 127.0.0.1 -W -U poduser poddb < doc/database/pod-init-database.sql
122
+
123
+You can test it through the following command:
124
+
125
+    user@hostname:~$ psql -h 127.0.0.1 -W -U poduser poddb -c 'SELECT * from pod_user;'
126
+
127
+You should find the admin@localhost user entry.
128
+
129
+### Setup python virtualenv ###
130
+
131
+Pod uses virtualenv as deployment environment. This ensure that there will be no 
132
+conflict between system-wide python modules and pod required ones.
133
+
134
+    virtualenv -p /usr/bin/python3 tg2env
135
+    source tg2env/bin/activate
136
+    cd pod && python setup.py develop && cd -
137
+    pip install -r install/requirements.txt
138
+    
139
+Notes:
140
+
141
+* Debian: you may get errors with stevedore/pbr which is not supported by python 3.2
142
+(debian version of python 3). This is not a real problem
143
+* Ubuntu (at least 14.04): you should remove _distribute_ and _wsgiref _
144
+  from the requirements.txt file
145
+
146
+### Create configuration ###
147
+
148
+    cp pod/development.ini.base pod/development.ini
149
+
150
+Configure database in the development.ini file. This is defined as sqlalchemy.url
151
+and the default value is below:
152
+
153
+    sqlalchemy.url = postgresql://pod_user:pod_user_password@127.0.0.1:5432/pod
154
+
155
+
156
+    
157
+### Running Pod as standalone ###
158
+
159
+Now you can run the standalone server:
160
+
161
+    ./bin/run.sh
162
+    
163
+Which should result in something like this:
164
+
165
+    13:53:49,982 INFO  [gearbox] Starting subprocess with file monitor
166
+    13:53:50,646 WARNI [py.warnings] /tmp/pod/protov1/tg2env/lib/python3.2/site-packages/tw2/core/validation.py:12: ImportWarning: Not importing directory '/tmp/pod/protov1/tg2env/lib/python3.2/site-packages/tw2/core/i18n': missing __init__.py
167
+      from .i18n import _
168
+    
169
+    13:53:50,862 INFO  [gearbox] Starting server in PID 11174.
170
+    Starting HTTP server on http://0.0.0.0:8080
171
+    
172
+You can now enter the application at [http://localhost:8080](http://localhost:8080) and login:
173
+
174
+* user : admin@localhost
175
+* password : admin
176
+    
177
+Enjoy :)
178
+
179
+
180
+### Running Pod through Apache WSGI ###
181
+
182
+#### Dependencies ####
183
+
184
+Install dependencies:
185
+
186
+    apt-get install apache2 libapache2-mod-wsgi-py3
187
+
188
+#### WSGI configuration ####
189
+
190
+Example of Apache WSGI configuration. This configuration refers to productionapp.wsgi which is a copy of the file *app.wsgi* available in the repo. (this file has to be updated to match with your environment and installation)
191
+
192
+    <VirtualHost *:80>
193
+        ServerAdmin webmaster@archipeldata.com
194
+        ServerName demo.archipeldata.com
195
+
196
+        WSGIProcessGroup pod
197
+        WSGIDaemonProcess pod user=www-data group=adm threads=4 python-path=/opt/podinstall/tg2env/lib/python3.2/site-packages
198
+        WSGIScriptAlias / /opt/podinstall/pod/productionapp.wsgi
199
+
200
+        #Serve static files directly without TurboGears
201
+        Alias /img     /opt/podinstall/pod/pod/public/img/
202
+        Alias /favicon.ico /opt/podinstall/pod/pod/public/favicon.ico
203
+        Alias /css        /opt/podinstall/pod/pod/public/css
204
+        Alias /javascript /opt/podinstall/pod/pod/public/javascript
205
+
206
+        CustomLog /var/log/apache2/demopod-access.log combined
207
+        ErrorLog /var/log/apache2/demopod-error.log
208
+        LogLevel debug
209
+    </VirtualHost>
210
+
211
+### Help required ###
212
+
213
+If you need help, contact us. If you want to help, contact us. So... contact us ;)
214
+
215
+Damien Accorsi - damien.accorsi@free.fr

+ 16 - 0
bin/run.sh View File

@@ -0,0 +1,16 @@
1
+#!/bin/bash
2
+
3
+OLD_PATH=`pwd`
4
+
5
+POD_BIN_PATH=`dirname $0`
6
+POD_INSTALL_PATH=`dirname ${POD_BIN_PATH}`
7
+POD_INSTALL_FULL_PATH=`realpath ${POD_INSTALL_PATH}`
8
+
9
+ROOT_FOLDER=${POD_INSTALL_FULL_PATH}
10
+
11
+cd ${ROOT_FOLDER}
12
+source tg2env/bin/activate
13
+cd ${ROOT_FOLDER}/pod/
14
+gearbox serve -c development.ini --reload --debug
15
+cd ${OLD_PATH}
16
+

+ 75 - 0
bin/setup.sh View File

@@ -0,0 +1,75 @@
1
+#!/bin/bash
2
+
3
+POD_BIN_PATH=`dirname $0`
4
+POD_INSTALL_PATH=`dirname ${POD_BIN_PATH}`
5
+POD_INSTALL_FULL_PATH=`realpath ${POD_INSTALL_PATH}`
6
+
7
+echo $POD_BIN_PATH
8
+echo $POD_INSTALL_PATH
9
+echo $POD_INSTALL_FULL_PATH
10
+
11
+OLD_PATH=`pwd`
12
+
13
+
14
+cd ${POD_INSTALL_FULL_PATH}
15
+# virtualenv tg2env
16
+echo
17
+echo "-------------------------"
18
+echo "- initializes virtualenv"
19
+echo "-------------------------"
20
+echo "-> path:        tg2env/"
21
+echo "-> interpreter: python3"
22
+echo
23
+echo
24
+virtualenv -p /usr/bin/python3 tg2env
25
+
26
+echo
27
+echo
28
+echo "-------------------------"
29
+echo "- activates virtualenv"
30
+echo "-------------------------"
31
+source tg2env/bin/activate
32
+echo
33
+echo
34
+
35
+echo
36
+echo
37
+echo "-------------------------"
38
+echo "- installing turbogears"
39
+echo "-------------------------"
40
+pip install -f http://tg.gy/230 tg.devtools
41
+
42
+echo
43
+echo
44
+
45
+echo
46
+echo
47
+echo "-------------------------"
48
+echo "- install dependencies"
49
+echo "-------------------------"
50
+echo "-> psycopg2"
51
+echo "-> pillow"
52
+echo "-> beautifulsoup4"
53
+echo "-> tw.forms"
54
+echo "-> tgext.admin"
55
+pip install psycopg2
56
+pip install pillow
57
+pip install beautifulsoup4
58
+pip install tw.forms
59
+pip install tgext.admin
60
+echo
61
+echo
62
+
63
+echo
64
+echo
65
+echo "-------------------------"
66
+echo "- setup project"
67
+echo "-------------------------"
68
+cd pod/
69
+python setup.py develop
70
+echo
71
+echo
72
+
73
+
74
+
75
+cd ${OLD_PATH}

+ 18 - 0
doc/apache.wsgi.example.txt View File

@@ -0,0 +1,18 @@
1
+<VirtualHost *:8888>
2
+    ServerName pod
3
+
4
+    WSGIProcessGroup pod
5
+    WSGIDaemonProcess pod user=www-data group=www-data threads=4 python-path=/home/daccorsi/sources/protos/pod/tg2env/lib/python3.2/site-packages
6
+    WSGIScriptAlias / /home/daccorsi/sources/protos/pod/pod/app.wsgi
7
+
8
+    #Serve static files directly without TurboGears
9
+    Alias /images     /home/daccorsi/sources/protos/pod/pod/pod/public/images
10
+    Alias /favicon.ico     /home/daccorsi/sources/protos/pod/pod/pod/public/favicon.ico
11
+    Alias /css        /home/daccorsi/sources/protos/pod/pod/pod/public/css
12
+    Alias /javascript /home/daccorsi/sources/protos/pod/pod/pod/public/javascript
13
+
14
+    CustomLog /var/log/apache2/pod-access.log combined
15
+    ErrorLog /var/log/apache2/pod-error.log
16
+    LogLevel info
17
+</VirtualHost>
18
+

+ 52 - 0
doc/database/pod-create-database-and-user.sh View File

@@ -0,0 +1,52 @@
1
+#!/bin/bash
2
+POD_DB_USER='pod_user'
3
+POD_DB_USER_PASSWORD='pod_user_password'
4
+POD_DB_NAME='pod'
5
+
6
+# DB_HOST='127.0.0.1'
7
+# DB_PORT='5432'
8
+
9
+BUILD_DB_SQL="
10
+CREATE USER ${POD_DB_USER} WITH PASSWORD '${POD_DB_USER_PASSWORD}';
11
+CREATE DATABASE ${POD_DB_NAME};
12
+GRANT ALL PRIVILEGES ON DATABASE ${POD_DB_NAME} to ${POD_DB_USER};
13
+"
14
+
15
+if [ `whoami` != 'postgres' ]; then
16
+  echo "This script is intended to be executed as postgres user."
17
+  exit 1
18
+fi
19
+
20
+echo "About to create a new database and user:"
21
+echo "- database: ${POD_DB_NAME}"
22
+echo "- user:     ${POD_DB_USER}"
23
+echo "- password: xxxxxx"
24
+echo
25
+echo "Sleeping 10 seconds."
26
+echo "- stop process by CTRL+C if in doubt."
27
+echo "..."
28
+sleep 10
29
+
30
+echo ${BUILD_DB_SQL} | psql
31
+#  -h ${DB_HOST} -p ${DB_PORT}
32
+
33
+
34
+# IF AN ERROR OCCURS, YOU CAn SIMPLY RESET YOUR POSTGRES SERVER 
35
+# WITH THE FOLLOWING SQL COMMANDS (EXECUTED AS postgres USER):
36
+#
37
+# DROP DATABASE pod
38
+# DROP OWNED BY pod_master;
39
+# DROP USER pod_master;
40
+#
41
+# or more faster: 
42
+#
43
+# psql -c "DROP DATABASE pod;"
44
+# psql -c "DROP OWNED BY pod_master;"
45
+# psql -c "DROP USER pod_master;"
46
+
47
+echo
48
+echo "You can now init schema and data by running the following command:"
49
+echo
50
+echo "psql -h 127.0.0.1 -U ${POD_DB_USER} -W ${POD_DB_NAME} < pod-init-database.sql"
51
+echo 
52
+echo "note that you'll be asked for the password"

+ 571 - 0
doc/database/pod-init-database.sql View File

@@ -0,0 +1,571 @@
1
+--
2
+-- PostgreSQL database dump
3
+--
4
+
5
+SET statement_timeout = 0;
6
+SET client_encoding = 'UTF8';
7
+SET standard_conforming_strings = on;
8
+SET check_function_bodies = false;
9
+SET client_min_messages = warning;
10
+
11
+--
12
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
13
+--
14
+
15
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
16
+
17
+
18
+--
19
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
20
+--
21
+
22
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
23
+
24
+
25
+SET search_path = public, pg_catalog;
26
+
27
+--
28
+-- Name: pod_update_node(); Type: FUNCTION; Schema: public; Owner: pod_intranet
29
+--
30
+
31
+CREATE FUNCTION pod_update_node() RETURNS trigger
32
+    LANGUAGE plpgsql
33
+    AS $$
34
+BEGIN
35
+INSERT INTO pod_nodes_history (node_id, parent_id, node_order, node_type, created_at, updated_at, 
36
+       data_label, data_content, data_datetime, node_status, data_reminder_datetime, 
37
+       data_file_name, data_file_content, data_file_mime_type, parent_tree_path, 
38
+       node_depth, owner_id, version_id, is_shared, is_public, public_url_key) VALUES (NEW.node_id, NEW.parent_id, NEW.node_order, NEW.node_type, NEW.created_at, NEW.updated_at, NEW.data_label, NEW.data_content, NEW.data_datetime, NEW.node_status, NEW.data_reminder_datetime, NEW.data_file_name, NEW.data_file_content, NEW.data_file_mime_type, NEW.parent_tree_path, NEW.node_depth, NEW.owner_id, nextval('pod_nodes_version_id_sequence'), NEW.is_shared, NEW.is_public, NEW.public_url_key);
39
+return new;
40
+END;
41
+$$;
42
+
43
+
44
+--
45
+-- Name: set_created_at(); Type: FUNCTION; Schema: public; Owner: pod_intranet
46
+--
47
+
48
+CREATE FUNCTION set_created_at() RETURNS trigger
49
+    LANGUAGE plpgsql
50
+    AS $$
51
+BEGIN
52
+    NEW.created_at = CURRENT_TIMESTAMP;
53
+    NEW.updated_at = CURRENT_TIMESTAMP;
54
+    RETURN NEW;
55
+END;
56
+$$;
57
+
58
+
59
+--
60
+-- Name: set_updated_at(); Type: FUNCTION; Schema: public; Owner: pod_intranet
61
+--
62
+
63
+CREATE FUNCTION set_updated_at() RETURNS trigger
64
+    LANGUAGE plpgsql
65
+    AS $$
66
+BEGIN
67
+    NEW.updated_at = CURRENT_TIMESTAMP;
68
+    RETURN NEW;
69
+END;
70
+$$;
71
+
72
+
73
+SET default_tablespace = '';
74
+
75
+SET default_with_oids = false;
76
+
77
+--
78
+-- Name: migrate_version; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
79
+--
80
+
81
+CREATE TABLE migrate_version (
82
+    version_num character varying(32) NOT NULL
83
+);
84
+
85
+
86
+--
87
+-- Name: pod_group; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
88
+--
89
+
90
+CREATE TABLE pod_group (
91
+    group_id integer NOT NULL,
92
+    group_name character varying(16) NOT NULL,
93
+    display_name character varying(255),
94
+    created timestamp without time zone,
95
+    personnal_group boolean
96
+);
97
+
98
+
99
+--
100
+-- Name: pod_group_group_id_seq; Type: SEQUENCE; Schema: public; Owner: pod_intranet
101
+--
102
+
103
+CREATE SEQUENCE pod_group_group_id_seq
104
+    START WITH 1
105
+    INCREMENT BY 1
106
+    NO MINVALUE
107
+    NO MAXVALUE
108
+    CACHE 1;
109
+
110
+
111
+--
112
+-- Name: pod_group_group_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: pod_intranet
113
+--
114
+
115
+ALTER SEQUENCE pod_group_group_id_seq OWNED BY pod_group.group_id;
116
+
117
+
118
+--
119
+-- Name: pod_group_node; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
120
+--
121
+
122
+CREATE TABLE pod_group_node (
123
+    group_id integer NOT NULL,
124
+    node_id integer NOT NULL,
125
+    rights integer
126
+);
127
+
128
+
129
+--
130
+-- Name: pod_group_permission; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
131
+--
132
+
133
+CREATE TABLE pod_group_permission (
134
+    group_id integer NOT NULL,
135
+    permission_id integer NOT NULL
136
+);
137
+
138
+
139
+
140
+--
141
+-- Name: pod_nodes_version_id_sequence; Type: SEQUENCE; Schema: public; Owner: pod_intranet
142
+--
143
+
144
+CREATE SEQUENCE pod_nodes_version_id_sequence
145
+    START WITH 1
146
+    INCREMENT BY 1
147
+    NO MINVALUE
148
+    NO MAXVALUE
149
+    CACHE 1;
150
+
151
+
152
+--
153
+-- Name: pod_nodes_history; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
154
+--
155
+
156
+CREATE TABLE pod_nodes_history (
157
+    node_id integer NOT NULL,
158
+    parent_id integer,
159
+    node_order integer DEFAULT 1,
160
+    node_type character varying(16) DEFAULT 'data'::character varying NOT NULL,
161
+    created_at timestamp without time zone,
162
+    updated_at timestamp without time zone,
163
+    data_label character varying(1024),
164
+    data_content text DEFAULT ''::text NOT NULL,
165
+    data_datetime timestamp without time zone,
166
+    node_status character varying(16) DEFAULT 'new'::character varying,
167
+    data_reminder_datetime timestamp without time zone,
168
+    data_file_name character varying(255),
169
+    data_file_content bytea,
170
+    data_file_mime_type character varying(255),
171
+    parent_tree_path character varying(255),
172
+    node_depth integer DEFAULT 0 NOT NULL,
173
+    owner_id integer,
174
+    version_id integer DEFAULT nextval('pod_nodes_version_id_sequence'::regclass) NOT NULL,
175
+    is_shared boolean DEFAULT false NOT NULL,
176
+    is_public boolean DEFAULT false NOT NULL,
177
+    public_url_key character varying(1024)
178
+);
179
+
180
+
181
+--
182
+-- Name: pod_nodes; Type: VIEW; Schema: public; Owner: pod_intranet
183
+--
184
+
185
+CREATE VIEW pod_nodes AS
186
+    SELECT DISTINCT ON (pod_nodes_history.node_id) pod_nodes_history.node_id, pod_nodes_history.parent_id, pod_nodes_history.node_order, pod_nodes_history.node_type, pod_nodes_history.created_at, pod_nodes_history.updated_at, pod_nodes_history.data_label, pod_nodes_history.data_content, pod_nodes_history.data_datetime, pod_nodes_history.node_status, pod_nodes_history.data_reminder_datetime, pod_nodes_history.data_file_name, pod_nodes_history.data_file_content, pod_nodes_history.data_file_mime_type, pod_nodes_history.parent_tree_path, pod_nodes_history.node_depth, pod_nodes_history.owner_id, pod_nodes_history.is_shared, pod_nodes_history.is_public, pod_nodes_history.public_url_key FROM pod_nodes_history ORDER BY pod_nodes_history.node_id, pod_nodes_history.updated_at DESC;
187
+
188
+
189
+--
190
+-- Name: pod_nodes__node_id__sequence; Type: SEQUENCE; Schema: public; Owner: pod_intranet
191
+--
192
+
193
+CREATE SEQUENCE pod_nodes__node_id__sequence
194
+    START WITH 1
195
+    INCREMENT BY 1
196
+    NO MINVALUE
197
+    NO MAXVALUE
198
+    CACHE 1;
199
+
200
+
201
+--
202
+-- Name: pod_nodes__node_id__sequence; Type: SEQUENCE OWNED BY; Schema: public; Owner: pod_intranet
203
+--
204
+
205
+ALTER SEQUENCE pod_nodes__node_id__sequence OWNED BY pod_nodes_history.node_id;
206
+
207
+
208
+--
209
+-- Name: pod_permission; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
210
+--
211
+
212
+CREATE TABLE pod_permission (
213
+    permission_id integer NOT NULL,
214
+    permission_name character varying(63) NOT NULL,
215
+    description character varying(255)
216
+);
217
+
218
+
219
+--
220
+-- Name: pod_permission_permission_id_seq; Type: SEQUENCE; Schema: public; Owner: pod_intranet
221
+--
222
+
223
+CREATE SEQUENCE pod_permission_permission_id_seq
224
+    START WITH 1
225
+    INCREMENT BY 1
226
+    NO MINVALUE
227
+    NO MAXVALUE
228
+    CACHE 1;
229
+
230
+
231
+--
232
+-- Name: pod_permission_permission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: pod_intranet
233
+--
234
+
235
+ALTER SEQUENCE pod_permission_permission_id_seq OWNED BY pod_permission.permission_id;
236
+
237
+
238
+--
239
+-- Name: pod_user; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
240
+--
241
+
242
+CREATE TABLE pod_user (
243
+    user_id integer NOT NULL,
244
+    email_address character varying(255) NOT NULL,
245
+    display_name character varying(255),
246
+    password character varying(128),
247
+    created timestamp without time zone
248
+);
249
+
250
+
251
+--
252
+-- Name: pod_user_group; Type: TABLE; Schema: public; Owner: pod_intranet; Tablespace: 
253
+--
254
+
255
+CREATE TABLE pod_user_group (
256
+    user_id integer NOT NULL,
257
+    group_id integer NOT NULL
258
+);
259
+
260
+
261
+--
262
+-- Name: pod_user_user_id_seq; Type: SEQUENCE; Schema: public; Owner: pod_intranet
263
+--
264
+
265
+CREATE SEQUENCE pod_user_user_id_seq
266
+    START WITH 1
267
+    INCREMENT BY 1
268
+    NO MINVALUE
269
+    NO MAXVALUE
270
+    CACHE 1;
271
+
272
+
273
+--
274
+-- Name: pod_user_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: pod_intranet
275
+--
276
+
277
+ALTER SEQUENCE pod_user_user_id_seq OWNED BY pod_user.user_id;
278
+
279
+
280
+--
281
+-- Name: group_id; Type: DEFAULT; Schema: public; Owner: pod_intranet
282
+--
283
+
284
+ALTER TABLE ONLY pod_group ALTER COLUMN group_id SET DEFAULT nextval('pod_group_group_id_seq'::regclass);
285
+
286
+
287
+--
288
+-- Name: node_id; Type: DEFAULT; Schema: public; Owner: pod_intranet
289
+--
290
+
291
+ALTER TABLE ONLY pod_nodes_history ALTER COLUMN node_id SET DEFAULT nextval('pod_nodes__node_id__sequence'::regclass);
292
+
293
+
294
+--
295
+-- Name: permission_id; Type: DEFAULT; Schema: public; Owner: pod_intranet
296
+--
297
+
298
+ALTER TABLE ONLY pod_permission ALTER COLUMN permission_id SET DEFAULT nextval('pod_permission_permission_id_seq'::regclass);
299
+
300
+
301
+--
302
+-- Name: user_id; Type: DEFAULT; Schema: public; Owner: pod_intranet
303
+--
304
+
305
+ALTER TABLE ONLY pod_user ALTER COLUMN user_id SET DEFAULT nextval('pod_user_user_id_seq'::regclass);
306
+
307
+
308
+--
309
+-- Data for Name: migrate_version; Type: TABLE DATA; Schema: public; Owner: pod_intranet
310
+--
311
+
312
+COPY migrate_version (version_num) FROM stdin;
313
+\.
314
+
315
+
316
+--
317
+-- Data for Name: pod_group; Type: TABLE DATA; Schema: public; Owner: pod_intranet
318
+--
319
+
320
+COPY pod_group (group_id, group_name, display_name, created, personnal_group) FROM stdin;
321
+1	managers	Managers	\N	f
322
+3	admin	Admin	\N	f
323
+-1	user_1	\N	2014-06-11 10:55:36.163634	t
324
+2	user	All Users	\N	f
325
+\.
326
+
327
+
328
+--
329
+-- Name: pod_group_group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pod_intranet
330
+--
331
+
332
+SELECT pg_catalog.setval('pod_group_group_id_seq', 1, false);
333
+
334
+
335
+--
336
+-- Data for Name: pod_group_permission; Type: TABLE DATA; Schema: public; Owner: pod_intranet
337
+--
338
+
339
+COPY pod_group_permission (group_id, permission_id) FROM stdin;
340
+\.
341
+
342
+--
343
+-- Name: pod_nodes__node_id__sequence; Type: SEQUENCE SET; Schema: public; Owner: pod_intranet
344
+--
345
+
346
+SELECT pg_catalog.setval('pod_nodes__node_id__sequence', 25, true);
347
+
348
+--
349
+-- Name: pod_nodes_version_id_sequence; Type: SEQUENCE SET; Schema: public; Owner: pod_intranet
350
+--
351
+
352
+SELECT pg_catalog.setval('pod_nodes_version_id_sequence', 41, true);
353
+
354
+
355
+--
356
+-- Data for Name: pod_permission; Type: TABLE DATA; Schema: public; Owner: pod_intranet
357
+--
358
+
359
+COPY pod_permission (permission_id, permission_name, description) FROM stdin;
360
+\.
361
+
362
+
363
+--
364
+-- Name: pod_permission_permission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pod_intranet
365
+--
366
+
367
+SELECT pg_catalog.setval('pod_permission_permission_id_seq', 1, false);
368
+
369
+
370
+--
371
+-- Data for Name: pod_user; Type: TABLE DATA; Schema: public; Owner: pod_intranet
372
+--
373
+
374
+COPY pod_user (user_id, email_address, display_name, password, created) FROM stdin;
375
+1	admin@localhost	Admin	b0c2243d8052ebc30e446d557b3249ed143e0ba6922ec49d9c53f3c1a533ae25b5dc4ec00d6cc3dd9fc9c74107e9914b3ace56ba8ded846bda9c140c0d6f721e	2014-06-11 10:55:36.15707
376
+\.
377
+
378
+
379
+--
380
+-- Data for Name: pod_user_group; Type: TABLE DATA; Schema: public; Owner: pod_intranet
381
+--
382
+
383
+COPY pod_user_group (user_id, group_id) FROM stdin;
384
+1	2
385
+1	-1
386
+\.
387
+
388
+
389
+--
390
+-- Name: pod_user_user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pod_intranet
391
+--
392
+
393
+SELECT pg_catalog.setval('pod_user_user_id_seq', 1, true);
394
+
395
+
396
+--
397
+-- Name: pod_group_group_name_key; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
398
+--
399
+
400
+ALTER TABLE ONLY pod_group
401
+    ADD CONSTRAINT pod_group_group_name_key UNIQUE (group_name);
402
+
403
+
404
+--
405
+-- Name: pod_group_node_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
406
+--
407
+
408
+ALTER TABLE ONLY pod_group_node
409
+    ADD CONSTRAINT pod_group_node_pkey PRIMARY KEY (group_id, node_id);
410
+
411
+
412
+--
413
+-- Name: pod_group_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
414
+--
415
+
416
+ALTER TABLE ONLY pod_group_permission
417
+    ADD CONSTRAINT pod_group_permission_pkey PRIMARY KEY (group_id, permission_id);
418
+
419
+
420
+--
421
+-- Name: pod_group_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
422
+--
423
+
424
+ALTER TABLE ONLY pod_group
425
+    ADD CONSTRAINT pod_group_pkey PRIMARY KEY (group_id);
426
+
427
+
428
+--
429
+-- Name: pod_nodes_history_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
430
+--
431
+
432
+ALTER TABLE ONLY pod_nodes_history
433
+    ADD CONSTRAINT pod_nodes_history_pkey PRIMARY KEY (version_id);
434
+
435
+
436
+--
437
+-- Name: pod_permission_permission_name_key; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
438
+--
439
+
440
+ALTER TABLE ONLY pod_permission
441
+    ADD CONSTRAINT pod_permission_permission_name_key UNIQUE (permission_name);
442
+
443
+
444
+--
445
+-- Name: pod_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
446
+--
447
+
448
+ALTER TABLE ONLY pod_permission
449
+    ADD CONSTRAINT pod_permission_pkey PRIMARY KEY (permission_id);
450
+
451
+
452
+--
453
+-- Name: pod_user_email_address_key; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
454
+--
455
+
456
+ALTER TABLE ONLY pod_user
457
+    ADD CONSTRAINT pod_user_email_address_key UNIQUE (email_address);
458
+
459
+
460
+--
461
+-- Name: pod_user_group_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
462
+--
463
+
464
+ALTER TABLE ONLY pod_user_group
465
+    ADD CONSTRAINT pod_user_group_pkey PRIMARY KEY (user_id, group_id);
466
+
467
+
468
+--
469
+-- Name: pod_user_pkey; Type: CONSTRAINT; Schema: public; Owner: pod_intranet; Tablespace: 
470
+--
471
+
472
+ALTER TABLE ONLY pod_user
473
+    ADD CONSTRAINT pod_user_pkey PRIMARY KEY (user_id);
474
+
475
+
476
+--
477
+-- Name: fki_pod_nodes__owner_id_fk; Type: INDEX; Schema: public; Owner: pod_intranet; Tablespace: 
478
+--
479
+
480
+CREATE INDEX fki_pod_nodes__owner_id_fk ON pod_nodes_history USING btree (owner_id);
481
+
482
+
483
+--
484
+-- Name: fki_pod_nodes__parent_id_fk; Type: INDEX; Schema: public; Owner: pod_intranet; Tablespace: 
485
+--
486
+
487
+CREATE INDEX fki_pod_nodes__parent_id_fk ON pod_nodes_history USING btree (parent_id);
488
+
489
+
490
+--
491
+-- Name: idx_pod_nodes__parent_tree_path; Type: INDEX; Schema: public; Owner: pod_intranet; Tablespace: 
492
+--
493
+
494
+CREATE INDEX idx_pod_nodes__parent_tree_path ON pod_nodes_history USING btree (parent_tree_path);
495
+
496
+
497
+--
498
+-- Name: pod_insert_new_node; Type: RULE; Schema: public; Owner: pod_intranet
499
+--
500
+
501
+CREATE RULE pod_insert_new_node AS ON INSERT TO pod_nodes DO INSTEAD INSERT INTO pod_nodes_history (node_id, parent_id, node_order, node_type, created_at, updated_at, data_label, data_content, data_datetime, node_status, data_reminder_datetime, data_file_name, data_file_content, data_file_mime_type, parent_tree_path, node_depth, owner_id, version_id, is_shared, is_public, public_url_key) VALUES (nextval('pod_nodes__node_id__sequence'::regclass), new.parent_id, new.node_order, new.node_type, new.created_at, new.updated_at, new.data_label, new.data_content, new.data_datetime, new.node_status, new.data_reminder_datetime, new.data_file_name, new.data_file_content, new.data_file_mime_type, new.parent_tree_path, new.node_depth, new.owner_id, nextval('pod_nodes_version_id_sequence'::regclass), new.is_shared, new.is_public, new.public_url_key) RETURNING pod_nodes_history.node_id, pod_nodes_history.parent_id, pod_nodes_history.node_order, pod_nodes_history.node_type, pod_nodes_history.created_at, pod_nodes_history.updated_at, pod_nodes_history.data_label, pod_nodes_history.data_content, pod_nodes_history.data_datetime, pod_nodes_history.node_status, pod_nodes_history.data_reminder_datetime, pod_nodes_history.data_file_name, pod_nodes_history.data_file_content, pod_nodes_history.data_file_mime_type, pod_nodes_history.parent_tree_path, pod_nodes_history.node_depth, pod_nodes_history.owner_id, pod_nodes_history.is_shared, pod_nodes_history.is_public, pod_nodes_history.public_url_key;
502
+
503
+
504
+--
505
+-- Name: pod_nodes__on_insert_set_created_at; Type: TRIGGER; Schema: public; Owner: pod_intranet
506
+--
507
+
508
+CREATE TRIGGER pod_nodes__on_insert_set_created_at BEFORE INSERT ON pod_nodes_history FOR EACH ROW EXECUTE PROCEDURE set_created_at();
509
+
510
+
511
+--
512
+-- Name: pod_nodes__on_update_set_updated_at; Type: TRIGGER; Schema: public; Owner: pod_intranet
513
+--
514
+
515
+CREATE TRIGGER pod_nodes__on_update_set_updated_at BEFORE UPDATE ON pod_nodes_history FOR EACH ROW EXECUTE PROCEDURE set_updated_at();
516
+
517
+
518
+--
519
+-- Name: pod_update_node_tg; Type: TRIGGER; Schema: public; Owner: pod_intranet
520
+--
521
+
522
+CREATE TRIGGER pod_update_node_tg INSTEAD OF UPDATE ON pod_nodes FOR EACH ROW EXECUTE PROCEDURE pod_update_node();
523
+
524
+
525
+--
526
+-- Name: pod_group_node_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
527
+--
528
+
529
+ALTER TABLE ONLY pod_group_node
530
+    ADD CONSTRAINT pod_group_node_group_id_fkey FOREIGN KEY (group_id) REFERENCES pod_group(group_id) ON UPDATE CASCADE ON DELETE CASCADE;
531
+
532
+
533
+--
534
+-- Name: pod_group_permission_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
535
+--
536
+
537
+ALTER TABLE ONLY pod_group_permission
538
+    ADD CONSTRAINT pod_group_permission_group_id_fkey FOREIGN KEY (group_id) REFERENCES pod_group(group_id) ON UPDATE CASCADE ON DELETE CASCADE;
539
+
540
+
541
+--
542
+-- Name: pod_group_permission_permission_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
543
+--
544
+
545
+ALTER TABLE ONLY pod_group_permission
546
+    ADD CONSTRAINT pod_group_permission_permission_id_fkey FOREIGN KEY (permission_id) REFERENCES pod_permission(permission_id) ON UPDATE CASCADE ON DELETE CASCADE;
547
+
548
+
549
+--
550
+-- Name: pod_nodes__owner_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
551
+--
552
+
553
+ALTER TABLE ONLY pod_nodes_history
554
+    ADD CONSTRAINT pod_nodes__owner_id_fk FOREIGN KEY (owner_id) REFERENCES pod_user(user_id);
555
+
556
+
557
+--
558
+-- Name: pod_user_group_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
559
+--
560
+
561
+ALTER TABLE ONLY pod_user_group
562
+    ADD CONSTRAINT pod_user_group_group_id_fkey FOREIGN KEY (group_id) REFERENCES pod_group(group_id) ON UPDATE CASCADE ON DELETE CASCADE;
563
+
564
+
565
+--
566
+-- Name: pod_user_group_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: pod_intranet
567
+--
568
+
569
+ALTER TABLE ONLY pod_user_group
570
+    ADD CONSTRAINT pod_user_group_user_id_fkey FOREIGN KEY (user_id) REFERENCES pod_user(user_id) ON UPDATE CASCADE ON DELETE CASCADE;
571
+

+ 39 - 0
install/requirements.txt View File

@@ -0,0 +1,39 @@
1
+Beaker==1.6.4
2
+FormEncode==1.3.0a1
3
+Genshi==0.7
4
+Mako==1.0.0
5
+MarkupSafe==0.15
6
+PasteDeploy==1.5.2
7
+Pillow==2.4.0
8
+SQLAlchemy==0.9.4
9
+Tempita==0.5.3dev
10
+TurboGears2==2.3.2
11
+WebOb==1.4
12
+WebTest==1.4.3
13
+alembic==0.6.5
14
+backlash==0.0.5
15
+beautifulsoup4==4.3.2
16
+cliff==1.6.1
17
+cmd2==0.6.7
18
+crank==0.7.1
19
+decorator==3.4.0
20
+distribute==0.6.24
21
+gearbox==0.0.6
22
+prettytable==0.7.2
23
+psycopg2==2.5.3
24
+pyparsing==2.0.2
25
+repoze.lru==0.6
26
+repoze.who==2.2
27
+six==1.7.2
28
+speaklater==1.3
29
+sprox==0.9.3
30
+stevedore==0.15
31
+tg.devtools==2.3.2
32
+tgext.admin==0.6.4
33
+tgext.crud==0.7.2
34
+transaction==1.4.3
35
+tw2.core==2.2.1.1
36
+tw2.forms==2.2.0.3
37
+wsgiref==0.1.2
38
+zope.interface==4.1.1
39
+zope.sqlalchemy==0.7.4

+ 4 - 0
pod/MANIFEST.in View File

@@ -0,0 +1,4 @@
1
+recursive-include pod/public *
2
+include pod/public/favicon.ico
3
+recursive-include pod/i18n *
4
+recursive-include pod/templates *

+ 24 - 0
pod/README.txt View File

@@ -0,0 +1,24 @@
1
+This file is for you to describe the pod application. Typically
2
+you would include information such as the information below:
3
+
4
+Installation and Setup
5
+======================
6
+
7
+Install ``pod`` using the setup.py script::
8
+
9
+    $ cd pod
10
+    $ python setup.py develop
11
+
12
+Create the project database for any model classes defined::
13
+
14
+    $ gearbox setup-app
15
+
16
+Start the paste http server::
17
+
18
+    $ gearbox serve
19
+
20
+While developing you may want the server to reload after changes in package files (or its dependencies) are saved. This can be achieved easily by adding the --reload option::
21
+
22
+    $ gearbox serve --reload --debug
23
+
24
+Then you are ready to go.

+ 11 - 0
pod/app.wsgi View File

@@ -0,0 +1,11 @@
1
+APP_CONFIG = "/home/daccorsi/sources/pod/pod/development.ini"
2
+
3
+#Setup logging
4
+import logging
5
+# logging.config.fileConfig(APP_CONFIG)
6
+
7
+#Load the application
8
+from paste.deploy import loadapp
9
+application = loadapp('config:%s' % APP_CONFIG)
10
+application.debug = True
11
+

+ 141 - 0
pod/development.ini.base View File

@@ -0,0 +1,141 @@
1
+#
2
+# pod - TurboGears 2 development environment configuration
3
+#
4
+# The %(here)s variable will be replaced with the parent directory of this file
5
+#
6
+# This file is for deployment specific config options -- other configuration
7
+# that is always required for the app is done in the config directory,
8
+# and generally should not be modified by end users.
9
+
10
+[DEFAULT]
11
+debug = true
12
+# Uncomment and replace with the address which should receive any error reports
13
+#email_to = you@yourdomain.com
14
+smtp_server = localhost
15
+error_email_from = turbogears@localhost
16
+
17
+[server:main]
18
+use = egg:gearbox#wsgiref
19
+host = 0.0.0.0
20
+port = 8080
21
+
22
+[sa_auth]
23
+cookie_secret = 3283411b-1904-4554-b0e1-883863b53080
24
+
25
+[app:main]
26
+use = egg:pod
27
+full_stack = true
28
+#lang = fr_FR
29
+cache_dir = %(here)s/data
30
+beaker.session.key = pod
31
+beaker.session.secret = 3283411b-1904-4554-b0e1-883863b53080
32
+
33
+#By default session is store in cookies to avoid the overhead
34
+#of having to manage a session storage. On production you might
35
+#want to switch to a better session storage.
36
+beaker.session.type = cookie
37
+beaker.session.validate_key = 3283411b-1904-4554-b0e1-883863b53080
38
+
39
+# Disable template autoreload to boost performances in production
40
+# WARNING: if you want to deploy your application using a zipped egg
41
+# (ie: if your application's setup.py defines zip-safe=True, then you
42
+# MUST put "false" for the production environment because there will
43
+# be no disk and real files to compare time with.
44
+#auto_reload_templates = false
45
+
46
+# If you'd like to fine-tune the individual locations of the cache data dirs
47
+# for the Cache data, or the Session saves, un-comment the desired settings
48
+# here:
49
+#beaker.cache.data_dir = %(here)s/data/cache
50
+#beaker.session.data_dir = %(here)s/data/sessions
51
+
52
+# pick the form for your database
53
+# %(here) may include a ':' character on Windows environments; this can
54
+# invalidate the URI when specifying a SQLite db via path name
55
+# sqlalchemy.url=postgresql://username:password@hostname:port/databasename
56
+# sqlalchemy.url=mysql://username:password@hostname:port/databasename
57
+sqlalchemy.url = postgresql://pod_user:pod_user_password@127.0.0.1:5432/pod
58
+
59
+#echo shouldn't be used together with the logging module.
60
+sqlalchemy.echo = false
61
+sqlalchemy.echo_pool = false
62
+sqlalchemy.pool_recycle = 3600
63
+
64
+# This line ensures that Genshi will render xhtml when sending the
65
+# output. Change to html or xml, as desired.
66
+templating.genshi.method = xhtml
67
+templating.genshi.doctype = html5
68
+
69
+# the compiled template dir is a directory that must be readable and writable
70
+# by your webserver. It will be used to store the resulting templates once
71
+# compiled by the TemplateLookup system.
72
+# During development you generally don't need this option since paste's HTTP
73
+# server will have access to you development directories, but in production
74
+# you'll most certainly want to have apache or nginx to write in a directory
75
+# that does not contain any source code in any form for obvious security
76
+# reasons.  If disabled, None, False, or not writable, it will fall back
77
+# to an in-memory cache.
78
+templating.mako.compiled_templates_dir = %(here)s/data/templates
79
+
80
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
81
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
82
+# execute malicious code after an exception is raised.
83
+#set debug = false
84
+
85
+# Logging configuration
86
+# Add additional loggers, handlers, formatters here
87
+# Uses python's logging config file format
88
+# http://docs.python.org/lib/logging-config-fileformat.html
89
+
90
+#turn this setting to "min" if you would like tw to produce minified
91
+#javascript files (if your library supports that)
92
+toscawidgets.framework.resource_variant=debug
93
+
94
+# if you want to setup analytics like piwik or google analytics, then put the js code in a file and set file path below
95
+#js_tracker_path = analytics.js
96
+
97
+[loggers]
98
+keys = root, pod, sqlalchemy, auth
99
+
100
+[handlers]
101
+keys = console
102
+
103
+[formatters]
104
+keys = generic
105
+
106
+# If you create additional loggers, add them as a key to [loggers]
107
+[logger_root]
108
+level = INFO
109
+handlers = console
110
+
111
+[logger_pod]
112
+level = DEBUG
113
+handlers =
114
+qualname = pod
115
+
116
+[logger_sqlalchemy]
117
+level = INFO
118
+handlers =
119
+qualname = sqlalchemy.engine
120
+# "level = INFO" logs SQL queries.
121
+# "level = DEBUG" logs SQL queries and results.
122
+# "level = WARN" logs neither.  (Recommended for production systems.)
123
+
124
+# A logger for authentication, identification and authorization
125
+# this is repoze.who:
126
+[logger_auth]
127
+level = WARN
128
+handlers =
129
+qualname = auth
130
+
131
+# If you create additional handlers, add them as a key to [handlers]
132
+[handler_console]
133
+class = StreamHandler
134
+args = (sys.stderr,)
135
+level = NOTSET
136
+formatter = generic
137
+
138
+# If you create additional formatters, add them as a key to [formatters]
139
+[formatter_generic]
140
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
141
+datefmt = %H:%M:%S

+ 73 - 0
pod/migration/env.py View File

@@ -0,0 +1,73 @@
1
+from __future__ import with_statement
2
+from alembic import context
3
+from sqlalchemy import engine_from_config, pool
4
+from logging.config import fileConfig
5
+
6
+# this is the Alembic Config object, which provides
7
+# access to the values within the .ini file in use.
8
+config = context.config
9
+
10
+# Interpret the config file for Python logging.
11
+# This line sets up loggers basically.
12
+#fileConfig(config.config_file_name)
13
+
14
+# add your model's MetaData object here
15
+# for 'autogenerate' support
16
+# from myapp import mymodel
17
+# target_metadata = mymodel.Base.metadata
18
+from pod import model
19
+target_metadata = model.metadata
20
+
21
+# other values from the config, defined by the needs of env.py,
22
+# can be acquired:
23
+# my_important_option = config.get_main_option("my_important_option")
24
+# ... etc.
25
+
26
+def run_migrations_offline():
27
+    """Run migrations in 'offline' mode.
28
+
29
+    This configures the context with just a URL
30
+    and not an Engine, though an Engine is acceptable
31
+    here as well.  By skipping the Engine creation
32
+    we don't even need a DBAPI to be available.
33
+
34
+    Calls to context.execute() here emit the given string to the
35
+    script output.
36
+
37
+    """
38
+    url = config.get_main_option("sqlalchemy.url")
39
+    context.configure(url=url, version_table='migrate_version')
40
+
41
+    with context.begin_transaction():
42
+        context.run_migrations()
43
+
44
+def run_migrations_online():
45
+    """Run migrations in 'online' mode.
46
+
47
+    In this scenario we need to create an Engine
48
+    and associate a connection with the context.
49
+
50
+    """
51
+    engine = engine_from_config(
52
+                config.get_section(config.config_ini_section),
53
+                prefix='sqlalchemy.',
54
+                poolclass=pool.NullPool)
55
+
56
+    connection = engine.connect()
57
+    context.configure(
58
+                connection=connection,
59
+                target_metadata=target_metadata,
60
+                version_table='migrate_version'
61
+                )
62
+
63
+    try:
64
+        with context.begin_transaction():
65
+            context.run_migrations()
66
+    finally:
67
+        connection.close()
68
+
69
+if context.is_offline_mode():
70
+    run_migrations_offline()
71
+else:
72
+    run_migrations_online()
73
+

+ 22 - 0
pod/migration/script.py.mako View File

@@ -0,0 +1,22 @@
1
+"""${message}
2
+
3
+Revision ID: ${up_revision}
4
+Revises: ${down_revision}
5
+Create Date: ${create_date}
6
+
7
+"""
8
+
9
+# revision identifiers, used by Alembic.
10
+revision = ${repr(up_revision)}
11
+down_revision = ${repr(down_revision)}
12
+
13
+from alembic import op
14
+import sqlalchemy as sa
15
+${imports if imports else ""}
16
+
17
+def upgrade():
18
+    ${upgrades if upgrades else "pass"}
19
+
20
+
21
+def downgrade():
22
+    ${downgrades if downgrades else "pass"}

+ 0 - 0
pod/migration/versions/empty.txt View File


+ 2 - 0
pod/pod/__init__.py View File

@@ -0,0 +1,2 @@
1
+# -*- coding: utf-8 -*-
2
+"""The pod package"""

+ 2 - 0
pod/pod/config/__init__.py View File

@@ -0,0 +1,2 @@
1
+# -*- coding: utf-8 -*-
2
+

+ 93 - 0
pod/pod/config/app_cfg.py View File

@@ -0,0 +1,93 @@
1
+# -*- coding: utf-8 -*-
2
+"""
3
+Global configuration file for TG2-specific settings in pod.
4
+
5
+This file complements development/deployment.ini.
6
+
7
+Please note that **all the argument values are strings**. If you want to
8
+convert them into boolean, for example, you should use the
9
+:func:`paste.deploy.converters.asbool` function, as in::
10
+    
11
+    from paste.deploy.converters import asbool
12
+    setting = asbool(global_conf.get('the_setting'))
13
+ 
14
+"""
15
+
16
+from tg.configuration import AppConfig
17
+
18
+import pod
19
+from pod import model
20
+from pod.lib import app_globals, helpers 
21
+
22
+base_config = AppConfig()
23
+base_config.renderers = []
24
+base_config.use_toscawidgets = False
25
+base_config.use_toscawidgets2 = True
26
+
27
+base_config.package = pod
28
+
29
+#Enable json in expose
30
+base_config.renderers.append('json')
31
+#Enable genshi in expose to have a lingua franca for extensions and pluggable apps
32
+#you can remove this if you don't plan to use it.
33
+base_config.renderers.append('genshi')
34
+
35
+#Set the default renderer
36
+base_config.default_renderer = 'mako'
37
+base_config.renderers.append('mako')
38
+#Configure the base SQLALchemy Setup
39
+base_config.use_sqlalchemy = True
40
+base_config.model = pod.model
41
+base_config.DBSession = pod.model.DBSession
42
+# Configure the authentication backend
43
+
44
+# YOU MUST CHANGE THIS VALUE IN PRODUCTION TO SECURE YOUR APP 
45
+base_config.sa_auth.cookie_secret = "3283411b-1904-4554-b0e1-883863b53080"
46
+
47
+base_config.auth_backend = 'sqlalchemy'
48
+
49
+# what is the class you want to use to search for users in the database
50
+base_config.sa_auth.user_class = model.User
51
+
52
+from tg.configuration.auth import TGAuthMetadata
53
+
54
+#This tells to TurboGears how to retrieve the data for your user
55
+class ApplicationAuthMetadata(TGAuthMetadata):
56
+    def __init__(self, sa_auth):
57
+        self.sa_auth = sa_auth
58
+    def authenticate(self, environ, identity):
59
+        user = self.sa_auth.dbsession.query(self.sa_auth.user_class).filter_by(email_address=identity['login']).first()
60
+        if user and user.validate_password(identity['password']):
61
+            return identity['login']
62
+    def get_user(self, identity, userid):
63
+        return self.sa_auth.dbsession.query(self.sa_auth.user_class).filter_by(email_address=userid).first()
64
+    def get_groups(self, identity, userid):
65
+        return [g.group_name for g in identity['user'].groups]
66
+    def get_permissions(self, identity, userid):
67
+        return [p.permission_name for p in identity['user'].permissions]
68
+
69
+base_config.sa_auth.dbsession = model.DBSession
70
+
71
+base_config.sa_auth.authmetadata = ApplicationAuthMetadata(base_config.sa_auth)
72
+
73
+# You can use a different repoze.who Authenticator if you want to
74
+# change the way users can login
75
+#base_config.sa_auth.authenticators = [('myauth', SomeAuthenticator()]
76
+
77
+# You can add more repoze.who metadata providers to fetch
78
+# user metadata.
79
+# Remember to set base_config.sa_auth.authmetadata to None
80
+# to disable authmetadata and use only your own metadata providers
81
+#base_config.sa_auth.mdproviders = [('myprovider', SomeMDProvider()]
82
+
83
+# override this if you would like to provide a different who plugin for
84
+# managing login and logout of your application
85
+base_config.sa_auth.form_plugin = None
86
+
87
+# You may optionally define a page where you want users to be redirected to
88
+# on login:
89
+base_config.sa_auth.post_login_url = '/post_login'
90
+
91
+# You may optionally define a page where you want users to be redirected to
92
+# on logout:
93
+base_config.sa_auth.post_logout_url = '/post_logout'

+ 101 - 0
pod/pod/config/deployment.ini_tmpl View File

@@ -0,0 +1,101 @@
1
+#
2
+# pod - TurboGears 2 production environment configuration
3
+#
4
+# The %(here)s variable will be replaced with the parent directory of this file
5
+#
6
+[DEFAULT]
7
+# WARGING == If debug is not set to false, you'll get the interactive
8
+# debugger on production, which is a huge security hole.
9
+
10
+debug = false
11
+email_to = you@yourdomain.com
12
+smtp_server = localhost
13
+error_email_from = turbogears@localhost
14
+
15
+[server:main]
16
+use = egg:gearbox#wsgiref
17
+host = 0.0.0.0
18
+port = 8080
19
+
20
+[sa_auth]
21
+cookie_secret = ${app_instance_secret}
22
+
23
+[app:main]
24
+use = egg:pod
25
+full_stack = true
26
+cache_dir = %(here)s/data
27
+beaker.session.key = pod
28
+beaker.session.secret = ${app_instance_secret}
29
+app_instance_uuid = ${app_instance_uuid}
30
+
31
+# If you'd like to fine-tune the individual locations of the cache data dirs
32
+# for the Cache data, or the Session saves, un-comment the desired settings
33
+# here:
34
+#beaker.cache.data_dir = %(here)s/data/cache
35
+#beaker.session.data_dir = %(here)s/data/sessions
36
+# Specify the database for SQLAlchemy to use via
37
+# turbogears.database
38
+# %(here) may include a ':' character on Windows environments; this can
39
+# invalidate the URI when specifying a SQLite db via path name
40
+sqlalchemy.url = sqlite:///%(here)s/somedb.db
41
+sqlalchemy.echo = False
42
+
43
+# This line ensures that Genshi will render xhtml when sending the
44
+# output. Change to html or xml, as desired.
45
+templating.genshi.method = xhtml
46
+
47
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
48
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
49
+# execute malicious code after an exception is raised.
50
+#set debug = false
51
+
52
+# Logging configuration
53
+# Add additional loggers, handlers, formatters here
54
+# Uses python's logging config file format
55
+# http://docs.python.org/lib/logging-config-fileformat.html
56
+
57
+[loggers]
58
+keys = root, pod, sqlalchemy, auth
59
+
60
+[handlers]
61
+keys = console
62
+
63
+[formatters]
64
+keys = generic
65
+
66
+# If you create additional loggers, add them as a key to [loggers]
67
+[logger_root]
68
+level = INFO
69
+handlers = console
70
+
71
+[logger_pod]
72
+level = INFO
73
+handlers =
74
+qualname = pod
75
+
76
+[logger_sqlalchemy]
77
+level = WARN
78
+handlers =
79
+qualname = sqlalchemy.engine
80
+# "level = INFO" logs SQL queries.
81
+# "level = DEBUG" logs SQL queries and results.
82
+# "level = WARN" logs neither.  (Recommended for production systems.)
83
+
84
+# A logger for authentication, identification and authorization
85
+# This is repoze.who:
86
+[logger_auth]
87
+level = WARN
88
+handlers =
89
+qualname = auth
90
+
91
+# If you create additional handlers, add them as a key to [handlers]
92
+[handler_console]
93
+class = StreamHandler
94
+args = (sys.stderr,)
95
+level = NOTSET
96
+formatter = generic
97
+
98
+# If you create additional formatters, add them as a key to [formatters]
99
+[formatter_generic]
100
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
101
+datefmt = %Y-%m-%d %H:%M:%S

+ 9 - 0
pod/pod/config/environment.py View File

@@ -0,0 +1,9 @@
1
+# -*- coding: utf-8 -*-
2
+"""WSGI environment setup for pod."""
3
+
4
+from pod.config.app_cfg import base_config
5
+
6
+__all__ = ['load_environment']
7
+
8
+#Use base_config to setup the environment loader function
9
+load_environment = base_config.make_load_environment()

+ 39 - 0
pod/pod/config/middleware.py View File

@@ -0,0 +1,39 @@
1
+# -*- coding: utf-8 -*-
2
+"""WSGI middleware initialization for the pod application."""
3
+
4
+from pod.config.app_cfg import base_config
5
+from pod.config.environment import load_environment
6
+
7
+
8
+__all__ = ['make_app']
9
+
10
+# Use base_config to setup the necessary PasteDeploy application factory. 
11
+# make_base_app will wrap the TG2 app with all the middleware it needs. 
12
+make_base_app = base_config.setup_tg_wsgi_app(load_environment)
13
+
14
+
15
+def make_app(global_conf, full_stack=True, **app_conf):
16
+    """
17
+    Set pod up with the settings found in the PasteDeploy configuration
18
+    file used.
19
+    
20
+    :param global_conf: The global settings for pod (those
21
+        defined under the ``[DEFAULT]`` section).
22
+    :type global_conf: dict
23
+    :param full_stack: Should the whole TG2 stack be set up?
24
+    :type full_stack: str or bool
25
+    :return: The pod application with all the relevant middleware
26
+        loaded.
27
+    
28
+    This is the PasteDeploy factory for the pod application.
29
+    
30
+    ``app_conf`` contains all the application-specific settings (those defined
31
+    under ``[app:main]``.
32
+    
33
+   
34
+    """
35
+    app = make_base_app(global_conf, full_stack=True, **app_conf)
36
+    
37
+    # Wrap your base TurboGears 2 application with custom middleware here
38
+    
39
+    return app

+ 2 - 0
pod/pod/controllers/__init__.py View File

@@ -0,0 +1,2 @@
1
+# -*- coding: utf-8 -*-
2
+"""Controllers for the pod application."""

+ 72 - 0
pod/pod/controllers/admingroup.py View File

@@ -0,0 +1,72 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from pod import model  as pm
4
+
5
+from tgext.crud import CrudRestController
6
+from sprox.tablebase import TableBase
7
+from sprox.formbase import EditableForm, AddRecordForm
8
+from sprox.fillerbase import TableFiller, EditFormFiller
9
+from pod.model import auth as pma
10
+from tw2 import forms as tw2f
11
+import tg
12
+
13
+from sprox.widgets import PropertyMultipleSelectField
14
+from sprox._compat import unicode_text
15
+from formencode import Schema
16
+from formencode.validators import FieldsMatch
17
+
18
+from pod.lib import dbapi as pld
19
+
20
+class AdminGroupController(CrudRestController):
21
+    model = pma.Group
22
+    substring_filters = True
23
+
24
+    class new_form_type(AddRecordForm):
25
+        __model__ = pma.Group
26
+        __require_fields__     = ['group_name', 'display_name', 'users', 'personnal_group']
27
+        __omit_fields__        = ['created', 'permissions', '_lRights']
28
+        __field_order__        = ['group_name', 'display_name', 'users']
29
+
30
+        __headers__ = dict(group_name='Unique name', display_name='Visible name')
31
+
32
+        group_name = tw2f.TextField('group_name')
33
+        display_name = tw2f.TextField('display_name')
34
+        personnal_group = tw2f.HiddenField('personnal_group', value='off')
35
+
36
+
37
+    class edit_form_type(EditableForm):
38
+        __model__ = pma.Group
39
+        __require_fields__     = ['group_name', 'display_name', 'users']
40
+        __omit_fields__        = ['personnal_group', 'created', 'permissions', '_lRights']
41
+        __field_order__        = ['group_name', 'display_name']
42
+
43
+        __headers__ = dict(group_name='Unique name', display_name='Visible name')
44
+
45
+
46
+    class edit_filler_type(EditFormFiller):
47
+        __model__ = pma.Group
48
+
49
+
50
+    class table_type(TableBase):
51
+        __model__ = pma.Group
52
+        __limit_fields__ = ['group_id', 'group_name', 'display_name', 'users']
53
+        __headers__ = dict(group_id='id', group_name='Unique name', display_name='Visible name', users='Users')
54
+        __xml_fields__ = ['users']
55
+
56
+
57
+    class table_filler_type(TableFiller):
58
+        __model__ = pma.Group
59
+        __limit_fields__ = ['group_id', 'group_name', 'display_name', 'users']
60
+        #__add_fields__ = {'associated_users':None}
61
+
62
+        def _do_get_provider_count_and_objs(self, groups=None, **kw):
63
+            groups = pm.DBSession.query(pma.Group).\
64
+                filter(pma.Group.group_id>0).\
65
+                filter(pma.Group.group_id != pma.Group.GROUP_ID_ALL_USERS).\
66
+                filter(pma.Group.group_id != pma.Group.GROUP_ID_MANAGERS).\
67
+                all()
68
+            return len(groups), groups
69
+
70
+        def users(self, obj):
71
+            users = ''.join(['<li>{0}</li>'.format(user.getDisplayName()) for user in obj.users])
72
+            return users.join(('<ul>', '</ul>'))

+ 128 - 0
pod/pod/controllers/adminuser.py View File

@@ -0,0 +1,128 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from pod import model  as pm
4
+
5
+from tgext.crud import CrudRestController
6
+from sprox.tablebase import TableBase
7
+from sprox.formbase import EditableForm, AddRecordForm
8
+from sprox.fillerbase import TableFiller, EditFormFiller
9
+from pod.model import auth as pma
10
+from tw2 import forms as tw2f
11
+import tg
12
+
13
+from sprox.widgets import PropertyMultipleSelectField
14
+from sprox._compat import unicode_text
15
+from formencode import Schema
16
+from formencode.validators import FieldsMatch
17
+
18
+from pod.lib import dbapi as pld
19
+
20
+class GroupField(PropertyMultipleSelectField):
21
+    """ Shows a limited list of groups """
22
+
23
+    def prepare(self):
24
+        # self.entity = pma.Group
25
+        #self.__class__.entity
26
+
27
+        visible_groups = pm.DBSession.query(pma.Group).\
28
+            filter(pma.Group.group_id>0).\
29
+            filter(pma.Group.group_id!=pma.Group.GROUP_ID_ALL_USERS).all()
30
+
31
+        self.options = [(group.group_id, group.getDisplayName()) for group in visible_groups]
32
+
33
+        if not self.value:
34
+            self.value = []
35
+        self.value = [unicode_text(v) for v in self.value]
36
+
37
+        super(PropertyMultipleSelectField, self).prepare()
38
+
39
+
40
+class AdminUserController(CrudRestController):
41
+    model = pma.User
42
+    substring_filters = True
43
+
44
+    class new_form_type(AddRecordForm):
45
+        __model__ = pma.User
46
+
47
+        __require_fields__     = ['display_name', 'email_address', 'password', 'verify_password', 'groups']
48
+        __omit_fields__        = ['_password', 'created', 'user_id', '_lAllNodes']
49
+        __field_order__        = ['display_name', 'email_address', 'password', 'verify_password', 'groups']
50
+
51
+        email_address          = tw2f.TextField('email_address')
52
+        display_name           = tw2f.TextField('display_name')
53
+        verify_password        = tw2f.PasswordField('verify_password')
54
+        groups = GroupField('groups')
55
+
56
+    class edit_form_type(EditableForm):
57
+        __model__ = pma.User
58
+
59
+        __require_fields__     = ['display_name', 'email_address', 'groups']
60
+        __omit_fields__        = ['_password', 'created', 'user_id', '_lAllNodes', 'password']
61
+        __field_order__        = ['display_name', 'email_address', 'groups']
62
+
63
+        email_address          = tw2f.TextField('email_address')
64
+        display_name           = tw2f.TextField('display_name')
65
+        groups = GroupField('groups')
66
+
67
+    class edit_filler_type(EditFormFiller):
68
+        __model__ = pma.User
69
+
70
+    class table_type(TableBase):
71
+        __model__ = pma.User
72
+        __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
73
+        __field_order__ = ['user_id', 'display_name', 'email_address', 'groups']
74
+        __headers__ = dict(user_id='id', email_address='Email', display_name='Name', groups='Groups')
75
+        __xml_fields__ = ['groups']
76
+
77
+    class table_filler_type(TableFiller):
78
+        __model__ = pma.User
79
+        __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
80
+
81
+        def groups(self, obj):
82
+            groups = ''.join(['<li>{0}</li>'.format(group.getDisplayName()) for group in obj.groups if group.group_id>0])
83
+            return groups.join(('<ul>', '</ul>'))
84
+
85
+    @tg.expose()
86
+    #@tg.validate(new_user_validator, error_handler=CrudRestController.new)
87
+    def post(self, *args, **kw):
88
+
89
+        real_name = kw['display_name']
90
+        email = kw['email_address']
91
+        groups = kw['groups'] if 'groups' in kw else []
92
+        password = kw['password']
93
+
94
+        new_user = pld.PODStaticController.createNewUser(real_name, email, password, groups)
95
+        if tg.request.response_type == 'application/json':
96
+            if new_user is not None and self.conditional_update_field is not None:
97
+                tg.response.last_modified = getattr(new_user, self.conditional_update_field)
98
+
99
+            return dict(model=self.model.__name__,
100
+                        value=self._dictify(new_user))
101
+
102
+        return tg.redirect('./', params=self._kept_params())
103
+
104
+
105
+    """
106
+    @tg.expose()
107
+    def post_delete(self, *args, **kw):
108
+        user_id = int(args[0])
109
+
110
+        pld.PODStaticController.deleteUser(user_id)
111
+        return tg.redirect('./', params=self._kept_params())
112
+    """
113
+
114
+    def post_delete(self, *args, **kw):
115
+        pass
116
+
117
+    @tg.expose()
118
+    def put(self, *args, **kw):
119
+        """update"""
120
+
121
+        user_id = kw['user_id']
122
+        real_name = kw['display_name']
123
+        email = kw['email_address']
124
+        groups = kw['groups'] if 'groups' in kw else []
125
+
126
+        updated_user = pld.PODStaticController.updateUser(user_id, real_name, email, groups)
127
+
128
+        return tg.redirect('../', params=self._kept_params())

+ 378 - 0
pod/pod/controllers/api.py View File

@@ -0,0 +1,378 @@
1
+# -*- coding: utf-8 -*-
2
+"""Sample controller with all its actions protected."""
3
+from datetime import datetime
4
+
5
+# TODO - D.A. - 2013-11-19
6
+# Check if the new import (ie import io instead of cStringIO)
7
+# is working correctly
8
+#import io as csio
9
+
10
+# INFO - D.A. - 2013-11-19
11
+# The PIL import is now taken from the pillow
12
+# which is the python3 port of PIL
13
+#
14
+from PIL import Image as pil
15
+
16
+import tg
17
+from tg import expose, flash, require, url, lurl, request, response, redirect, tmpl_context
18
+from tg.i18n import ugettext as _, lazy_ugettext as l_
19
+from tg import predicates as tgp
20
+
21
+from tg.i18n import ugettext as _, lazy_ugettext as l_
22
+
23
+from pod.lib.base import BaseController
24
+from pod.lib   import dbapi as pld
25
+from pod.model import data as pmd
26
+from pod.model import auth as pma
27
+from pod.model import serializers as pms
28
+from pod import model as pm
29
+from pod.lib.auth import can_read, can_write
30
+
31
+from pod.controllers import apimenu as pcam
32
+
33
+
34
+FIXME_ERROR_CODE=-1
35
+
36
+
37
+class PODApiController(BaseController):
38
+    """Sample controller-wide authorization"""
39
+    
40
+    allow_only = tgp.in_group('user', msg=l_('You need to login in order to access this ressource'))
41
+
42
+    menu = pcam.PODApiMenuController()
43
+
44
+    def on_off_to_boolean(self, on_or_off):
45
+        return True if on_or_off=='on' else False
46
+
47
+    @expose()
48
+    def create_event(self, parent_id=None, data_label='', data_datetime=None, data_content='', data_reminder_datetime=None, add_reminder=False, inherit_rights='off', **kw):
49
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
50
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
51
+
52
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
53
+      loNewNode.node_type     = pmd.PBNodeType.Event
54
+      loNewNode.data_label    = data_label
55
+      loNewNode.data_content  = data_content
56
+      loNewNode.data_datetime = datetime.strptime(data_datetime, '%d/%m/%Y %H:%M')
57
+      if add_reminder:
58
+        loNewNode.data_reminder_datetime = data_reminder_datetime
59
+
60
+      pm.DBSession.flush()
61
+      redirect(lurl('/document/%i'%(loNewNode.parent_id)))
62
+
63
+    @expose()
64
+    def create_contact(self, parent_id=None, data_label='', data_content='', inherit_rights='off', **kw):
65
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
66
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
67
+      
68
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
69
+      loNewNode.node_type     = pmd.PBNodeType.Contact
70
+      loNewNode.data_label    = data_label
71
+      loNewNode.data_content  = data_content
72
+
73
+      pm.DBSession.flush()
74
+      redirect(lurl('/document/%i'%(loNewNode.parent_id)))
75
+
76
+    @expose()
77
+    def create_comment(self, parent_id=None, data_label='', data_content='', is_shared='', **kw):
78
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
79
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
80
+
81
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(is_shared))
82
+      loNewNode.node_type     = pmd.PBNodeType.Comment
83
+      loNewNode.data_label    = data_label
84
+      loNewNode.data_content  = data_content
85
+      if is_shared=='on':
86
+        loNewNode.is_shared = True
87
+
88
+      pm.DBSession.flush()
89
+      redirect(lurl('/document/%i'%(loNewNode.parent_id)))
90
+
91
+    @expose()
92
+    def create_file(self, parent_id=None, data_label='', data_content='', data_file=None, inherit_rights='off', **kw):
93
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
94
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
95
+      
96
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
97
+      loNewNode.node_type     = pmd.PBNodeType.File
98
+      loNewNode.data_label    = data_label
99
+      loNewNode.data_content  = data_content
100
+
101
+      loNewNode.data_file_name      = data_file.filename
102
+      loNewNode.data_file_mime_type = data_file.type
103
+      loNewNode.data_file_content   = data_file.file.read()
104
+
105
+      pm.DBSession.flush()
106
+      redirect(lurl('/document/%i'%(loNewNode.parent_id)))
107
+
108
+    @expose()
109
+    @require(can_read())
110
+    def get_file_content(self, node_id=None, **kw):
111
+      if node_id==None:
112
+        return
113
+      else:
114
+        loCurrentUser   = pld.PODStaticController.getCurrentUser()
115
+        loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
116
+        loFile = loApiController.getNode(node_id)
117
+
118
+        lsContentType = "application/x-download"
119
+        if loFile.data_file_mime_type!='':
120
+          tg.response.headers['Content-type'] = str(loFile.data_file_mime_type)
121
+
122
+        tg.response.headers['Content-Type']        = lsContentType
123
+        tg.response.headers['Content-Disposition'] = str('attachment; filename="%s"'%(loFile.data_file_name))
124
+        return loFile.data_file_content
125
+
126
+    @expose()
127
+    def get_file_content_thumbnail(self, node_id=None, **kw):
128
+      if node_id==None:
129
+        return
130
+      else:
131
+        loCurrentUser   = pld.PODStaticController.getCurrentUser()
132
+        loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
133
+        
134
+        loFile = loApiController.getNode(node_id)
135
+        
136
+        loJpegBytes = csio.StringIO(loFile.data_file_content)
137
+        loImage     = pil.open(loJpegBytes)
138
+        loImage.thumbnail([140,140], pil.ANTIALIAS)
139
+        
140
+        loResultBuffer = csio.StringIO()
141
+        loImage.save(loResultBuffer,"JPEG")
142
+        tg.response.headers['Content-type'] = str(loFile.data_file_mime_type)
143
+        return loResultBuffer.getvalue()
144
+
145
+    @expose()
146
+    @require(can_write())
147
+    def set_parent_node(self, node_id, new_parent_id, **kw):
148
+      """ @see reindex_nodes() """
149
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
150
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
151
+      
152
+      # TODO - D.A. - 2013-11-07 - Check that new parent is accessible by the user !!!
153
+      loNewNode = loApiController.getNode(node_id)
154
+      if new_parent_id!='':
155
+        if new_parent_id==0:
156
+          new_parent_id = None
157
+        loNewNode.parent_id = int(new_parent_id)
158
+        self._updateParentTreePathForNodeAndChildren(loNewNode)
159
+      pm.DBSession.flush()
160
+      redirect(lurl('/document/%s'%(node_id)))
161
+
162
+    def _updateParentTreePathForNodeAndChildren(self, moved_node: pmd.PBNode):
163
+      """ propagate the move to all child nodes and update there node_depth and parent_tree_path properties """
164
+      parent_node = moved_node._oParent
165
+      if parent_node==None:
166
+        new_parent_tree_path = '/'
167
+        moved_node.node_depth = 0
168
+      else:
169
+        new_parent_tree_path = '{0}{1}/'.format(parent_node.parent_tree_path, parent_node.node_id)
170
+        moved_node.node_depth = parent_node.node_depth+1
171
+      moved_node.parent_tree_path = new_parent_tree_path
172
+
173
+      for child_node in moved_node._lAllChildren:
174
+        self._updateParentTreePathForNodeAndChildren(child_node)
175
+
176
+
177
+    @expose()
178
+    @require(can_write())
179
+    def move_node_upper(self, node_id=0):
180
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
181
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
182
+      
183
+      loNode = loApiController.getNode(node_id)
184
+      if loApiController.moveNodeUpper(loNode)==FIXME_ERROR_CODE:
185
+        flash(_('Document #%s can\'t move upper.')%(node_id))
186
+      redirect(lurl('/document/%s'%(node_id)))
187
+
188
+    @expose()
189
+    @require(can_write())
190
+    def move_node_lower(self, node_id=0):
191
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
192
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
193
+      
194
+      loNode = loApiController.getNode(node_id)
195
+      if loApiController.moveNodeLower(loNode)==FIXME_ERROR_CODE:
196
+        flash(_('Document #%s can\'t move lower.')%(node_id))
197
+      redirect(lurl('/document/%s'%(node_id)))
198
+
199
+    @expose()
200
+    def create_document(self, parent_id=None, data_label='', data_content='', inherit_rights='off', node_status=''):
201
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
202
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
203
+
204
+      lsNodeName = 'Document with no name...'
205
+      if int(parent_id)!=0:
206
+        loParent = loApiController.getNode(parent_id)
207
+        lsNodeName = 'Subdocument of (%s)' % loParent.data_label
208
+
209
+      loNewNode = loApiController.createDummyNode(parent_id, self.on_off_to_boolean(inherit_rights))
210
+      loNewNode.data_label   = lsNodeName
211
+      loNewNode.data_content = 'insert content...'
212
+
213
+      if data_label!='':
214
+        loNewNode.data_label = data_label
215
+      if data_content!='':
216
+        loNewNode.data_content = data_content
217
+
218
+      if int(parent_id)!=0:
219
+        loNewNode.parent_id = parent_id
220
+
221
+      if node_status!='':
222
+          status_item = pmd.PBNodeStatus.getStatusItem(node_status)
223
+          if status_item in pmd.PBNodeStatus.getChoosableList():
224
+              loNewNode.node_status = status_item.status_id
225
+
226
+      pm.DBSession.flush()
227
+      redirect(lurl('/document/%i'%(loNewNode.node_id)))
228
+
229
+    @expose()
230
+    @require(can_write())
231
+    def edit_status(self, node_id, node_status):
232
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
233
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
234
+      
235
+      loNode = loApiController.getNode(node_id)
236
+      loNode.node_status = node_status
237
+      redirect(lurl('/document/%s'%(node_id)))
238
+
239
+    @expose()
240
+    @require(can_write())
241
+    def edit_label_and_content(self, node_id, data_label, data_content):
242
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
243
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
244
+      
245
+      loNode = loApiController.getNode(node_id)
246
+      loNode.data_label   = data_label
247
+      loNode.data_content = data_content
248
+      redirect(lurl('/document/%s'%(node_id)))
249
+
250
+    @expose()
251
+    @require(can_write())
252
+    def force_delete_node(self, node_id=None):
253
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
254
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
255
+      loNode = loApiController.getNode(node_id)
256
+      liParentId = loNode.parent_id
257
+      if loNode.getChildNb()<=0:
258
+        pm.DBSession.delete(loNode)
259
+        flash(_('Document #%s has been deleted')%(node_id))
260
+      else:
261
+        flash(_('Document #%s can\'t be deleted because it is not empty.')%(node_id), 'error')
262
+        redirect(lurl('/document/%s'%(node_id)))
263
+
264
+      redirect(lurl('/document/%i'%(liParentId or 0)))
265
+
266
+    def reindex_nodes(self, back_to_node_id=0):
267
+      # DA - INFO - 2014-05-26
268
+      #
269
+      #  The following query allows to detect which not are not up-to-date anymore.
270
+      # These up-to-date failure is related to the node_depth and parent_tree_path being out-dated.
271
+      # This mainly occured when "move node" feature was not working correctly.
272
+      #
273
+      # The way to fix the data is the following:
274
+      # - run mannually the following command
275
+      # - for each result, call manually /api/set_parent_node?node_id=parent_node_id&new_parent_id=parent_parent_id
276
+      #
277
+      sql_query = """
278
+        select
279
+            pn.node_id as child_node_id,
280
+            pn.parent_id as child_parent_id,
281
+            pn.parent_tree_path as child_parent_tree_path,
282
+            pn.node_depth as child_node_depth,
283
+            pnn.node_id as parent_node_id,
284
+            pnn.parent_id as parent_parent_id,
285
+            pnn.parent_tree_path as parent_parent_tree_path,
286
+            pnn.node_depth as parent_node_depth
287
+
288
+        from
289
+            pod_nodes as pn,
290
+            pod_nodes as pnn
291
+        where
292
+            pn.parent_id = pnn.node_id
293
+            and pn.parent_tree_path not like pnn.parent_tree_path||'%'
294
+      """
295
+      return 
296
+
297
+
298
+    @expose()
299
+    @require(can_write())
300
+    def toggle_share_status(self, node_id):
301
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
302
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
303
+      loNode = loApiController.getNode(node_id)
304
+      if loNode.owner_id==loCurrentUser.user_id:
305
+        loNode.is_shared = not loNode.is_shared
306
+      # FIXME - DA. - 2014-05-06
307
+      # - if root node, then exception
308
+      # - this redirect is done in order to be adapted to comment share status toggle
309
+      redirect(lurl('/document/%s#tab-comments'%(loNode._oParent.node_id)))
310
+
311
+    @expose()
312
+    @require(can_write())
313
+    def set_access_management(self, node_id, is_shared='off', read=[0], write=[0]):
314
+
315
+      llReadAccessGroupIds = [int(liGroupId) for liGroupId in read]
316
+      llWriteAccessGroupIds = [int(liGroupId) for liGroupId in write]
317
+
318
+      # HACK - D.A. - 2015-058-20
319
+      # the 0 values are added in order to get a read and write parameters as list even if only one value is inside
320
+      # (the default behavior of TG2 is to convert it to a string value if only one value is sent
321
+      #
322
+      llReadAccessGroupIds.remove(0) # remove useless value
323
+      llWriteAccessGroupIds.remove(0) # remove useless value
324
+
325
+      loCurrentUser   = pld.PODStaticController.getCurrentUser()
326
+      loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
327
+
328
+      loNode = loApiController.getNode(node_id)
329
+
330
+      is_shared_b = False if is_shared=='off' else True
331
+
332
+
333
+      # Only the node owner can modify is_shared
334
+      if is_shared_b != loNode.is_shared and loNode.owner_id != loCurrentUser.user_id:
335
+        self.back_with_error(_("You can't share a document that doesn't belong to you."))
336
+      else:
337
+        loNode.is_shared = is_shared_b
338
+        if not is_shared_b:
339
+          # SHARE IS OFF, so deactivate the document share (and do not change "shared-with" group configuration
340
+          pm.DBSession.flush()
341
+          redirect(lurl('/document/%s#tab-accessmanagement'%(loNode.node_id)))
342
+
343
+      # remove all current shares and set the new ones
344
+
345
+      for loRight in loNode._lRights:
346
+        pm.DBSession.delete(loRight)
347
+      pm.DBSession.flush()
348
+
349
+      ldNewRights = dict()
350
+      for liGroupId in llReadAccessGroupIds:
351
+        ldNewRights[liGroupId] = pma.Rights.READ_ACCESS
352
+
353
+      for liGroupId in llWriteAccessGroupIds:
354
+        liOldValue = 0
355
+        if liGroupId in ldNewRights:
356
+          liOldValue = ldNewRights[liGroupId]
357
+        ldNewRights[liGroupId] = liOldValue + pma.Rights.WRITE_ACCESS
358
+
359
+      user_list = loApiController._getUserIdListForFiltering()
360
+      comments = pm.DBSession.query(pmd.PBNode).filter(pmd.PBNode.parent_id==node_id).\
361
+              filter((pmd.PBNode.owner_id.in_(user_list)) | (pma.user_group_table.c.user_id.in_(user_list))).\
362
+              filter(pmd.PBNode.node_type=='comment').all()
363
+      for comment in comments:
364
+          pm.DBSession.add(comment)
365
+
366
+      for liGroupId, liRightLevel in ldNewRights.items():
367
+        loNewRight = loApiController.createRight()
368
+        loNewRight.group_id = liGroupId
369
+        loNewRight.node_id = node_id
370
+        loNewRight.rights = liRightLevel
371
+        loNode._lRights.append(loNewRight)
372
+        for comment in comments:
373
+            comment_right = loApiController.createRight()
374
+            comment_right.group_id = liGroupId
375
+            comment_right.node_id = comment.node_id
376
+            comment_right.rights = liRightLevel
377
+
378
+      redirect(lurl('/document/%s#tab-accessmanagement'%(loNode.node_id)))

+ 52 - 0
pod/pod/controllers/apimenu.py View File

@@ -0,0 +1,52 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import tg
4
+
5
+from pod.lib import base as plb
6
+from pod.lib import dbapi as pld
7
+from pod.model import data as pmd
8
+from pod.model import serializers as pms
9
+
10
+class PODApiMenuController(plb.BaseController):
11
+
12
+    @tg.expose('json')
13
+    @pms.PBNodeForMenu
14
+    def children(self, id='#'):
15
+        try:
16
+            real_id = int(id)
17
+        except Exception:
18
+            real_id = None
19
+
20
+        current_user = pld.PODStaticController.getCurrentUser()
21
+        api_controller = pld.PODUserFilteredApiController(current_user.user_id)
22
+
23
+        allowed_nodes = api_controller.getListOfAllowedNodes()
24
+        parent_node = api_controller.getNode(real_id)
25
+        child_nodes = api_controller.getChildNodesForMenu(parent_node, allowed_nodes)
26
+
27
+        return child_nodes
28
+
29
+    @tg.expose('json')
30
+    @pms.NodeTreeItemForMenu
31
+    def initialize(self, current_node_id=0, id='#'):
32
+        try:
33
+            real_id = int(id)
34
+        except Exception:
35
+            real_id = None
36
+
37
+        current_user = pld.PODStaticController.getCurrentUser()
38
+        api_controller = pld.PODUserFilteredApiController(current_user.user_id)
39
+
40
+        current_node = None
41
+        try:
42
+            current_node = api_controller.getNode(current_node_id)
43
+        except:
44
+            print("Node not found: {0}".format(current_node_id))
45
+
46
+        allowed_nodes = api_controller.getListOfAllowedNodes()
47
+        initial_menu_structure = api_controller.buildTreeListForMenu(current_node, allowed_nodes)
48
+
49
+        return initial_menu_structure
50
+
51
+
52
+

+ 43 - 0
pod/pod/controllers/apipublic.py View File

@@ -0,0 +1,43 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import tg
4
+import repoze.who.api
5
+
6
+from tg import _compat
7
+from pod.lib import base as plb
8
+from pod.lib import dbapi as pld
9
+from pod import model as pm
10
+from pod.model import data as pmd
11
+from pod.model import serializers as pms
12
+
13
+from tg.i18n import ugettext as _
14
+
15
+class PODPublicApiController(plb.BaseController):
16
+
17
+    @tg.expose()
18
+    def create_account(self, email='', password='', retyped_password='', real_name='', **kw):
19
+      if email=='' or password=='' or retyped_password=='':
20
+        tg.flash(_('Account creation error: please fill all the fields'), 'error')
21
+        tg.redirect(tg.lurl('/'))
22
+      elif password!=retyped_password:
23
+        tg.flash(_('Account creation error: passwords do not match'), 'error')
24
+        tg.redirect(tg.lurl('/'))
25
+      else:
26
+        loExistingUser = pld.PODStaticController.getUserByEmailAddress(email)
27
+        if loExistingUser!=None:
28
+          tg.flash(_('Account creation error: account already exist: %s') % (email), 'error')
29
+          tg.redirect(tg.lurl('/'))
30
+
31
+        loNewAccount = pld.PODStaticController.createNewUser(real_name if real_name!='' else email, email, password, [])
32
+
33
+        tg.flash(_('Account successfully created: %s') % (email), 'info')
34
+
35
+        who_api = repoze.who.api.get_api(tg.request.environ)
36
+        creds = {}
37
+        creds['login'] = email
38
+        creds['password'] = password
39
+        authenticated, headers = who_api.login(creds)
40
+        tg.response.headers = headers
41
+
42
+        tg.redirect(tg.lurl('/'))
43
+

+ 22 - 0
pod/pod/controllers/controller.template View File

@@ -0,0 +1,22 @@
1
+# -*- coding: utf-8 -*-
2
+"""Sample controller module"""
3
+
4
+# turbogears imports
5
+from tg import expose
6
+
7
+#from tg import redirect, validate, flash
8
+#from tg.i18n import ugettext as _
9
+#from tg import predicates
10
+
11
+# project specific imports
12
+from pod.lib.base import BaseController
13
+#from pod.model import DBSession, metadata
14
+
15
+
16
+class SampleController(BaseController):
17
+    #Uncomment this line if your controller requires an authenticated user
18
+    #allow_only = predicates.not_anonymous()
19
+    
20
+    @expose('pod.templates.index')
21
+    def index(self):
22
+        return dict(page='index')

+ 45 - 0
pod/pod/controllers/debug.py View File

@@ -0,0 +1,45 @@
1
+# -*- coding: utf-8 -*-
2
+"""Main Controller"""
3
+
4
+from tg import expose, flash, require, url, lurl, request, redirect, tmpl_context
5
+from tg.i18n import ugettext as _, lazy_ugettext as l_
6
+from tg import predicates
7
+from pod import model
8
+from pod.controllers.secure import SecureController
9
+from pod.model import DBSession, metadata
10
+
11
+from pod.lib.base import BaseController
12
+from pod.controllers.error import ErrorController
13
+
14
+import pod.model as pbm
15
+import pod.controllers as pbc
16
+from pod.lib import dbapi as pld
17
+from pod.controllers import api as pbca
18
+
19
+import pod.model.data as pbmd
20
+
21
+__all__ = ['DebugController']
22
+
23
+
24
+class DebugController(BaseController):
25
+
26
+  # allow_only = predicates.in_group('admin',
27
+  #                            msg=l_('You\'re not allowed to access this page'))
28
+
29
+  @expose('pod.templates.debug.iconset')
30
+  def iconset(self, **kw):
31
+    """This method showcases how you can use the same controller for a data page and a display page"""
32
+    return dict()
33
+
34
+
35
+  @expose('pod.templates.debug.environ')
36
+  def environ(self, **kw):
37
+    """This method showcases TG's access to the wsgi environment."""
38
+    return dict(environment=request.environ)
39
+
40
+
41
+  @expose('pod.templates.debug.identity')
42
+  def identity(self, **kw):
43
+    """This method showcases TG's access to the wsgi environment."""
44
+    return dict(identity=request.identity)
45
+

+ 30 - 0
pod/pod/controllers/error.py View File

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+"""Error controller"""
3
+
4
+from tg import request, expose
5
+
6
+__all__ = ['ErrorController']
7
+
8
+
9
+class ErrorController(object):
10
+    """
11
+    Generates error documents as and when they are required.
12
+
13
+    The ErrorDocuments middleware forwards to ErrorController when error
14
+    related status codes are returned from the application.
15
+
16
+    This behaviour can be altered by changing the parameters to the
17
+    ErrorDocuments middleware in your config/middleware.py file.
18
+    
19
+    """
20
+
21
+    @expose('pod.templates.error')
22
+    def document(self, *args, **kwargs):
23
+        """Render the error document"""
24
+        resp = request.environ.get('pylons.original_response')
25
+        default_message = ("<p>We're sorry but we weren't able to process "
26
+                           " this request.</p>")
27
+        values = dict(prefix=request.environ.get('SCRIPT_NAME', ''),
28
+                      code=request.params.get('code', resp.status_int),
29
+                      message=request.params.get('message', default_message))
30
+        return values

+ 178 - 0
pod/pod/controllers/root.py View File

@@ -0,0 +1,178 @@
1
+# -*- coding: utf-8 -*-
2
+"""Main Controller"""
3
+import pod
4
+
5
+import tg
6
+from tg import expose, flash, require, url, lurl, request, redirect, tmpl_context
7
+from tg.i18n import ugettext as _, lazy_ugettext as l_
8
+from tg import predicates
9
+from pod.lib.auth import can_read
10
+
11
+from pod.lib.base import BaseController
12
+from pod.controllers.error import ErrorController
13
+
14
+from pod.lib import dbapi as pld
15
+from pod.controllers import api as pca
16
+from pod.controllers import apipublic as pcap
17
+from pod.controllers import debug as pbcd
18
+from pod.controllers import adminuser as pbcu
19
+from pod.controllers import admingroup as pbcg
20
+
21
+from pod import model as pm
22
+
23
+import pod.model.data as pbmd
24
+
25
+__all__ = ['RootController']
26
+
27
+
28
+class AdminController(BaseController):
29
+    users = pbcu.AdminUserController(pm.DBSession)
30
+    groups = pbcg.AdminGroupController(pm.DBSession)
31
+
32
+
33
+class RootController(BaseController):
34
+    """
35
+    The root controller for the pod application.
36
+
37
+    All the other controllers and WSGI applications should be mounted on this
38
+    controller. For example::
39
+
40
+        panel = ControlPanelController()
41
+        another_app = AnotherWSGIApplication()
42
+
43
+    Keep in mind that WSGI applications shouldn't be mounted directly: They
44
+    must be wrapped around with :class:`tg.controllers.WSGIAppController`.
45
+
46
+    """
47
+
48
+    admin = AdminController()
49
+
50
+    api   = pca.PODApiController()
51
+    debug = pbcd.DebugController()
52
+    error = ErrorController()
53
+
54
+    public_api = pcap.PODPublicApiController()
55
+
56
+    def _before(self, *args, **kw):
57
+        tmpl_context.project_name = "pod"
58
+
59
+    @expose('pod.templates.index')
60
+    def index(self):
61
+        """Handle the front-page."""
62
+        return dict()
63
+
64
+
65
+    @expose('pod.templates.about')
66
+    def about(self):
67
+        """Handle the about-page."""
68
+        return dict()
69
+
70
+
71
+    @expose('pod.templates.login')
72
+    def login(self, came_from=lurl('/')):
73
+        """Start the user login."""
74
+        login_counter = request.environ.get('repoze.who.logins', 0)
75
+        if login_counter > 0:
76
+            flash(_('Wrong credentials'), 'warning')
77
+        return dict(page='login', login_counter=str(login_counter),
78
+                    came_from=came_from)
79
+
80
+    @expose()
81
+    def post_login(self, came_from=lurl('/')):
82
+        """
83
+        Redirect the user to the initially requested page on successful
84
+        authentication or redirect her back to the login page if login failed.
85
+
86
+        """
87
+        if not request.identity:
88
+            login_counter = request.environ.get('repoze.who.logins', 0) + 1
89
+            redirect('/login',
90
+                params=dict(came_from=came_from, __logins=login_counter))
91
+        userid = request.identity['repoze.who.userid']
92
+        flash(_('Welcome back, %s!') % userid)
93
+        redirect(came_from)
94
+
95
+    @expose()
96
+    def post_logout(self, came_from=lurl('/')):
97
+        """
98
+        Redirect the user to the initially requested page on logout and say
99
+        goodbye as well.
100
+
101
+        """
102
+        flash(_('We hope to see you soon!'))
103
+        redirect(came_from)
104
+        
105
+    @expose('pod.templates.dashboard')
106
+    @require(predicates.in_group('user', msg=l_('Please login to access this page')))
107
+    def dashboard(self):
108
+        loCurrentUser   = pld.PODStaticController.getCurrentUser()
109
+        loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
110
+
111
+        loLastModifiedNodes = loApiController.getLastModifiedNodes(10)
112
+        loWhatsHotNodes     = loApiController.getNodesByStatus('hot', 5)
113
+        loActionToDoNodes   = loApiController.getNodesByStatus('actiontodo', 5)
114
+        return dict(last_modified_nodes=loLastModifiedNodes, whats_hot_nodes=loWhatsHotNodes, action_to_do_nodes = loActionToDoNodes)
115
+
116
+
117
+    @expose('pod.templates.document')
118
+    #@require(predicates.in_group('user', msg=l_('Please login to access this page')))
119
+    @require(can_read())
120
+    def document(self, node_id=0, version=0, came_from=lurl('/'), highlight=''):
121
+        """show the user dashboard"""
122
+        loCurrentUser   = pld.PODStaticController.getCurrentUser()
123
+        loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
124
+
125
+        llAccessibleNodes = loApiController.getListOfAllowedNodes()
126
+
127
+        liNodeId         = int(node_id)
128
+        liVersionId      = int(version)
129
+
130
+        loCurrentNode    = None
131
+        loNodeStatusList = None
132
+
133
+        try:
134
+          loNodeStatusList = pbmd.PBNodeStatus.getChoosableList()
135
+          if liVersionId:
136
+              row = dict(pm.DBSession.execute("select * from pod_nodes_history where node_id=:node_id and version_id=:version_id", {"node_id":liNodeId, "version_id":liVersionId}).first().items())
137
+              del(row['version_id'])
138
+              loCurrentNode = pbmd.PBNode(**row)
139
+          else:
140
+            loCurrentNode    = loApiController.getNode(liNodeId)
141
+        except Exception as e:
142
+          flash(_('Document not found'), 'error')
143
+
144
+        user_specific_group_rights = pld.PODStaticController.getUserDedicatedGroupRightsOnNode(loCurrentNode)
145
+
146
+        if node_id != 0:
147
+            current_user_rights = pld.PODStaticController.DIRTY_get_rights_on_node(loCurrentUser.user_id, loCurrentNode.node_id)
148
+            if loCurrentNode.owner_id == loCurrentUser.user_id:
149
+                current_user_rights.rights = 3
150
+        else:
151
+            current_user_rights = None
152
+
153
+        return dict(
154
+            current_user=loCurrentUser,
155
+            current_node=loCurrentNode,
156
+            allowed_nodes=llAccessibleNodes,
157
+            node_status_list = loNodeStatusList,
158
+            keywords = highlight,
159
+            user_specific_group_rights = user_specific_group_rights,
160
+            real_group_rights = pld.PODStaticController.getRealGroupRightsOnNode(node_id),
161
+            current_user_rights = current_user_rights
162
+        )
163
+
164
+    @expose('pod.templates.search')
165
+    @require(predicates.in_group('user', msg=l_('Please login to access this page')))
166
+    def search(self, keywords=''):
167
+        loCurrentUser   = pld.PODStaticController.getCurrentUser()
168
+        loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
169
+
170
+        loFoundNodes = loApiController.searchNodesByText(keywords.split())
171
+
172
+        return dict(search_string=keywords, found_nodes=loFoundNodes)
173
+
174
+    @expose('pod.templates.create_account')
175
+    def create_account(self):
176
+        return dict()
177
+
178
+

+ 27 - 0
pod/pod/controllers/secure.py View File

@@ -0,0 +1,27 @@
1
+# -*- coding: utf-8 -*-
2
+"""Sample controller with all its actions protected."""
3
+from tg import expose, flash
4
+from tg.i18n import ugettext as _, lazy_ugettext as l_
5
+from tg.predicates import has_permission
6
+
7
+from pod.lib.base import BaseController
8
+
9
+__all__ = ['SecureController']
10
+
11
+class SecureController(BaseController):
12
+    """Sample controller-wide authorization"""
13
+    
14
+    # The predicate that must be met for all the actions in this controller:
15
+    allow_only = has_permission('manage',
16
+                                msg=l_('Only for people with the "manage" permission'))
17
+    
18
+    @expose('pod.templates.index')
19
+    def index(self):
20
+        """Let the user know that's visiting a protected controller."""
21
+        flash(_("Secure Controller here"))
22
+        return dict(page='index')
23
+    
24
+    @expose('pod.templates.index')
25
+    def some_where(self):
26
+        """Let the user know that this action is protected too."""
27
+        return dict(page='some_where')

+ 36 - 0
pod/pod/controllers/template.py View File

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+"""Fallback controller."""
3
+
4
+from pod.lib.base import BaseController
5
+from tg import abort
6
+
7
+__all__ = ['TemplateController']
8
+
9
+
10
+class TemplateController(BaseController):
11
+    """
12
+    The fallback controller for pod.
13
+    
14
+    By default, the final controller tried to fulfill the request
15
+    when no other routes match. It may be used to display a template
16
+    when all else fails, e.g.::
17
+    
18
+        def view(self, url):
19
+            return render('/%s' % url)
20
+    
21
+    Or if you're using Mako and want to explicitly send a 404 (Not
22
+    Found) response code when the requested template doesn't exist::
23
+    
24
+        import mako.exceptions
25
+        
26
+        def view(self, url):
27
+            try:
28
+                return render('/%s' % url)
29
+            except mako.exceptions.TopLevelLookupException:
30
+                abort(404)
31
+    
32
+    """
33
+    
34
+    def view(self, url):
35
+        """Abort the request with a 404 HTTP status code."""
36
+        abort(404)

BIN
pod/pod/i18n/fr_FR/LC_MESSAGES/pboard.mo View File


+ 751 - 0
pod/pod/i18n/fr_FR/LC_MESSAGES/pboard.po View File

@@ -0,0 +1,751 @@
1
+# French (France) translations for pod.
2
+# Copyright (C) 2014 ORGANIZATION
3
+# This file is distributed under the same license as the pod project.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5
+#
6
+msgid ""
7
+msgstr ""
8
+"Project-Id-Version: pod 0.1\n"
9
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
+"POT-Creation-Date: 2014-06-16 00:55+0200\n"
11
+"PO-Revision-Date: 2014-06-16 00:55+0100\n"
12
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+"Language-Team: fr_FR <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=utf-8\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
18
+"Generated-By: Babel 1.3\n"
19
+"X-Generator: Poedit 1.5.4\n"
20
+
21
+#: pod/controllers/api.py:40
22
+msgid "You need to login in order to access this ressource"
23
+msgstr "Vous devez vous identifier pour accéder à cette page"
24
+
25
+#: pod/controllers/api.py:185
26
+#, python-format
27
+msgid "Document #%s can't move upper."
28
+msgstr "Le document #%s ne peut pas être remonté"
29
+
30
+#: pod/controllers/api.py:196
31
+#, python-format
32
+msgid "Document #%s can't move lower."
33
+msgstr "Le document #%s ne peut pas être descendu"
34
+
35
+#: pod/controllers/api.py:259
36
+#, python-format
37
+msgid "Document #%s has been deleted"
38
+msgstr "Le document #%s a été supprimé"
39
+
40
+#: pod/controllers/api.py:261
41
+#, python-format
42
+msgid "Document #%s can't be deleted because it is not empty."
43
+msgstr ""
44
+"Le document #%s ne peut pas être supprimé car il possède des sous documents"
45
+
46
+#: pod/controllers/api.py:335
47
+msgid "You can't share a document that doesn't belong to you."
48
+msgstr "Vous ne pouvez pas partager un document qui ne vous appartient pas"
49
+
50
+#: pod/controllers/apipublic.py:20
51
+msgid "Account creation error: please fill all the fields"
52
+msgstr "Erreur à la création du compte : merci de remplir tous les champs"
53
+
54
+#: pod/controllers/apipublic.py:23
55
+msgid "Account creation error: passwords do not match"
56
+msgstr "Erreur à la création du compte : les mots de passe ne concordent pas"
57
+
58
+#: pod/controllers/apipublic.py:28
59
+#, python-format
60
+msgid "Account creation error: account already exist: %s"
61
+msgstr "Erreur à la création du compte : le compte %s existe déjà"
62
+
63
+#: pod/controllers/apipublic.py:33
64
+#, python-format
65
+msgid "Account successfully created: %s"
66
+msgstr "Compte créé avec succès : %s"
67
+
68
+#: pod/controllers/root.py:76
69
+msgid "Wrong credentials"
70
+msgstr "Mauvais identifiant et/ou mot de passe"
71
+
72
+#: pod/controllers/root.py:92
73
+#, python-format
74
+msgid "Welcome back, %s!"
75
+msgstr "Bienvenue %s!"
76
+
77
+#: pod/controllers/root.py:102
78
+msgid "We hope to see you soon!"
79
+msgstr "Nous espérons vous revoir bientôt!"
80
+
81
+#: pod/controllers/root.py:106 pod/controllers/root.py:165
82
+msgid "Please login to access this page"
83
+msgstr "Merci de vous identifier pour accéder à cette page"
84
+
85
+#: pod/controllers/root.py:142
86
+msgid "Document not found"
87
+msgstr "Le document n'a pas été trouvé"
88
+
89
+#: pod/controllers/secure.py:16
90
+msgid "Only for people with the \"manage\" permission"
91
+msgstr "Seulement pour les personnes ayant la permission \"manage\""
92
+
93
+#: pod/controllers/secure.py:21
94
+msgid "Secure Controller here"
95
+msgstr "Contrôleur sécurisé"
96
+
97
+#: pod/lib/helpers.py:25
98
+msgid "This is the current status."
99
+msgstr "C'est le statut actuel"
100
+
101
+#: pod/lib/helpers.py:28
102
+msgid "The item is a normal document, like a howto or a text document."
103
+msgstr "L'élément est un document normal, comme un howto ou un document texte"
104
+
105
+#: pod/lib/helpers.py:30
106
+msgid ""
107
+"The item will be automatically computed as \"in progress\" or \"done\" "
108
+"according to its children status."
109
+msgstr ""
110
+"L'élément sera automatiquement mis en \"En cours\" ou \"Fait\" suivant le "
111
+"statut de ses enfants."
112
+
113
+#: pod/lib/helpers.py:32
114
+msgid "No action done on the item."
115
+msgstr "Aucun changement sur l'élément"
116
+
117
+#: pod/lib/helpers.py:34
118
+msgid "The item is being worked on."
119
+msgstr "L'élément est en cours d'utilisation."
120
+
121
+#: pod/lib/helpers.py:36
122
+msgid "Waiting for some external actions."
123
+msgstr "En attente d'actions externes."
124
+
125
+#: pod/lib/helpers.py:38
126
+msgid "The work associated with the item is finished."
127
+msgstr "L'action associée à l'élément n'est pas terminée."
128
+
129
+#: pod/lib/helpers.py:40
130
+msgid ""
131
+"Close the item if you want not to see it anymore. The data won't be deleted"
132
+msgstr ""
133
+"Fermez l'élément si vous ne voulez plus le voir. Les données ne seront pas "
134
+"supprimées"
135
+
136
+#: pod/lib/helpers.py:42
137
+msgid "This status tells that the item has been deleted."
138
+msgstr "Ce status indique que l'élément a été supprimé."
139
+
140
+#: pod/model/data.py:372
141
+msgid "Titleless Document"
142
+msgstr "Document sans titre"
143
+
144
+#: pod/templates/about.mak:15
145
+msgid "Simple tool, flexible data."
146
+msgstr "Simple tool, flexible data."
147
+
148
+#: pod/templates/about.mak:53
149
+msgid "Improving pod"
150
+msgstr "Améliorer pod"
151
+
152
+#: pod/templates/about.mak:55
153
+msgid " is a piece of software developed with <u>user needs</u> in mind."
154
+msgstr ""
155
+"est un logiciel dévelopé avec <u>les besoin de l'utilisateur</u> à l'esprit."
156
+
157
+#: pod/templates/about.mak:56
158
+msgid "It means that we need:"
159
+msgstr "Cela signifie que nous avons besoin de :"
160
+
161
+#: pod/templates/about.mak:58
162
+msgid "your feedback,"
163
+msgstr "vos retours,"
164
+
165
+#: pod/templates/about.mak:59
166
+msgid "you to ask questions,"
167
+msgstr "vos questions,"
168
+
169
+#: pod/templates/about.mak:60
170
+msgid "your feature requests,"
171
+msgstr "savoir quelles fonctionnalités vous voudriez,"
172
+
173
+#: pod/templates/about.mak:61
174
+msgid "you to tell us what's cool and what's wrong."
175
+msgstr "que vous nous disiez ce qui est bien ou pas."
176
+
177
+#: pod/templates/about.mak:72
178
+msgid "The author"
179
+msgstr "The author"
180
+
181
+#: pod/templates/about.mak:79
182
+msgid "I'm 35 years old,"
183
+msgstr "I'm 35 years old,"
184
+
185
+#: pod/templates/about.mak:80
186
+msgid "I'm a skilled software engineer,"
187
+msgstr "I'm a skilled software engineer,"
188
+
189
+#: pod/templates/about.mak:81
190
+msgid "I live in France, near Grenoble."
191
+msgstr "I live in France, near Grenoble."
192
+
193
+#: pod/templates/about.mak:99
194
+msgid "email us"
195
+msgstr "email us"
196
+
197
+#: pod/templates/about.mak:100
198
+msgid "and we will reply to you."
199
+msgstr "and we will reply to you."
200
+
201
+#: pod/templates/about.mak:101
202
+msgid "Thank you."
203
+msgstr "Thank you."
204
+
205
+#: pod/templates/create_account.mak:5
206
+msgid "Create account"
207
+msgstr "Créer un compte"
208
+
209
+#: pod/templates/dashboard.mak:15
210
+msgid "What's hot!"
211
+msgstr "Quoi de neuf?"
212
+
213
+#: pod/templates/dashboard.mak:17
214
+msgid "No hot stuff for today."
215
+msgstr "Rien de neuf aujourd'hui."
216
+
217
+#: pod/templates/dashboard.mak:30 pod/templates/dashboard.mak:57
218
+msgid "last modification"
219
+msgstr "dernière modification"
220
+
221
+#: pod/templates/dashboard.mak:42
222
+msgid "Actions to do"
223
+msgstr "Actions à faire"
224
+
225
+#: pod/templates/dashboard.mak:44
226
+msgid "No document requiring action."
227
+msgstr "Aucun document ne requière d'action."
228
+
229
+#: pod/templates/dashboard.mak:72
230
+msgid "Latest operations"
231
+msgstr "Derniers changements"
232
+
233
+#: pod/templates/dashboard.mak:74
234
+msgid "No activity found"
235
+msgstr "Pas de changements trouvés"
236
+
237
+#: pod/templates/dashboard.mak:94
238
+msgid "created"
239
+msgstr "créé"
240
+
241
+#: pod/templates/dashboard.mak:96
242
+msgid "updated"
243
+msgstr "mis à jour"
244
+
245
+#: pod/templates/document-widgets-tabs.mak:5
246
+msgid "Revisions"
247
+msgstr "Révisions"
248
+
249
+#: pod/templates/document-widgets-tabs.mak:18
250
+msgid "Share options"
251
+msgstr "Options de partage"
252
+
253
+#: pod/templates/document-widgets-tabs.mak:21
254
+msgid "This document is not shared"
255
+msgstr "Ce document n'est pas partagé"
256
+
257
+#: pod/templates/document-widgets-tabs.mak:23
258
+msgid "This document is shared."
259
+msgstr "Ce document est partagé"
260
+
261
+#: pod/templates/document-widgets-tabs.mak:31
262
+#: pod/templates/master.mak:155
263
+msgid "Groups"
264
+msgstr "Groupes"
265
+
266
+#: pod/templates/document-widgets-tabs.mak:52
267
+msgid "Individual users"
268
+msgstr "Utilisateurs"
269
+
270
+#: pod/templates/document-widgets-tabs.mak:92
271
+msgid "Edit share options"
272
+msgstr "Éditer les options de partage"
273
+
274
+#: pod/templates/document-widgets-tabs.mak:118
275
+msgid "Share document with collaborators."
276
+msgstr "Partager le document avec des collaborateurs."
277
+
278
+#: pod/templates/document-widgets-tabs.mak:121
279
+msgid "Select read and write access for each group or people..."
280
+msgstr ""
281
+"Sélectionnez l'accès en \"lecture\" ou \"écriture\" pour chaque groupe ou "
282
+"personne ..."
283
+
284
+#: pod/templates/document-widgets-tabs.mak:171
285
+msgid "Group"
286
+msgstr "Groupe"
287
+
288
+#: pod/templates/document-widgets-tabs.mak:172
289
+#: pod/templates/document-widgets-tabs.mak:203
290
+msgid "Access"
291
+msgstr "Accès"
292
+
293
+#: pod/templates/document-widgets-tabs.mak:202
294
+msgid "Individual Users"
295
+msgstr "Utilisateurs individuels"
296
+
297
+#: pod/templates/document-widgets-tabs.mak:260
298
+#: pod/templates/document-widgets.mak:335
299
+#: pod/templates/document-widgets.mak:412
300
+#: pod/templates/document-widgets.mak:487
301
+#: pod/templates/document-widgets.mak:561
302
+#: pod/templates/document-widgets.mak:662 pod/templates/pod.mak:46
303
+msgid "Cancel"
304
+msgstr "Abandonner"
305
+
306
+#: pod/templates/document-widgets-tabs.mak:263
307
+#: pod/templates/document-widgets.mak:338
308
+#: pod/templates/document-widgets.mak:415
309
+#: pod/templates/document-widgets.mak:490
310
+#: pod/templates/document-widgets.mak:564
311
+#: pod/templates/document-widgets.mak:665
312
+msgid "Save changes"
313
+msgstr "Sauvergarder"
314
+
315
+#: pod/templates/document-widgets-tabs.mak:369
316
+#: pod/templates/document-widgets.mak:686
317
+msgid "Attachments"
318
+msgstr "Pièces jointes"
319
+
320
+#: pod/templates/document-widgets-tabs.mak:372
321
+msgid "There is currently no attachment."
322
+msgstr "Il n'y a pas de pièces jointes pour le moment."
323
+
324
+#: pod/templates/document-widgets-tabs.mak:373
325
+msgid " Attach first file"
326
+msgstr "Joindre le premier fichier"
327
+
328
+#: pod/templates/document-widgets-tabs.mak:375
329
+msgid " Attach a file"
330
+msgstr "Joindre un fichier"
331
+
332
+#: pod/templates/document-widgets-tabs.mak:385
333
+msgid "Download the file"
334
+msgstr "Télécharger le fichier"
335
+
336
+#: pod/templates/document-widgets-tabs.mak:393
337
+msgid "View the attachment"
338
+msgstr "Voir les pièces jointe"
339
+
340
+#: pod/templates/document-widgets-tabs.mak:404
341
+msgid "Sub-documents"
342
+msgstr "Sous documents"
343
+
344
+#: pod/templates/document-widgets-tabs.mak:407
345
+msgid "There is currently no child documents."
346
+msgstr "Il n'y a pas de sous documents pour le moment."
347
+
348
+#: pod/templates/document-widgets-tabs.mak:409
349
+msgid "Add a document"
350
+msgstr "Ajouter un document"
351
+
352
+#: pod/templates/document-widgets-tabs.mak:428
353
+#: pod/templates/document-widgets.mak:683
354
+msgid "Calendar"
355
+msgstr "Calendrier"
356
+
357
+#: pod/templates/document-widgets-tabs.mak:431
358
+msgid "The calendar is empty."
359
+msgstr "Le calendrier est vide."
360
+
361
+#: pod/templates/document-widgets-tabs.mak:432
362
+msgid " Add first event"
363
+msgstr "Ajouter le premier évènement"
364
+
365
+#: pod/templates/document-widgets-tabs.mak:434
366
+msgid " Add an event"
367
+msgstr "Ajouter un évènement"
368
+
369
+#: pod/templates/document-widgets-tabs.mak:468
370
+#: pod/templates/document-widgets.mak:684
371
+msgid "Address book"
372
+msgstr "Carnet d'adresses"
373
+
374
+#: pod/templates/document-widgets-tabs.mak:470
375
+msgid "The address book is empty."
376
+msgstr "Le carnet d'adresses est vide"
377
+
378
+#: pod/templates/document-widgets-tabs.mak:471
379
+msgid "Add first contact"
380
+msgstr "Ajouter le premier contact"
381
+
382
+#: pod/templates/document-widgets-tabs.mak:473
383
+msgid "Add a contact"
384
+msgstr "Ajouter un contact"
385
+
386
+#: pod/templates/document-widgets-tabs.mak:494
387
+#: pod/templates/document-widgets.mak:685
388
+msgid "Comment thread"
389
+msgstr "Fil de discussions"
390
+
391
+#: pod/templates/document-widgets-tabs.mak:497
392
+msgid "The comment thread is empty."
393
+msgstr "Le fil de discussion est vide"
394
+
395
+#: pod/templates/document-widgets-tabs.mak:505
396
+msgid "Add a comment"
397
+msgstr "Ajouter un commentaire"
398
+
399
+#: pod/templates/document-widgets-tabs.mak:520
400
+msgid "the"
401
+msgstr "le"
402
+
403
+#: pod/templates/document-widgets-tabs.mak:522
404
+msgid "at"
405
+msgstr "à"
406
+
407
+#: pod/templates/document-widgets-tabs.mak:530
408
+msgid "Shared comment. Click to make private."
409
+msgstr "Commentaire partagé. Cliquez pour rendre privé."
410
+
411
+#: pod/templates/document-widgets-tabs.mak:532
412
+msgid "Private comment. Click to share."
413
+msgstr "Commentaire privé. Cliquez pour partager."
414
+
415
+#: pod/templates/document-widgets-tabs.mak:550
416
+msgid "Write your comment below:"
417
+msgstr "Écrivez votre commentaire ici :"
418
+
419
+#: pod/templates/document-widgets-tabs.mak:554
420
+msgid "Share this comment"
421
+msgstr "Partager ce commentaire"
422
+
423
+#: pod/templates/document-widgets-tabs.mak:558
424
+msgid "Add first comment"
425
+msgstr "Ajouter le premier commentaire"
426
+
427
+#: pod/templates/document-widgets-tabs.mak:560
428
+#: pod/templates/document-widgets.mak:103
429
+msgid "Comment"
430
+msgstr "Commentaire"
431
+
432
+#: pod/templates/document-widgets.mak:9
433
+msgid "Home"
434
+msgstr "Accueil"
435
+
436
+#: pod/templates/document-widgets.mak:56
437
+msgid "Change status"
438
+msgstr "Changer le statut"
439
+
440
+#: pod/templates/document-widgets.mak:63
441
+msgid "Current status is..."
442
+msgstr "Le statut actuel est ..."
443
+
444
+#: pod/templates/document-widgets.mak:72
445
+msgid "Change to..."
446
+msgstr "Changer en ..."
447
+
448
+#: pod/templates/document-widgets.mak:73
449
+msgid "change the status to..."
450
+msgstr "changer le status en ..."
451
+
452
+#: pod/templates/document-widgets.mak:86
453
+msgid "Add"
454
+msgstr "Ajouter"
455
+
456
+#: pod/templates/document-widgets.mak:92
457
+msgid "Add New..."
458
+msgstr "Ajouter un nouveau ..."
459
+
460
+#: pod/templates/document-widgets.mak:93
461
+msgid "create a totally new item..."
462
+msgstr "créer un nouvel élément ..."
463
+
464
+#: pod/templates/document-widgets.mak:96
465
+msgid "Document"
466
+msgstr "Document"
467
+
468
+#: pod/templates/document-widgets.mak:97
469
+msgid "File"
470
+msgstr "Fichier"
471
+
472
+#: pod/templates/document-widgets.mak:98
473
+#: pod/templates/document-widgets.mak:453
474
+msgid "Event"
475
+msgstr "Évènement"
476
+
477
+#: pod/templates/document-widgets.mak:99
478
+msgid "Contact"
479
+msgstr "Contact"
480
+
481
+#: pod/templates/document-widgets.mak:117
482
+msgid "more ..."
483
+msgstr "plus ..."
484
+
485
+#: pod/templates/document-widgets.mak:121
486
+msgid "Advanced actions..."
487
+msgstr "Actions avancées"
488
+
489
+#: pod/templates/document-widgets.mak:122
490
+msgid "power user actions..."
491
+msgstr "Actions avancées ..."
492
+
493
+#: pod/templates/document-widgets.mak:127
494
+msgid "Move"
495
+msgstr "Déplacer"
496
+
497
+#: pod/templates/document-widgets.mak:128
498
+msgid "Delete"
499
+msgstr "Supprimer"
500
+
501
+#: pod/templates/document-widgets.mak:128
502
+msgid "Delete the current document"
503
+msgstr "Supprimer le document actuel"
504
+
505
+#: pod/templates/document-widgets.mak:178
506
+#: pod/templates/document-widgets.mak:379
507
+msgid "Title"
508
+msgstr "Titre"
509
+
510
+#: pod/templates/document-widgets.mak:184
511
+#: pod/templates/document-widgets.mak:314
512
+msgid "document title"
513
+msgstr "titre du document"
514
+
515
+#: pod/templates/document-widgets.mak:217
516
+msgid "This document is private"
517
+msgstr "Ce document est privé"
518
+
519
+#: pod/templates/document-widgets.mak:219
520
+msgid "private"
521
+msgstr "privé"
522
+
523
+#: pod/templates/document-widgets.mak:222
524
+msgid "This document is shared"
525
+msgstr "Ce document est partagé"
526
+
527
+#: pod/templates/document-widgets.mak:224
528
+msgid "shared"
529
+msgstr "partagé"
530
+
531
+#: pod/templates/document-widgets.mak:260
532
+msgid "<p>We suggest you to start...<br/><br/></p>"
533
+msgstr "<p>Nous vous suggérons de commencer ...<br /><br /></p>"
534
+
535
+#: pod/templates/document-widgets.mak:263
536
+msgid "by working on existing items"
537
+msgstr "en travaillant sur des éléments existants"
538
+
539
+#: pod/templates/document-widgets.mak:265
540
+msgid "or"
541
+msgstr "ou"
542
+
543
+#: pod/templates/document-widgets.mak:268
544
+msgid "by creating a new document"
545
+msgstr "en créant un nouveau document"
546
+
547
+#: pod/templates/document-widgets.mak:271
548
+msgid "Create"
549
+msgstr "Créer"
550
+
551
+#: pod/templates/document-widgets.mak:323
552
+#: pod/templates/document-widgets.mak:401
553
+#: pod/templates/document-widgets.mak:474
554
+#: pod/templates/document-widgets.mak:548
555
+msgid "Share:"
556
+msgstr "Partager :"
557
+
558
+#: pod/templates/document-widgets.mak:324
559
+#: pod/templates/document-widgets.mak:402
560
+#: pod/templates/document-widgets.mak:475
561
+#: pod/templates/document-widgets.mak:549
562
+msgid "if checked, then copy share properties from current item"
563
+msgstr "si coché, les options de partage seront copiées de l'élément actuel"
564
+
565
+#: pod/templates/document-widgets.mak:385
566
+msgid "this field is optionnal"
567
+msgstr "ce champ est optionnel"
568
+
569
+#: pod/templates/document-widgets.mak:389
570
+msgid "Choose a file..."
571
+msgstr "Choisir un fichier ..."
572
+
573
+#: pod/templates/document-widgets.mak:390
574
+msgid "choose a file..."
575
+msgstr "choisir un fichier ..."
576
+
577
+#: pod/templates/document-widgets.mak:395
578
+msgid "File description (optionnal)"
579
+msgstr "Description du fichier (optionnel)"
580
+
581
+#: pod/templates/document-widgets.mak:457
582
+msgid "Date and time"
583
+msgstr "Date et heure"
584
+
585
+#: pod/templates/document-widgets.mak:464
586
+msgid "Event description:"
587
+msgstr "Description de l'évènement :"
588
+
589
+#: pod/templates/document-widgets.mak:530
590
+msgid "Contact name and firstname"
591
+msgstr "Nom et prénom du contact"
592
+
593
+#: pod/templates/document-widgets.mak:536
594
+msgid "name, firstname, title..."
595
+msgstr "nom, prénom, titre ..."
596
+
597
+#: pod/templates/document-widgets.mak:541
598
+msgid "Address, phone, email, company..."
599
+msgstr "Adresse, téléphone, email, entreprise ..."
600
+
601
+#: pod/templates/document-widgets.mak:596
602
+msgid "Select the destination:"
603
+msgstr "Sélectionnez la destination :"
604
+
605
+#: pod/templates/document-widgets.mak:682
606
+msgid "Subdocuments"
607
+msgstr "Sous documents"
608
+
609
+#: pod/templates/document-widgets.mak:687
610
+msgid "Access Management"
611
+msgstr "Gestion des droits"
612
+
613
+#: pod/templates/document-widgets.mak:688
614
+msgid "History"
615
+msgstr "Historique"
616
+
617
+#: pod/templates/document-widgets.mak:715
618
+msgid "Content explorer"
619
+msgstr "Explorateur de contenu"
620
+
621
+#: pod/templates/document-widgets.mak:799
622
+msgid "There is no content yet."
623
+msgstr "Il n'y a pas de contenu pour le moment."
624
+
625
+#: pod/templates/document-widgets.mak:800
626
+msgid "Create a topic"
627
+msgstr "Créer un sujet"
628
+
629
+#: pod/templates/document.mak:15
630
+msgid "Toggle view mode [narrow, medium, large]"
631
+msgstr "Changer la vue [étroite, médium, large]"
632
+
633
+#: pod/templates/document.mak:16
634
+msgid "Toggle view mode: narrow"
635
+msgstr "Changer la vue : étroite"
636
+
637
+#: pod/templates/document.mak:17
638
+msgid "Toggle view mode: medium"
639
+msgstr "Changer la vue : médium"
640
+
641
+#: pod/templates/document.mak:18
642
+msgid "Toggle view mode: large"
643
+msgstr "Changer la vue : large"
644
+
645
+#: pod/templates/document.mak:61
646
+msgid "New Sub-document"
647
+msgstr "Nouveau sous document"
648
+
649
+#: pod/templates/document.mak:62
650
+msgid "Add an event"
651
+msgstr "Ajouter un évènement"
652
+
653
+#: pod/templates/document.mak:63
654
+msgid "Add a new contact"
655
+msgstr "Ajouter un nouveau contact"
656
+
657
+#: pod/templates/document.mak:64
658
+msgid "Add a new file"
659
+msgstr "Ajouter un nouveau fichier"
660
+
661
+#: pod/templates/document.mak:65
662
+msgid "Move the document"
663
+msgstr "Déplacer le document"
664
+
665
+#: pod/templates/index.mak:30
666
+msgid "Remember me"
667
+msgstr "Se souvenir de moi"
668
+
669
+#: pod/templates/index.mak:38
670
+msgid "Welcome, "
671
+msgstr "Bienvenue,"
672
+
673
+#: pod/templates/index.mak:39
674
+msgid ""
675
+"Click on <a href=\"{0}\">Document</a> in the top menu to access you data."
676
+msgstr ""
677
+"Cliquez sur <a href=\"{0}\">Document</a> dans le menu du haut pour accéder à "
678
+"vos données."
679
+
680
+#: pod/templates/index.mak:53
681
+msgid "Text documents"
682
+msgstr "Documents texte"
683
+
684
+#: pod/templates/index.mak:54
685
+msgid "Events"
686
+msgstr "Évènements"
687
+
688
+#: pod/templates/index.mak:55
689
+msgid "Contacts"
690
+msgstr "Contacts"
691
+
692
+#: pod/templates/index.mak:56
693
+msgid "Comments"
694
+msgstr "Commentaires"
695
+
696
+#: pod/templates/index.mak:57
697
+msgid "Files"
698
+msgstr "Fichiers"
699
+
700
+#: pod/templates/master.mak:60
701
+msgid "collaborative work  ♦  improved efficiency  ♦  full traceability"
702
+msgstr "collaborative work  ♦  improved efficiency  ♦  full traceability"
703
+
704
+#: pod/templates/master.mak:93
705
+msgid "Documents"
706
+msgstr "Documents"
707
+
708
+#: pod/templates/master.mak:154
709
+msgid "Users"
710
+msgstr "Utilisateurs"
711
+
712
+#: pod/templates/master.mak:180
713
+msgid "Search"
714
+msgstr "Recherche"
715
+
716
+#: pod/templates/master.mak:190
717
+msgid "Help / About"
718
+msgstr "Aide/A propos"
719
+
720
+#: pod/templates/pod.mak:43
721
+msgid "Edit"
722
+msgstr "Éditer"
723
+
724
+#: pod/templates/pod.mak:50 pod/templates/pod.mak:52
725
+msgid "New"
726
+msgstr "Nouveau"
727
+
728
+#: pod/templates/pod.mak:83
729
+msgid "Create an account"
730
+msgstr "Créer un compte"
731
+
732
+#: pod/templates/search.mak:13
733
+msgid "Search again"
734
+msgstr "Chercher de nouveau"
735
+
736
+#: pod/templates/search.mak:22
737
+msgid "Results"
738
+msgstr "Résultats"
739
+
740
+#: pod/templates/search.mak:83
741
+msgid "No data found for keywords:"
742
+msgstr "Aucune correspondance pour les mots clés :"
743
+
744
+#~ msgid "You have no document yet."
745
+#~ msgstr "Vous n'avez pas de document pour le moment."
746
+
747
+#~ msgid "Move up"
748
+#~ msgstr "Monter"
749
+
750
+#~ msgid "Move down"
751
+#~ msgstr "Descendre"

+ 24 - 0
pod/pod/i18n/ru/LC_MESSAGES/pboard.po View File

@@ -0,0 +1,24 @@
1
+# Russian translations for ${package}.
2
+# Copyright (C) 2008 ORGANIZATION
3
+# This file is distributed under the same license as the ${package} project.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
5
+#
6
+msgid ""
7
+msgstr ""
8
+"Project-Id-Version: ${package} 0.0.0\n"
9
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
+"POT-Creation-Date: 2008-01-13 14:00+0200\n"
11
+"PO-Revision-Date: 2008-01-13 14:00+0200\n"
12
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+"Language-Team: ru <LL@li.org>\n"
14
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
15
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
16
+"MIME-Version: 1.0\n"
17
+"Content-Type: text/plain; charset=utf-8\n"
18
+"Content-Transfer-Encoding: 8bit\n"
19
+"Generated-By: Babel 0.9.1\n"
20
+
21
+#: ${package}/controllers/root.py:13
22
+msgid "Your application is now running"
23
+msgstr "Ваши приложение успешно запущено"
24
+

+ 2 - 0
pod/pod/lib/__init__.py View File

@@ -0,0 +1,2 @@
1
+# -*- coding: utf-8 -*-
2
+

+ 18 - 0
pod/pod/lib/app_globals.py View File

@@ -0,0 +1,18 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""The application's Globals object"""
4
+
5
+__all__ = ['Globals']
6
+
7
+
8
+class Globals(object):
9
+    """Container for objects available throughout the life of the application.
10
+
11
+    One instance of Globals is created during application initialization and
12
+    is available during requests via the 'app_globals' variable.
13
+
14
+    """
15
+
16
+    def __init__(self):
17
+        """Do nothing, by default."""
18
+        pass

+ 65 - 0
pod/pod/lib/auth.py View File

@@ -0,0 +1,65 @@
1
+# -*- coding: utf-8 -*-
2
+"""Predicates for authorizations"""
3
+from tg.predicates import Predicate
4
+from pod.model import DBSession as session
5
+from pod.model.auth import Permission, User
6
+import logging as l
7
+
8
+DIRTY_canReadOrCanWriteSqlQuery = """
9
+SELECT
10
+    pgn.node_id
11
+FROM
12
+    pod_group_node AS pgn
13
+    JOIN pod_nodes AS pn ON pn.node_id = pgn.node_id AND pn.is_shared = 't'
14
+    JOIN pod_user_group AS pug ON pug.group_id = pgn.group_id
15
+    JOIN pod_user AS pu ON pug.user_id = pu.user_id
16
+WHERE
17
+    rights > :excluded_right_low_level
18
+    AND email_address = :email
19
+    AND pgn.node_id = :node_id
20
+UNION
21
+    SELECT
22
+        pnn.node_id
23
+    FROM
24
+        pod_nodes AS pnn,
25
+        pod_user AS puu
26
+    WHERE
27
+        pnn.node_id = :node_id
28
+        AND pnn.owner_id = puu.user_id
29
+        AND puu.email_address = :email
30
+"""
31
+
32
+class can_read(Predicate):
33
+    message = ""
34
+
35
+    def __init__(self, **kwargs):
36
+        pass
37
+
38
+    def evaluate(self, environ, credentials):
39
+        if 'node_id' in environ['webob.adhoc_attrs']['validation']['values']:
40
+            node_id = environ['webob.adhoc_attrs']['validation']['values']['node_id']
41
+            if node_id!=0:
42
+                has_right = session.execute(
43
+                    DIRTY_canReadOrCanWriteSqlQuery,
44
+                    {"email":credentials["repoze.who.userid"], "node_id":node_id, "excluded_right_low_level": 0}
45
+                )
46
+                if has_right.rowcount == 0 :
47
+                    l.info("User {} don't have read right on node {}".format(credentials["repoze.who.userid"], node_id))
48
+                    self.unmet()
49
+
50
+class can_write(Predicate):
51
+    message = ""
52
+
53
+    def __init__(self, **kwargs):
54
+        pass
55
+
56
+    def evaluate(self, environ, credentials):
57
+        node_id = environ['webob.adhoc_attrs']['validation']['values']['node_id']
58
+        if node_id!=0:
59
+            has_right = session.execute(
60
+                DIRTY_canReadOrCanWriteSqlQuery,
61
+                {"email":credentials["repoze.who.userid"], "node_id":node_id, "excluded_right_low_level": 1}
62
+            )
63
+            if has_right.rowcount == 0 :
64
+                self.unmet()
65
+

+ 36 - 0
pod/pod/lib/base.py View File

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""The base Controller API."""
4
+
5
+from tg import TGController, tmpl_context, flash
6
+from tg.render import render
7
+from tg import request, redirect
8
+from tg.i18n import ugettext as _, ungettext
9
+
10
+__all__ = ['BaseController']
11
+
12
+
13
+class BaseController(TGController):
14
+    """
15
+    Base class for the controllers in the application.
16
+
17
+    Your web application should have one of these. The root of
18
+    your application is used to compute URLs used by your app.
19
+
20
+    """
21
+
22
+    def __call__(self, environ, context):
23
+        """Invoke the Controller"""
24
+        # TGController.__call__ dispatches to the Controller method
25
+        # the request is routed to.
26
+
27
+        request.identity = request.environ.get('repoze.who.identity')
28
+        tmpl_context.identity = request.identity
29
+        return TGController.__call__(self, environ, context)
30
+
31
+    def back_with_error(self, message):
32
+        flash(message)
33
+        redirect(request.headers['Referer'])
34
+
35
+def current_user():
36
+    return request.environ.get('repoze.who.identity')['user']

+ 579 - 0
pod/pod/lib/dbapi.py View File

@@ -0,0 +1,579 @@
1
+# -*- coding: utf-8 -*-
2
+"""
3
+"""
4
+import os
5
+from datetime import datetime
6
+from hashlib import sha256
7
+
8
+from sqlalchemy import Table, ForeignKey, Column
9
+from sqlalchemy.types import Unicode, Integer, DateTime, Text
10
+from sqlalchemy.orm import relation, synonym
11
+from sqlalchemy.orm import joinedload_all
12
+import sqlalchemy.orm as sqlao
13
+import sqlalchemy as sqla
14
+
15
+from pod.model import data as pbmd
16
+from pod.model import auth as pbma
17
+import pod.model as pbm
18
+
19
+import tg
20
+
21
+FIXME_ERROR_CODE=-1
22
+
23
+class PODStaticController(object):
24
+
25
+  @classmethod
26
+  def getCurrentUser(cls):
27
+    loCurrentUser = pbma.User.by_email_address(tg.request.identity['repoze.who.userid'])
28
+    return loCurrentUser
29
+
30
+  @classmethod
31
+  def getUserByEmailAddress(cls, psEmailAddress):
32
+    loUser = pbma.User.by_email_address(psEmailAddress)
33
+    return loUser
34
+  
35
+  @classmethod
36
+  def createNewUser(cls, real_name, email_address, password, groups):
37
+    loUser = pbma.User()
38
+    new_user = pbma.User()
39
+    new_user.email_address = email_address
40
+    new_user.display_name  = real_name if real_name!='' else email_address
41
+    new_user.password      = password
42
+
43
+    public_group = cls.getGroupById(pbma.Group.GROUP_ID_ALL_USERS)
44
+    public_group.users.append(new_user)
45
+
46
+    pbm.DBSession.add(new_user)
47
+    pbm.DBSession.flush()
48
+    pbm.DBSession.refresh(new_user)
49
+
50
+    user_dedicated_group = cls.createGroup()
51
+    user_dedicated_group.group_id = 0-new_user.user_id # group id of a given user is the opposite of the user id
52
+    user_dedicated_group.group_name = 'user_%d' % new_user.user_id
53
+    user_dedicated_group.personnal_group = True
54
+    user_dedicated_group.users.append(new_user)
55
+
56
+    for group_id in groups:
57
+        selected_group = cls.getGroupById(group_id)
58
+        selected_group.users.append(new_user)
59
+
60
+    pbm.DBSession.flush()
61
+
62
+    return new_user
63
+
64
+  @classmethod
65
+  def updateUser(cls, user_id, real_name, email, group_ids):
66
+
67
+      group_ids = list(map(int, group_ids))
68
+      group_ids.append(pbma.Group.GROUP_ID_ALL_USERS)
69
+      print('new group ids:', group_ids)
70
+      user_to_update = pbm.DBSession.query(pbma.User).filter(pbma.User.user_id==user_id).one()
71
+      user_to_update.display_name = real_name
72
+      user_to_update.email_address = email
73
+
74
+      merged_new_groups = []
75
+
76
+      for group in user_to_update.groups:
77
+          if group.group_id==pbma.Group.GROUP_ID_MANAGERS:
78
+              print('adding group (3)', group.group_id)
79
+              merged_new_groups.append(group)
80
+
81
+          elif group.group_id==pbma.Group.GROUP_ID_ALL_USERS:
82
+              print('adding group (2)', group.group_id)
83
+              merged_new_groups.append(group)
84
+
85
+          elif group.group_id in group_ids:
86
+              print('adding group', group.group_id)
87
+              merged_new_groups.append(group)
88
+
89
+          else:
90
+              print('remove group', group.group_id)
91
+              user_to_update.groups.remove(group)
92
+
93
+      for group_id in group_ids:
94
+          group = cls.getGroupById(group_id)
95
+
96
+          if group not in merged_new_groups:
97
+              merged_new_groups.append(group)
98
+
99
+      user_to_update.groups = merged_new_groups
100
+
101
+      for group in merged_new_groups:
102
+          print("group => ", group.group_id)
103
+      pbm.DBSession.flush()
104
+
105
+  @classmethod
106
+  def deleteUser(cls, user_id):
107
+      user_to_delete = pbm.DBSession.query(pbma.User).filter(pbma.User.user_id==user_id).one()
108
+      user_dedicated_group = pbm.DBSession.query(pbma.Group).filter(pbma.Group.group_id==-user_id).one()
109
+      pbm.DBSession.delete(user_to_delete)
110
+      pbm.DBSession.delete(user_dedicated_group)
111
+      pbm.DBSession.flush()
112
+
113
+  @classmethod
114
+  def getGroup(cls, psGroupName):
115
+    loGroup = pbma.Group.by_group_name(psGroupName)
116
+    return loGroup
117
+
118
+  @classmethod
119
+  def getGroupById(cls, group_id):
120
+    return pbm.DBSession.query(pbma.Group).filter(pbma.Group.group_id==group_id).one()
121
+
122
+  @classmethod
123
+  def createGroup(cls):
124
+    loGroup = pbma.Group()
125
+    return loGroup
126
+
127
+  @classmethod
128
+  def getGroups(cls):
129
+    loGroups = pbma.Group.real_groups_first()
130
+    return loGroups
131
+
132
+  @classmethod
133
+  def getRealGroupRightsOnNode(cls, piNodeId: int) -> pbmd.DIRTY_GroupRightsOnNode:
134
+
135
+    groupRightsOnNodeCustomSelect = pbm.DBSession\
136
+        .query(pbmd.DIRTY_GroupRightsOnNode)\
137
+        .from_statement(pbmd.DIRTY_RealGroupRightOnNodeSqlQuery)\
138
+        .params(node_id=piNodeId)\
139
+        .all()
140
+
141
+    return groupRightsOnNodeCustomSelect
142
+
143
+  @classmethod
144
+  def getUserDedicatedGroupRightsOnNode(cls, node: pbmd.PBNode) -> pbmd.DIRTY_GroupRightsOnNode:
145
+
146
+    group_rights_on_node = []
147
+    if node:
148
+        group_rights_on_node = pbm.DBSession\
149
+            .query(pbmd.DIRTY_GroupRightsOnNode)\
150
+            .from_statement(pbmd.DIRTY_UserDedicatedGroupRightOnNodeSqlQuery)\
151
+            .params(node_id=node.node_id)\
152
+            .all()
153
+
154
+    return group_rights_on_node
155
+
156
+  @classmethod
157
+  def DIRTY_get_rights_on_node(self, user_id, node_id):
158
+      rights = pbm.DBSession\
159
+              .execute("""select max(rights) as rights
160
+                      from pod_user_group
161
+                      natural join pod_group_node
162
+                      where node_id=:node_id
163
+                      and user_id=:user_id""", {"node_id":node_id, "user_id":user_id})\
164
+              .fetchone()
165
+      r = pbmd.DIRTY_GroupRightsOnNode()
166
+      r.rights = rights[0]
167
+      return r
168
+
169
+
170
+
171
+class PODUserFilteredApiController(object):
172
+  
173
+  def __init__(self, piUserId, piExtraUserIdList=[]):
174
+    self._iCurrentUserId       = piUserId
175
+    self._iExtraUserIdList     = piExtraUserIdList
176
+    self._iUserIdFilteringList = None
177
+    self._cache_allowed_nodes = None
178
+
179
+  def _getUserIdListForFiltering(self):
180
+    if self._iUserIdFilteringList==None:
181
+      self._iUserIdFilteringList = list()
182
+      self._iUserIdFilteringList.append(self._iCurrentUserId)
183
+      for liUserId in self._iExtraUserIdList:
184
+        self._iUserIdFilteringList.append(liUserId)
185
+    return self._iUserIdFilteringList
186
+
187
+
188
+  def createNode(self, parent_id=0, inherit_rights=True):
189
+    loNode          = pbmd.PBNode()
190
+    loNode.owner_id = self._iCurrentUserId
191
+    if int(parent_id)!=0:
192
+        loNode.parent_id = parent_id
193
+
194
+    if inherit_rights:
195
+        parent_node = pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.node_id==parent_id).one()
196
+        self.copy_rights(parent_node, loNode)
197
+
198
+    pbm.DBSession.add(loNode)
199
+
200
+    return loNode
201
+
202
+  def copy_rights(self, from_node: pbmd.PBNode, to_node: pbmd.PBNode, copy_also_is_shared=True):
203
+    """
204
+    copy rights from first node to second one
205
+    """
206
+    for parent_right in from_node._lRights:
207
+        new_right = self.createRight()
208
+        new_right.group_id = parent_right.group_id
209
+        new_right.rights = parent_right.rights
210
+        to_node._lRights.append(new_right)
211
+
212
+    if copy_also_is_shared:
213
+        to_node.is_shared = from_node.is_shared
214
+
215
+  def createDummyNode(self, parent_id, inherit_rights=True):
216
+    loNewNode = self.createNode(parent_id, inherit_rights)
217
+    loNewNode.data_label   = ''
218
+    loNewNode.data_content = ''
219
+    return loNewNode
220
+
221
+
222
+  def getNode(self, liNodeId: int) -> pbmd.PBNode:
223
+
224
+    lsSqlSelectQuery = """pod_nodes.node_id IN
225
+        (SELECT
226
+            pgn.node_id
227
+        FROM
228
+            pod_group_node AS pgn
229
+            join pod_user_group AS pug ON pug.group_id = pgn.group_id
230
+            join pod_user AS pu ON pug.user_id = pu.user_id
231
+        WHERE
232
+            rights > 0
233
+            AND pu.user_id = %s)
234
+    """
235
+    lsNodeIdFiltering = lsSqlSelectQuery % (str(self._iCurrentUserId))
236
+
237
+    if liNodeId!=None and liNodeId!=0:
238
+      return pbm.DBSession.query(pbmd.PBNode).options(sqlao.joinedload_all("_oParent"), sqlao.joinedload_all("_lAllChildren"))\
239
+        .filter(pbmd.PBNode.node_id==liNodeId)\
240
+        .filter(
241
+          sqla.or_(
242
+            pbmd.PBNode.owner_id==self._iCurrentUserId,
243
+            lsNodeIdFiltering
244
+          )
245
+        )\
246
+        .one()
247
+    return None
248
+
249
+  def getLastModifiedNodes(self, piMaxNodeNb: int):
250
+    """
251
+    Returns a list of nodes order by modification time and limited to piMaxNodeNb nodes
252
+    """
253
+    liOwnerIdList = self._getUserIdListForFiltering()
254
+    return pbm.DBSession.query(pbmd.PBNode)\
255
+        .outerjoin(pbma.Rights)\
256
+        .outerjoin(pbma.user_group_table, pbma.Rights.group_id==pbma.user_group_table.columns['group_id'])\
257
+        .options(joinedload_all("_lAllChildren"))\
258
+        .filter((pbmd.PBNode.owner_id.in_(liOwnerIdList)) | ((pbma.user_group_table.c.user_id.in_(liOwnerIdList)) & (pbmd.PBNode.is_shared == True)))\
259
+        .order_by(pbmd.PBNode.updated_at.desc())\
260
+        .limit(piMaxNodeNb).all()
261
+
262
+
263
+  def getListOfAllowedNodes(self, reset_cache=False) -> pbmd.PBNode:
264
+      if self._cache_allowed_nodes==None or reset_cache==True:
265
+        lsSqlQuery = """
266
+            SELECT
267
+                pn.node_id,
268
+                pn.parent_id,
269
+                pn.node_order,
270
+                pn.node_type,
271
+                pn.created_at,
272
+                pn.updated_at,
273
+                pn.data_label,
274
+                pn.data_content,
275
+                pn.data_datetime,
276
+                pn.node_status,
277
+                pn.data_reminder_datetime,
278
+                pn.parent_tree_path,
279
+                pn.node_depth,
280
+                pn.owner_id,
281
+                pn.is_shared,
282
+                pn.is_public,
283
+                pn.public_url_key
284
+            FROM
285
+                pod_group_node AS pgn
286
+                join pod_user_group AS pug ON pug.group_id = pgn.group_id
287
+                join pod_nodes AS pn ON pgn.node_id=pn.node_id AND pn.is_shared='t'
288
+            WHERE
289
+                pn.node_type='data'
290
+                AND pn.node_status NOT IN ('deleted', 'closed')
291
+                AND pn.node_id=pgn.node_id
292
+                AND pgn.rights > 0
293
+                AND pug.user_id = :owner_id
294
+
295
+            UNION
296
+                SELECT
297
+                    pn.node_id,
298
+                    pn.parent_id,
299
+                    pn.node_order,
300
+                    pn.node_type,
301
+                    pn.created_at,
302
+                    pn.updated_at,
303
+                    pn.data_label,
304
+                    pn.data_content,
305
+                    pn.data_datetime,
306
+                    pn.node_status,
307
+                    pn.data_reminder_datetime,
308
+                    pn.parent_tree_path,
309
+                    pn.node_depth,
310
+                    pn.owner_id,
311
+                    pn.is_shared,
312
+                    pn.is_public,
313
+                    pn.public_url_key
314
+                FROM
315
+                    pod_nodes AS pn
316
+                WHERE
317
+                    pn.node_type = 'data'
318
+                    AND pn.node_status NOT IN ('deleted', 'closed')
319
+                    AND pn.owner_id = :owner_id
320
+
321
+            ORDER BY node_id ASC
322
+        """
323
+
324
+        loNodeListResult = pbm.DBSession.query(pbmd.PBNode).\
325
+            from_statement(lsSqlQuery).\
326
+            params(owner_id=self._iCurrentUserId)
327
+        allowed_nodes = loNodeListResult.all()
328
+
329
+        self._cache_allowed_nodes = allowed_nodes
330
+
331
+      return self._cache_allowed_nodes
332
+
333
+
334
+  def searchNodesByText(self, plKeywordList: [str], piMaxNodeNb=100):
335
+    """
336
+    Returns a list of nodes order by type, nodes which contain at least one of the keywords
337
+    """
338
+    liOwnerIdList = self._getUserIdListForFiltering()
339
+    print ("AGAGA, ", liOwnerIdList)
340
+    loKeywordFilteringClauses = []
341
+    for keyword in plKeywordList:
342
+        loKeywordFilteringClauses.append(pbmd.PBNode.data_label.ilike('%'+keyword+'%'))
343
+        loKeywordFilteringClauses.append(pbmd.PBNode.data_content.ilike('%'+keyword+'%'))
344
+        loKeywordFilteringClauses.append(pbmd.PBNode.data_file_name.ilike('%'+keyword+'%'))
345
+
346
+    loKeywordFilteringClausesAsOr = sqla.or_(*loKeywordFilteringClauses) # Combine them with or to a BooleanClauseList
347
+
348
+    loResultsForSomeKeywords = pbm.DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).outerjoin(pbma.Rights).outerjoin(pbma.user_group_table, pbma.Rights.group_id==pbma.user_group_table.columns['group_id'])\
349
+        .filter(loKeywordFilteringClausesAsOr)\
350
+        .filter((pbmd.PBNode.owner_id.in_(liOwnerIdList)) | (pbma.user_group_table.c.user_id.in_(liOwnerIdList) & pbmd.PBNode.is_shared))\
351
+        .order_by(sqla.desc(pbmd.PBNode.node_type))\
352
+        .limit(piMaxNodeNb)\
353
+        .all()
354
+
355
+    return loResultsForSomeKeywords
356
+
357
+  def getNodesByStatus(self, psNodeStatus, piMaxNodeNb=5):
358
+    liOwnerIdList = self._getUserIdListForFiltering()
359
+    return pbm.DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_status==psNodeStatus).order_by(pbmd.PBNode.updated_at).limit(piMaxNodeNb).all()
360
+
361
+
362
+  def getChildNodesForMenu(self, poParentNode: pbmd.PBNode, allowed_nodes: [pbmd.PBNode]) -> [pbmd.PBNode]:
363
+    visible_child_nodes = []
364
+
365
+    if poParentNode!=None:
366
+        # standard case
367
+        print(" -------------- BEFORE @@@@@@@@@@@@@@@@ ")
368
+        all_child_nodes = poParentNode.getChildren()
369
+        print("@@@@@@@@@@@@@@@@ AFTER @@@@@@@@@@@@@@@@ ")
370
+        for child_node in all_child_nodes:
371
+          if child_node in allowed_nodes:
372
+            visible_child_nodes.append(child_node)
373
+    else:
374
+        # Root case
375
+        parent_nodes = pbm.DBSession
376
+        for allowed_node in allowed_nodes:
377
+            print("     @@@@@@@@@@@@@@@@ BEFORE @@@@@@@@@@@@@@@@ ")
378
+            # loParent = allowed_node._oParent
379
+            # print("@@@@@@@@@@@@@@@@ AFTER @@@@@@@@@@@@@@@@ {0}".format(allowed_node._oParent.node_id if allowed_node._oParent!=None else '0'))
380
+            # print("==== EXTRA {0}".format(allowed_node._oParent.node_id if allowed_node._oParent!=None else '0'))
381
+            print("====> ")
382
+
383
+            if allowed_node._oParent is None or allowed_node._oParent==allowed_node:
384
+                # D.A. - HACK - 2014-05-27
385
+                # I don't know why, but as from now (with use of sqlao.contains_eager in getListOfAllowedNodes()
386
+                # the root items have at first iteration itself as parent
387
+                print("==== EXTRA END")
388
+                # this is a root item => add it
389
+                visible_child_nodes.append(allowed_node)
390
+            else:
391
+                if allowed_node._oParent not in allowed_nodes:
392
+                    # the node is visible but not the parent => put it at the root
393
+                    visible_child_nodes.append(allowed_node)
394
+                else:
395
+                    print("==== EXTRA END 2 {0}".format(allowed_node._oParent.node_id))
396
+
397
+    print(" @@@@@@@@@@@@@@@@ PRE FAILURE @@@@@@@@@@@@@@@@ ")
398
+    return visible_child_nodes
399
+
400
+
401
+
402
+
403
+  def buildTreeListForMenu(self, current_node: pbmd.PBNode, allowed_nodes: [pbmd.PBNode]) -> [pbmd.NodeTreeItem]:
404
+    # The algorithm is:
405
+    # 1. build an intermediate tree containing only current node and parent path
406
+    #    + complete it with sibling at each level (except root)
407
+    # 2. add sibling nodes at root level
408
+    # 3. complete it with shared documents (which are not at root but shared with current user)
409
+
410
+    node_tree = []
411
+
412
+    previous_tree_item = None
413
+    tmp_children_nodes = []
414
+
415
+    if current_node is not None:
416
+        breadcrumb_nodes = current_node.getBreadCrumbNodes()
417
+        breadcrumb_nodes.append(current_node) # by default the current node is not included
418
+
419
+        for breadcrumb_node in reversed(breadcrumb_nodes):
420
+            if previous_tree_item is None:
421
+                # First iteration. We add all current_node children
422
+                for child_node in breadcrumb_node.getChildren():
423
+                    if child_node in allowed_nodes:
424
+                        child_item = pbmd.NodeTreeItem(child_node, [])
425
+                        tmp_children_nodes.append(child_item)
426
+
427
+                previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
428
+
429
+            else:
430
+                tmp_children_nodes = []
431
+                for child_node in breadcrumb_node.getChildren():
432
+                    if child_node in allowed_nodes:
433
+                        if child_node == previous_tree_item.node:
434
+                            tmp_children_nodes.append(previous_tree_item)
435
+                        else:
436
+                            sibling_node = pbmd.NodeTreeItem(child_node, [])
437
+                            tmp_children_nodes.append(sibling_node)
438
+
439
+                previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
440
+
441
+    for node in allowed_nodes:
442
+        # This part of the algorithm insert root items
443
+        if node.parent_id==0 or node.parent_id is None:
444
+            if previous_tree_item is not None and node == previous_tree_item.node:
445
+                assert(isinstance(previous_tree_item, pbmd.NodeTreeItem))
446
+                node_tree.append(previous_tree_item)
447
+            else:
448
+                node_tree.append(pbmd.NodeTreeItem(node, []))
449
+        else:
450
+            # Try to add nodes shared with me but with a parent which is not shared
451
+            if node.owner_id!=self._iCurrentUserId:
452
+                # this is a node shared with me
453
+                if node._oParent!=None and node._oParent not in allowed_nodes:
454
+                    # the node is shared but not the parent => put it in the root
455
+                    node_tree.append(pbmd.NodeTreeItem(node, []))
456
+
457
+
458
+    return node_tree
459
+
460
+
461
+
462
+  def DIRTY_OLDbuildTreeListForMenu(self, plViewableStatusId: []) -> [pbmd.PBNode]:
463
+
464
+    liOwnerIdList = self._getUserIdListForFiltering()
465
+    
466
+    # loNodeList = pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_type==pbmd.PBNodeType.Data).filter(pbmd.PBNode.node_status.in_(plViewableStatusId)).order_by(pbmd.PBNode.parent_tree_path).order_by(pbmd.PBNode.node_order).order_by(pbmd.PBNode.node_id).all()
467
+    loNodeListNotFiltered = pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.node_type==pbmd.PBNodeType.Data).filter(pbmd.PBNode.node_status.in_(plViewableStatusId)).order_by(pbmd.PBNode.parent_tree_path).order_by(pbmd.PBNode.node_order).order_by(pbmd.PBNode.node_id).all()
468
+
469
+    loNodeList = []
470
+    for loNode in loNodeListNotFiltered:
471
+      if loNode.owner_id in self._getUserIdListForFiltering():
472
+        loNodeList.append(loNode)
473
+      else:
474
+        for loRight in loNode._lRights:
475
+          for loUser in loRight._oGroup.users:
476
+            if loUser.user_id in self._getUserIdListForFiltering():
477
+              loNodeList.append(loNode)
478
+
479
+    loTreeList = []
480
+    loTmpDict = {}
481
+    for loNode in loNodeList:
482
+      loTmpDict[loNode.node_id] = loNode
483
+  
484
+      if loNode.parent_id==None or loNode.parent_id==0:
485
+        loTreeList.append(loNode)
486
+      else:
487
+        # append the node to the parent list
488
+        # FIXME - D.A - 2013-10-08
489
+        # The following line may raise an exception
490
+        # We suppose that the parent node has already been added
491
+        # this *should* be the case, but the code does not check it
492
+        if loNode.parent_id not in loTmpDict.keys():
493
+          try:
494
+
495
+            loTmpDict[loNode.parent_id] = self.getNode(loNode.parent_id)
496
+          except Exception as e:
497
+            # loTreeList.append(
498
+            # FIXME - D.A. - 2014-05-22 This may be wrong code:
499
+            # we are in the case when the node parent is not shared with the current user
500
+            # So the node should be added at the root
501
+            pass
502
+        if loNode.parent_id in loTmpDict.keys():
503
+          # HACK- D.A. - 2014-05-22 - See FIXME upper
504
+          loTmpDict[loNode.parent_id].appendStaticChild(loNode)
505
+  
506
+    return loTreeList
507
+
508
+  def getParentNode(self, loNode):
509
+    liOwnerIdList = self._getUserIdListForFiltering()
510
+    return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==loNode.parent_id).one()
511
+
512
+  def getSiblingNodes(self, poNode, pbReverseOrder=False):
513
+    liOwnerIdList = self._getUserIdListForFiltering()
514
+    
515
+    if pbReverseOrder:
516
+      return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order.desc()).all()
517
+    else:
518
+      return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order).all()
519
+
520
+  def resetNodeOrderOfSiblingNodes(self, loSiblingNodes):
521
+    liNewWeight = 0
522
+    for loNode in loSiblingNodes:
523
+      liNewWeight = liNewWeight + 1
524
+      loNode.node_order = liNewWeight
525
+    # DBSession.save()
526
+
527
+  def moveNodeUpper(self, loNode):
528
+    # FIXME - manage errors and logging
529
+    
530
+    loSiblingNodes = self.getSiblingNodes(loNode)
531
+    self.resetNodeOrderOfSiblingNodes(loSiblingNodes)
532
+  
533
+    loPreviousItem = None
534
+    for loItem in loSiblingNodes:
535
+      if loItem==loNode:
536
+        if loPreviousItem==None:
537
+          return FIXME_ERROR_CODE # FIXME - D.A. Do not use hard-coded error codes
538
+          print("No previous node")
539
+        else:
540
+          liPreviousItemOrder       = loPreviousItem.node_order
541
+          loPreviousItem.node_order = loNode.node_order
542
+          loNode.node_order         = liPreviousItemOrder
543
+          # DBSession.save()
544
+          break
545
+      loPreviousItem = loItem
546
+
547
+  def moveNodeLower(self, loNode):
548
+    # FIXME - manage errors and logging
549
+    
550
+    loSiblingNodes = self.getSiblingNodes(loNode)
551
+    self.resetNodeOrderOfSiblingNodes(loSiblingNodes)
552
+  
553
+    loPreviousItem = None
554
+    for loItem in reversed(loSiblingNodes):
555
+      if loItem==loNode:
556
+        if loPreviousItem==None:
557
+          return FIXME_ERROR_CODE # FIXME - D.A. Do not use hard-coded error codes
558
+          # FIXME
559
+          print("No previous node")
560
+        else:
561
+          liPreviousItemOrder       = loPreviousItem.node_order
562
+          loPreviousItem.node_order = loNode.node_order
563
+          loNode.node_order         = liPreviousItemOrder
564
+          # DBSession.save()
565
+          break
566
+      loPreviousItem = loItem
567
+
568
+  def getNodeFileContent(self, liNodeId):
569
+    liOwnerIdList = self._getUserIdListForFiltering()
570
+    return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==liNodeId).one().data_file_content
571
+
572
+  def deleteNode(loNode):
573
+    # INFO - D.A. - 2013-11-07 - should be save as getNode should return only accessible nodes
574
+    pbm.DBSession.delete(loNode)
575
+    return
576
+
577
+  def createRight(self):
578
+    loRight = pbma.Rights()
579
+    return loRight

+ 95 - 0
pod/pod/lib/helpers.py View File

@@ -0,0 +1,95 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""WebHelpers used in pod."""
4
+
5
+#from webhelpers import date, feedgenerator, html, number, misc, text
6
+from markupsafe import Markup
7
+from datetime import datetime
8
+from tg.i18n import ugettext as _, lazy_ugettext as l_
9
+import tg
10
+
11
+def current_year():
12
+  now = datetime.now()
13
+  return now.strftime('%Y')
14
+
15
+def icon(icon_name, white=False):
16
+    if (white):
17
+        return Markup('<i class="icon-%s icon-white"></i>' % icon_name)
18
+    else:
19
+        return Markup('<i class="icon-%s"></i>' % icon_name)
20
+
21
+
22
+def getExplanationAboutStatus(psStatusId, psCurrentStatusId):
23
+  lsMsg = ""
24
+  if psStatusId==psCurrentStatusId:
25
+    return _("This is the current status.")
26
+  else:
27
+    if psStatusId=='information':
28
+      return _("The item is a normal document, like a howto or a text document.")
29
+    if psStatusId=='automatic':
30
+      return _("The item will be automatically computed as \"in progress\" or \"done\" according to its children status.")
31
+    if psStatusId=='new':
32
+      return _("No action done on the item.")
33
+    if psStatusId=='inprogress':
34
+      return _("The item is being worked on.")
35
+    if psStatusId=='standby':
36
+      return _("Waiting for some external actions.")
37
+    if psStatusId=='done':
38
+      return _("The work associated with the item is finished.")
39
+    if psStatusId=='closed':
40
+      return _("Close the item if you want not to see it anymore. The data won't be deleted")
41
+    if psStatusId=='deleted':
42
+      return _("This status tells that the item has been deleted.")
43
+
44
+class ID(object):
45
+  """ Helper class that will manage html items ids that need to be shared"""
46
+
47
+  @classmethod
48
+  def AddDocumentModalForm(cls, poNode=None):
49
+    if poNode:
50
+      return 'add-document-modal-form-%d'%poNode.node_id
51
+    else:
52
+      return 'add-document-modal-form'
53
+
54
+  @classmethod
55
+  def AddContactModalForm(cls, poNode=None):
56
+    if poNode:
57
+      return 'add-contact-modal-form-%d'%poNode.node_id
58
+    else:
59
+      return 'add-contact-modal-form'
60
+
61
+  @classmethod
62
+  def AddFileModalForm(cls, poNode=None):
63
+    if poNode:
64
+      return 'add-file-modal-form-%d'%poNode.node_id
65
+    else:
66
+      return 'add-file-modal-form'
67
+
68
+  @classmethod
69
+  def MoveDocumentModalForm(cls, poNode):
70
+      return 'move-document-modal-form-{0}'.format(poNode.node_id)
71
+
72
+  @classmethod
73
+  def AddEventModalForm(cls, poNode=None):
74
+    if poNode:
75
+      return 'add-event-modal-form-%d'%poNode.node_id
76
+    else:
77
+      return 'add-event-modal-form'
78
+    ## Original id is 'current-document-add-event-form'
79
+
80
+  @classmethod
81
+  def AddCommentInlineForm(cls):
82
+    return 'current-document-add-comment-form'
83
+
84
+class ICON(object):
85
+  Shared = '<i class="fa fa-group"></i>'
86
+  Private = '<i class="fa fa-key"></i>'
87
+
88
+def tracker_js():
89
+    js_file_path = tg.config.get('js_tracker_path', None)
90
+    if js_file_path is not None:
91
+        with open (js_file_path, "r") as js_file:
92
+            data=js_file.read()
93
+        return data
94
+    else:
95
+        return ""

+ 63 - 0
pod/pod/model/__init__.py View File

@@ -0,0 +1,63 @@
1
+# -*- coding: utf-8 -*-
2
+"""The application's model objects"""
3
+
4
+from zope.sqlalchemy import ZopeTransactionExtension
5
+from sqlalchemy.orm import scoped_session, sessionmaker
6
+#from sqlalchemy import MetaData
7
+from sqlalchemy.ext.declarative import declarative_base
8
+
9
+# Global session manager: DBSession() returns the Thread-local
10
+# session object appropriate for the current web request.
11
+maker = sessionmaker(autoflush=True, autocommit=False,
12
+                     extension=ZopeTransactionExtension())
13
+DBSession = scoped_session(maker)
14
+
15
+# Base class for all of our model classes: By default, the data model is
16
+# defined with SQLAlchemy's declarative extension, but if you need more
17
+# control, you can switch to the traditional method.
18
+DeclarativeBase = declarative_base()
19
+
20
+# There are two convenient ways for you to spare some typing.
21
+# You can have a query property on all your model classes by doing this:
22
+# DeclarativeBase.query = DBSession.query_property()
23
+# Or you can use a session-aware mapper as it was used in TurboGears 1:
24
+# DeclarativeBase = declarative_base(mapper=DBSession.mapper)
25
+
26
+# Global metadata.
27
+# The default metadata is the one from the declarative base.
28
+metadata = DeclarativeBase.metadata
29
+
30
+# If you have multiple databases with overlapping table names, you'll need a
31
+# metadata for each database. Feel free to rename 'metadata2'.
32
+#metadata2 = MetaData()
33
+
34
+#####
35
+# Generally you will not want to define your table's mappers, and data objects
36
+# here in __init__ but will want to create modules them in the model directory
37
+# and import them at the bottom of this file.
38
+#
39
+######
40
+
41
+def init_model(engine):
42
+    """Call me before using any of the tables or classes in the model."""
43
+    DBSession.configure(bind=engine)
44
+
45
+    # If you are using reflection to introspect your database and create
46
+    # table objects for you, your tables must be defined and mapped inside
47
+    # the init_model function, so that the engine is available if you
48
+    # use the model outside tg2, you need to make sure this is called before
49
+    # you use the model.
50
+
51
+    #
52
+    # See the following example:
53
+
54
+    #global t_reflected
55
+
56
+    #t_reflected = Table("Reflected", metadata,
57
+    #    autoload=True, autoload_with=engine)
58
+
59
+    #mapper(Reflected, t_reflected)
60
+
61
+# Import your model modules here.
62
+from pod.model.auth import User, Group, Permission
63
+from pod.model.data import PBNode

+ 233 - 0
pod/pod/model/auth.py View File

@@ -0,0 +1,233 @@
1
+# -*- coding: utf-8 -*-
2
+"""
3
+Auth* related model.
4
+
5
+This is where the models used by the authentication stack are defined.
6
+
7
+It's perfectly fine to re-use this definition in the pod application,
8
+though.
9
+
10
+"""
11
+import os
12
+from datetime import datetime
13
+from hashlib import sha256
14
+from sqlalchemy.sql.functions import session_user
15
+
16
+__all__ = ['User', 'Group', 'Permission']
17
+
18
+from sqlalchemy import Table, ForeignKey, Column
19
+from sqlalchemy.types import Unicode, Integer, DateTime, Boolean
20
+from sqlalchemy.orm import relation, relationship, synonym
21
+
22
+from pod.model import DeclarativeBase, metadata, DBSession
23
+
24
+# This is the association table for the many-to-many relationship between
25
+# groups and permissions.
26
+group_permission_table = Table('pod_group_permission', metadata,
27
+    Column('group_id', Integer, ForeignKey('pod_group.group_id',
28
+        onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
29
+    Column('permission_id', Integer, ForeignKey('pod_permission.permission_id',
30
+        onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
31
+)
32
+
33
+# This is the association table for the many-to-many relationship between
34
+# groups and members - this is, the memberships.
35
+user_group_table = Table('pod_user_group', metadata,
36
+    Column('user_id', Integer, ForeignKey('pod_user.user_id',
37
+        onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
38
+    Column('group_id', Integer, ForeignKey('pod_group.group_id',
39
+        onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
40
+)
41
+
42
+
43
+
44
+
45
+class Rights(DeclarativeBase):
46
+
47
+    READ_ACCESS = 1
48
+    WRITE_ACCESS = 2
49
+
50
+    __tablename__ = 'pod_group_node'
51
+
52
+    group_id = Column(Integer, ForeignKey('pod_group.group_id'), primary_key=True)
53
+    node_id = Column(Integer, ForeignKey('pod_nodes.node_id'), primary_key=True)
54
+    rights = Column(Integer)
55
+
56
+    def hasReadAccess(self):
57
+        return self.rights & Rights.READ_ACCESS
58
+
59
+    def hasWriteAccess(self):
60
+        return self.rights & Rights.WRITE_ACCESS
61
+
62
+
63
+
64
+class Group(DeclarativeBase):
65
+    GROUP_ID_ALL_USERS = 2
66
+    GROUP_ID_MANAGERS = 1
67
+
68
+    __tablename__ = 'pod_group'
69
+
70
+    group_id = Column(Integer, autoincrement=True, primary_key=True)
71
+    group_name = Column(Unicode(16), unique=True, nullable=False)
72
+    display_name = Column(Unicode(255))
73
+    created = Column(DateTime, default=datetime.now)
74
+    personnal_group = Column(Boolean)
75
+
76
+    users = relationship('User', secondary=user_group_table, backref='groups')
77
+
78
+    _lRights = relationship('Rights', backref='_oGroup', cascade = "all, delete-orphan")
79
+
80
+
81
+
82
+    def __repr__(self):
83
+        return '<Group: name=%s>' % repr(self.group_name)
84
+
85
+    def __unicode__(self):
86
+        return self.group_name
87
+
88
+    @classmethod
89
+    def by_group_name(cls, group_name):
90
+        """Return the user object whose email address is ``email``."""
91
+        return DBSession.query(cls).filter_by(group_name=group_name).first()
92
+
93
+    def getDisplayName(self) -> str:
94
+        if self.group_id<0:
95
+            # FIXME - D.A. - 2014-05-19 - MAKE THIS CODE CLEANER,
96
+            try:
97
+                return self.users[0].getDisplayName()
98
+            except:
99
+                print('ERROR GROUP =>', self.group_id)
100
+
101
+
102
+        return self.display_name
103
+
104
+    @property
105
+    def rights(self):
106
+        return self._lRights
107
+
108
+    def hasSomeAccess(self, poNode):
109
+        for loRight in self._lRights:
110
+            if loRight.node_id == poNode.node_id and loRight.rights>0:
111
+                return True
112
+        return False
113
+
114
+
115
+
116
+class User(DeclarativeBase):
117
+    """
118
+    User definition.
119
+
120
+    This is the user definition used by :mod:`repoze.who`, which requires at
121
+    least the ``email_address`` column.
122
+
123
+    """
124
+    __tablename__ = 'pod_user'
125
+
126
+    user_id = Column(Integer, autoincrement=True, primary_key=True)
127
+    email_address = Column(Unicode(255), unique=True, nullable=False)
128
+    display_name = Column(Unicode(255))
129
+    _password = Column('password', Unicode(128))
130
+    created = Column(DateTime, default=datetime.now)
131
+
132
+    def __repr__(self):
133
+        return '<User: email=%s, display=%s>' % (
134
+                repr(self.email_address), repr(self.display_name))
135
+
136
+    def __unicode__(self):
137
+        return self.display_name or self.email_address
138
+
139
+    @property
140
+    def permissions(self):
141
+        """Return a set with all permissions granted to the user."""
142
+        perms = set()
143
+        for g in self.groups:
144
+            perms = perms | set(g.permissions)
145
+        return perms
146
+
147
+    @classmethod
148
+    def by_email_address(cls, email):
149
+        """Return the user object whose email address is ``email``."""
150
+        return DBSession.query(cls).filter_by(email_address=email).first()
151
+
152
+    @classmethod
153
+    def by_user_name(cls, username):
154
+        """Return the user object whose user name is ``username``."""
155
+        return DBSession.query(cls).filter_by(email_address=username).first()
156
+
157
+    @classmethod
158
+    def _hash_password(cls, password):
159
+        salt = sha256()
160
+        salt.update(os.urandom(60))
161
+        salt = salt.hexdigest()
162
+
163
+        hash = sha256()
164
+        # Make sure password is a str because we cannot hash unicode objects
165
+        hash.update((password + salt).encode('utf-8'))
166
+        hash = hash.hexdigest()
167
+
168
+        password = salt + hash
169
+
170
+        # Make sure the hashed password is a unicode object at the end of the
171
+        # process because SQLAlchemy _wants_ unicode objects for Unicode cols
172
+        # FIXME - D.A. - 2013-11-20 - The following line has been removed since using python3. Is this normal ?!
173
+        # password = password.decode('utf-8')
174
+
175
+        return password
176
+
177
+    def _set_password(self, password):
178
+        """Hash ``password`` on the fly and store its hashed version."""
179
+        self._password = self._hash_password(password)
180
+
181
+    def _get_password(self):
182
+        """Return the hashed version of the password."""
183
+        return self._password
184
+
185
+    password = synonym('_password', descriptor=property(_get_password,
186
+                                                        _set_password))
187
+
188
+    def validate_password(self, password):
189
+        """
190
+        Check the password against existing credentials.
191
+
192
+        :param password: the password that was provided by the user to
193
+            try and authenticate. This is the clear text version that we will
194
+            need to match against the hashed one in the database.
195
+        :type password: unicode object.
196
+        :return: Whether the password is valid.
197
+        :rtype: bool
198
+
199
+        """
200
+        hash = sha256()
201
+        hash.update((password + self.password[:64]).encode('utf-8'))
202
+        return self.password[64:] == hash.hexdigest()
203
+
204
+    def getDisplayName(self):
205
+        if self.display_name!=None and self.display_name!='':
206
+            return self.display_name
207
+        else:
208
+            return self.email_address
209
+
210
+
211
+class Permission(DeclarativeBase):
212
+    """
213
+    Permission definition.
214
+
215
+    Only the ``permission_name`` column is required.
216
+
217
+    """
218
+
219
+    __tablename__ = 'pod_permission'
220
+
221
+
222
+    permission_id = Column(Integer, autoincrement=True, primary_key=True)
223
+    permission_name = Column(Unicode(63), unique=True, nullable=False)
224
+    description = Column(Unicode(255))
225
+
226
+    groups = relation(Group, secondary=group_permission_table,
227
+                      backref='permissions')
228
+
229
+    def __repr__(self):
230
+        return '<Permission: name=%s>' % repr(self.permission_name)
231
+
232
+    def __unicode__(self):
233
+        return self.permission_name

+ 496 - 0
pod/pod/model/data.py View File

@@ -0,0 +1,496 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import os
4
+import re
5
+import datetime as datetimeroot
6
+from datetime import datetime
7
+from hashlib import sha256
8
+
9
+import bs4
10
+from sqlalchemy import Table, ForeignKey, Column, Sequence
11
+import sqlalchemy as sqla
12
+from sqlalchemy.sql.sqltypes import Boolean
13
+from sqlalchemy.types import Unicode, Integer, DateTime, Text, LargeBinary
14
+import sqlalchemy.types as sqlat
15
+from sqlalchemy.orm import relation, synonym, relationship
16
+from sqlalchemy.orm import backref
17
+import sqlalchemy.orm as sqlao
18
+import sqlalchemy.orm.query as sqlaoq
19
+from sqlalchemy import orm as sqlao
20
+
21
+from tg.i18n import ugettext as _, lazy_ugettext as l_
22
+
23
+import tg
24
+from pod.model import DeclarativeBase, metadata, DBSession
25
+from pod.model import auth as pma
26
+from pod.lib.base import current_user
27
+
28
+
29
+class PBNodeStatusItem(object):
30
+  def __init__(self, psStatusId, psStatusLabel, psStatusFamily, psIconId, psCssClass): #, psBackgroundColor):
31
+    self._sStatusId     = psStatusId
32
+    self._sStatusLabel  = psStatusLabel
33
+    self._sStatusFamily = psStatusFamily
34
+    self._sIconId   = psIconId
35
+    self._sCssClass = psCssClass
36
+    # self._sBackgroundColor = psBackgroundColor
37
+  
38
+  def getLabel(self):
39
+    return self._sStatusLabel
40
+    
41
+  @property
42
+  def status_family(self):
43
+    return self._sStatusFamily
44
+    
45
+  @property
46
+  def icon(self):
47
+    return self._sIconId
48
+    
49
+  def getId(self):
50
+    return self._sStatusId
51
+
52
+  @property
53
+  def css(self):
54
+    return self._sCssClass
55
+
56
+  @property
57
+  def status_id(self):
58
+    return self._sStatusId
59
+    
60
+  @property
61
+  def icon_id(self):
62
+    return self._sIconId
63
+
64
+  @property
65
+  def label(self):
66
+    return self._sStatusLabel
67
+
68
+class PBNodeStatus(object):
69
+    
70
+  StatusList = dict()
71
+  StatusList['information'] = PBNodeStatusItem('information', 'Information',         'normal', 'fa fa-info-circle',            'pod-status-grey-light')
72
+  StatusList['automatic']   = PBNodeStatusItem('automatic',   'Automatic',           'open',   'fa fa-flash',                  'pod-status-grey-light')
73
+  StatusList['new']         = PBNodeStatusItem('new',         'New',                 'open',   'fa fa-lightbulb-o fa-inverse', 'btn-success')
74
+  StatusList['inprogress']  = PBNodeStatusItem('inprogress',  'In progress',         'open',   'fa fa-gears fa-inverse',       'btn-info')
75
+  StatusList['standby']     = PBNodeStatusItem('standby',     'In standby',          'open',   'fa fa-spinner fa-inverse',     'btn-warning')
76
+  StatusList['done']        = PBNodeStatusItem('done',        'Done',                'closed', 'fa fa-check-square-o',         'pod-status-grey-light')
77
+  StatusList['closed']      = PBNodeStatusItem('closed',      'Closed',              'closed', 'fa fa-lightbulb-o',            'pod-status-grey-middle')
78
+  StatusList['deleted']     = PBNodeStatusItem('deleted',     'Deleted',             'closed', 'fa fa-trash-o',                'pod-status-grey-dark')
79
+
80
+  @classmethod
81
+  def getChoosableList(cls):
82
+    return [
83
+      PBNodeStatus.StatusList['information'],
84
+      PBNodeStatus.StatusList['automatic'],
85
+      PBNodeStatus.StatusList['new'],
86
+      PBNodeStatus.StatusList['inprogress'],
87
+      PBNodeStatus.StatusList['standby'],
88
+      PBNodeStatus.StatusList['done'],
89
+      PBNodeStatus.StatusList['closed'],
90
+    ]
91
+
92
+  @classmethod
93
+  def getVisibleIdsList(cls):
94
+    return ['information', 'automatic', 'new', 'inprogress', 'standby', 'done' ]
95
+
96
+  @classmethod
97
+  def getVisibleList(cls):
98
+    return [
99
+      PBNodeStatus.StatusList['information'],
100
+      PBNodeStatus.StatusList['automatic'],
101
+      PBNodeStatus.StatusList['new'],
102
+      PBNodeStatus.StatusList['inprogress'],
103
+      PBNodeStatus.StatusList['standby'],
104
+      PBNodeStatus.StatusList['done'],
105
+    ]
106
+
107
+  @classmethod
108
+  def getList(cls):
109
+    return [
110
+      PBNodeStatus.StatusList['information'],
111
+      PBNodeStatus.StatusList['automatic'],
112
+      PBNodeStatus.StatusList['new'],
113
+      PBNodeStatus.StatusList['inprogress'],
114
+      PBNodeStatus.StatusList['standby'],
115
+      PBNodeStatus.StatusList['done'],
116
+      PBNodeStatus.StatusList['closed'],
117
+      PBNodeStatus.StatusList['deleted']
118
+    ]
119
+
120
+    
121
+  @classmethod
122
+  def getStatusItem(cls, psStatusId):
123
+    return PBNodeStatus.StatusList[psStatusId]
124
+
125
+class PBNodeType(object):
126
+  Node    = 'node'
127
+  Folder  = 'folder'
128
+  Data    = 'data'
129
+  File    = 'file'
130
+  Event   = 'event'
131
+  Contact = 'contact'
132
+  Comment = 'comment'
133
+
134
+
135
+MINIMUM_DATE = datetimeroot.date(datetimeroot.MINYEAR, 1, 1)
136
+
137
+class PBNode(DeclarativeBase):
138
+
139
+  #def __init__(self):
140
+  #  self._lStaticChildList = []
141
+
142
+  @sqlao.reconstructor
143
+  def init_on_load(self):
144
+    self._lStaticChildList = []
145
+
146
+  def appendStaticChild(self, loNode):
147
+    print("%s has child %s" % (self.node_id, loNode.node_id))
148
+    self._lStaticChildList.append(loNode)
149
+
150
+  def getStaticChildList(self):
151
+    return self._lStaticChildList
152
+
153
+  def getStaticChildNb(self):
154
+    return len(self._lStaticChildList)
155
+
156
+  __tablename__ = 'pod_nodes'
157
+
158
+  node_id          = Column(Integer, Sequence('pod_nodes__node_id__sequence'), primary_key=True)
159
+  parent_id        = Column(Integer, ForeignKey('pod_nodes.node_id'), nullable=True, default=None)
160
+  node_depth       = Column(Integer, unique=False, nullable=False, default=0)
161
+  parent_tree_path = Column(Unicode(255), unique=False, nullable=False, default='')
162
+  owner_id         = Column(Integer, ForeignKey('pod_user.user_id'), nullable=True, default=None)
163
+
164
+  node_order   = Column(Integer, nullable=True, default=1)
165
+  node_type    = Column(Unicode(16), unique=False, nullable=False, default='data')
166
+  node_status = Column(Unicode(16), unique=False, nullable=False, default='new')
167
+
168
+  created_at = Column(DateTime, unique=False, nullable=False)
169
+  updated_at = Column(DateTime, unique=False, nullable=False)
170
+
171
+  """
172
+    if 1, the document is available for other users logged into pod.
173
+    default is 0 (private document)
174
+  """
175
+  is_shared = Column(sqlat.Boolean, unique=False, nullable=False, default=False)
176
+  """
177
+    if 1, the document is available through a public - but obfuscated, url
178
+    default is 0 (document not publicly available)
179
+  """
180
+  is_public = Column(sqlat.Boolean, unique=False, nullable=False, default=False)
181
+  """
182
+    here is the hash allowing to get the document publicly
183
+  """
184
+  public_url_key = Column(Unicode(1024), unique=False, nullable=False, default='')
185
+
186
+  data_label   = Column(Unicode(1024), unique=False, nullable=False, default='')
187
+  data_content = Column(Text(),        unique=False, nullable=False, default='')
188
+  
189
+  data_datetime          = Column(DateTime, unique=False, nullable=False)
190
+  data_reminder_datetime = Column(DateTime, unique=False, nullable=True)
191
+  
192
+  data_file_name      = Column(Unicode(255),  unique=False, nullable=False, default='')
193
+  data_file_mime_type = Column(Unicode(255),  unique=False, nullable=False, default='')
194
+  data_file_content   = sqlao.deferred(Column(LargeBinary(), unique=False, nullable=False, default=None))
195
+
196
+  _lRights = relationship('Rights', backref='_oNode', cascade = "all, delete-orphan")
197
+
198
+  _oParent = relationship('PBNode', remote_side=[node_id], backref='_lAllChildren')
199
+  _oOwner = relationship('User', remote_side=[pma.User.user_id], backref='_lAllNodes')
200
+
201
+
202
+  def getChildrenOfType(self, plNodeTypeList, poKeySortingMethod=None, pbDoReverseSorting=False):
203
+    """return all children nodes of type 'data' or 'node' or 'folder'"""
204
+    llChildren = []
205
+    user_id = current_user().user_id
206
+    llChildren = DBSession.query(PBNode).outerjoin(pma.Rights)\
207
+            .outerjoin(pma.user_group_table, pma.Rights.group_id==pma.user_group_table.columns['group_id'])\
208
+            .filter(PBNode.parent_id==self.node_id)\
209
+            .filter((PBNode.owner_id==user_id) | ((pma.user_group_table.c.user_id==user_id) & (PBNode.is_shared == True)))\
210
+            .filter(PBNode.node_type.in_(plNodeTypeList))\
211
+            .all()
212
+    if poKeySortingMethod!=None:
213
+      llChildren = sorted(llChildren, key=poKeySortingMethod, reverse=pbDoReverseSorting)
214
+    return llChildren
215
+  
216
+  def getChildNbOfType(self, plNodeTypeList):
217
+    """return all children nodes of type 'data' or 'node' or 'folder'"""
218
+    liChildNb = 0
219
+    for child in self._lAllChildren:
220
+      if child.node_type in plNodeTypeList:
221
+        liChildNb = liChildNb+1
222
+    return liChildNb
223
+    # return DBSession.query(PBNode).filter(PBNode.parent_id==self.node_id).filter(PBNode.node_type.in_(plNodeTypeList)).order_by(plSortingCriteria).all()
224
+  
225
+  def getChildNb(self):
226
+    return self.getChildNbOfType([PBNodeType.Data])
227
+
228
+  def getGroupsWithSomeAccess(self):
229
+    llRights = []
230
+    for loRight in self._lRights:
231
+      if loRight.rights>0:
232
+        llRights.append(loRight)
233
+    return llRights
234
+
235
+  def getChildren(self, pbIncludeDeleted=False):
236
+    """return all children nodes of type 'data' or 'node' or 'folder'"""
237
+    # return self.getChildrenOfType([PBNodeType.Node, PBNodeType.Folder, PBNodeType.Data])
238
+    items = self.getChildrenOfType([PBNodeType.Node, PBNodeType.Folder, PBNodeType.Data])
239
+    items2 = list()
240
+    for item in items:
241
+      if pbIncludeDeleted==True or item.node_status!='deleted':
242
+        items2.append(item)
243
+    return items2
244
+
245
+  def getContacts(self):
246
+    """return all children nodes of type 'data' or 'node' or 'folder'"""
247
+    return self.getChildrenOfType([PBNodeType.Contact], PBNode.getSortingKeyForContact)
248
+
249
+  def getContactNb(self):
250
+    """return all children nodes of type 'data' or 'node' or 'folder'"""
251
+    return self.getChildNbOfType([PBNodeType.Contact])
252
+
253
+  @classmethod
254
+  def getSortingKeyBasedOnDataDatetime(cls, poDataNode):
255
+    return poDataNode.data_datetime or MINIMUM_DATE
256
+    
257
+  @classmethod
258
+  def getSortingKeyForContact(cls, poDataNode):
259
+    return poDataNode.data_label or ''
260
+
261
+  @classmethod
262
+  def getSortingKeyForComment(cls, poDataNode):
263
+    return poDataNode.data_datetime or ''
264
+
265
+  def getEvents(self):
266
+    return self.getChildrenOfType([PBNodeType.Event], PBNode.getSortingKeyBasedOnDataDatetime, True)
267
+    
268
+  def getFiles(self):
269
+    return self.getChildrenOfType([PBNodeType.File])
270
+
271
+  def getComments(self):
272
+    return self.getChildrenOfType([PBNodeType.Comment], PBNode.getSortingKeyBasedOnDataDatetime, True)
273
+
274
+  def getIconClass(self):
275
+    if self.node_type==PBNodeType.Data and self.getStaticChildNb()>0:
276
+      return PBNode.getIconClassForNodeType('folder')
277
+    else:
278
+      return PBNode.getIconClassForNodeType(self.node_type)
279
+
280
+  def getBreadCrumbNodes(self) -> list('PBNode'):
281
+    loNodes = []
282
+    if self._oParent!=None:
283
+      loNodes = self._oParent.getBreadCrumbNodes()
284
+      loNodes.append(self._oParent)
285
+    return loNodes
286
+
287
+  def getContentWithHighlightedKeywords(self, plKeywords, psPlainText):
288
+    if len(plKeywords)<=0:
289
+      return psPlainText
290
+
291
+    lsPlainText = psPlainText
292
+
293
+    for lsKeyword in plKeywords:
294
+      lsPlainText = re.sub('(?i)(%s)' % lsKeyword, '<strong>\\1</strong>', lsPlainText)
295
+
296
+    return lsPlainText
297
+
298
+
299
+  @classmethod
300
+  def getIconClassForNodeType(cls, psIconType):
301
+    laIconClass = dict()
302
+    laIconClass['node']   = 'fa fa-folder-open'
303
+    laIconClass['folder'] = 'fa fa-folder-open'
304
+    laIconClass['data']   = 'fa fa-file-text-o'
305
+
306
+    laIconClass['file']   = 'fa fa-paperclip'
307
+    laIconClass['event']  = 'fa fa-calendar'
308
+    laIconClass['contact'] = 'fa fa-user'
309
+    laIconClass['comment'] = 'fa fa-comments-o'
310
+    return laIconClass[psIconType]
311
+
312
+
313
+  def getUserFriendlyNodeType(self):
314
+    laNodeTypesLng = dict()
315
+    laNodeTypesLng['node']   = 'Document' # FIXME - D.A. - 2013-11-14 - Make text translatable
316
+    laNodeTypesLng['folder'] = 'Document'
317
+    laNodeTypesLng['data']   = 'Document'
318
+
319
+    laNodeTypesLng['file']   = 'File'
320
+    laNodeTypesLng['event']  = 'Event'
321
+    laNodeTypesLng['contact'] = 'Contact'
322
+    laNodeTypesLng['comment'] = 'Comment'
323
+
324
+    if self.node_type==PBNodeType.Data and self.getStaticChildNb()>0:
325
+      return laNodeTypesLng['folder']
326
+    else:
327
+      return laNodeTypesLng[self.node_type]
328
+
329
+    
330
+  def getFormattedDateTime(self, poDateTime, psDateTimeFormat = '%d/%m/%Y ~ %H:%M'):
331
+    return poDateTime.strftime(psDateTimeFormat)
332
+
333
+  def getFormattedDate(self, poDateTime, psDateTimeFormat = '%d/%m/%Y'):
334
+    return poDateTime.strftime(psDateTimeFormat)
335
+
336
+  def getFormattedTime(self, poDateTime, psDateTimeFormat = '%H:%M'):
337
+    return poDateTime.strftime(psDateTimeFormat)
338
+
339
+  def getStatus(self) -> PBNodeStatusItem:
340
+    loStatus = PBNodeStatus.getStatusItem(self.node_status)
341
+    if loStatus.status_id!='automatic':
342
+      return loStatus
343
+    else:
344
+      # Compute the status:
345
+      # - if at least one child is 'new' or 'in progress' or 'in standby' => status is inprogress
346
+      # - else if all status are 'done', 'closed' or 'deleted' => 'done'
347
+      lsRealStatusId = 'done'
348
+      for loChild in self.getChildren():
349
+        if loChild.getStatus().status_id in ('new', 'inprogress', 'standby'):
350
+          lsRealStatusId = 'inprogress'
351
+          break
352
+      return PBNodeStatus.getStatusItem(lsRealStatusId)
353
+
354
+  def getTruncatedLabel(self, piCharNb: int):
355
+    """
356
+    return a truncated version of the data_label property.
357
+    if piCharNb is not > 0, then the full data_label is returned
358
+    note: if the node is a file and the data_label is empty, the file name is returned
359
+    """
360
+    lsTruncatedLabel = self.data_label
361
+
362
+    # 2014-05-06 - D.A. - HACK
363
+    # if the node is a file and label empty, then use the filename as data_label
364
+    if self.node_type==PBNodeType.File and lsTruncatedLabel=='':
365
+      lsTruncatedLabel = self.data_file_name
366
+
367
+    liMaxLength = int(piCharNb)
368
+    if liMaxLength>0 and len(lsTruncatedLabel)>liMaxLength:
369
+      lsTruncatedLabel = lsTruncatedLabel[0:liMaxLength-1]+'…'
370
+
371
+    if lsTruncatedLabel=='':
372
+        lsTruncatedLabel = _('Titleless Document')
373
+
374
+    return lsTruncatedLabel
375
+
376
+  def getTruncatedContentAsText(self, piCharNb):
377
+    lsPlainText = ''.join(bs4.BeautifulSoup(self.data_content).findAll(text=True))
378
+    lsTruncatedContent = ''
379
+
380
+    liMaxLength = int(piCharNb)
381
+    if len(lsPlainText)>liMaxLength:
382
+      lsTruncatedContent = lsPlainText[0:liMaxLength-1]+'…'
383
+    else:
384
+      lsTruncatedContent = lsPlainText
385
+    return lsTruncatedContent
386
+
387
+  def getTagList(self):
388
+    loPattern = re.compile('(^|\s|@)@(\w+)')
389
+    loResults = re.findall(loPattern, self.data_content)
390
+    lsResultList = []
391
+    for loResult in loResults:
392
+      lsResultList.append(loResult[1].replace('@', '').replace('_', ' '))
393
+    return lsResultList
394
+
395
+  @classmethod
396
+  def addTagReplacement(cls, matchobj):
397
+    return " <span class='badge'>%s</span> " %(matchobj.group(0).replace('@', '').replace('_', ' '))
398
+
399
+  @classmethod
400
+  def addDocLinkReplacement(cls, matchobj):
401
+    return " <a href='%s'>%s</a> " %(tg.url('/dashboard?node=%s')%(matchobj.group(1)), matchobj.group(0))
402
+
403
+  def getContentWithTags(self):
404
+    lsTemporaryResult = re.sub('(^|\s)@@(\w+)', '', self.data_content) # tags with @@ are explicitly removed from the body
405
+    lsTemporaryResult = re.sub('#([0-9]*)', PBNode.addDocLinkReplacement, lsTemporaryResult) # tags with @@ are explicitly removed from the body
406
+    return re.sub('(^|\s)@(\w+)', PBNode.addTagReplacement, lsTemporaryResult) # then, 'normal tags are transformed as labels'
407
+    # FIXME - D.A. - 2013-09-12
408
+    # Does not match @@ at end of content.
409
+  
410
+  def getHistory(self):
411
+      return DBSession.execute("select node_id, version_id, created_at from pod_nodes_history where node_id = :node_id order by created_at desc", {"node_id":self.node_id}).fetchall()
412
+
413
+
414
+class NodeTreeItem(object):
415
+    """
416
+        This class implements a model that allow to simply represents the left-panel menu items
417
+         This model is used by dbapi but is not directly related to sqlalchemy and database
418
+    """
419
+    def __init__(self, node: PBNode, children: list('NodeTreeItem')):
420
+        self.node = node
421
+        self.children = children
422
+
423
+
424
+
425
+
426
+#####
427
+#
428
+# HACK - 2014-05-21 - D.A
429
+#
430
+# The following hack is a horrible piece of code that allow to map a raw SQL select to a mapped class
431
+#
432
+class DIRTY_GroupRightsOnNode(object):
433
+    def hasSomeAccess(self):
434
+        return self.rights >= pma.Rights.READ_ACCESS
435
+
436
+    def hasReadAccess(self):
437
+        return self.rights & pma.Rights.READ_ACCESS
438
+
439
+    def hasWriteAccess(self):
440
+        return self.rights & pma.Rights.WRITE_ACCESS
441
+
442
+DIRTY_group_rights_on_node_query = Table('fake_table', metadata,
443
+    Column('group_id', Integer, primary_key=True),
444
+    Column('node_id', Integer, primary_key=True),
445
+
446
+    Column('display_name', Unicode(255)),
447
+    Column('personnal_group', Boolean),
448
+    Column('rights', Integer, primary_key=True)
449
+)
450
+
451
+DIRTY_UserDedicatedGroupRightOnNodeSqlQuery = """
452
+SELECT
453
+    COALESCE(NULLIF(pg.display_name, ''), pu.display_name) AS display_name,
454
+    pg.personnal_group,
455
+    pg.group_id,
456
+    :node_id AS node_id,
457
+    COALESCE(pgn.rights, 0) AS rights
458
+FROM
459
+    pod_group AS pg
460
+    LEFT JOIN
461
+        pod_group_node AS pgn
462
+    ON
463
+        pg.group_id=pgn.group_id
464
+        AND pgn.node_id=:node_id
465
+    LEFT JOIN
466
+        pod_user AS pu
467
+    ON
468
+        pu.user_id=-pg.group_id
469
+WHERE
470
+    pg.personnal_group='t'
471
+ORDER BY
472
+    display_name
473
+;"""
474
+
475
+DIRTY_RealGroupRightOnNodeSqlQuery = """
476
+SELECT
477
+    pg.display_name AS display_name,
478
+    pg.personnal_group,
479
+    pg.group_id,
480
+    :node_id AS node_id,
481
+    COALESCE(pgn.rights, 0) AS rights
482
+FROM
483
+    pod_group AS pg
484
+    LEFT JOIN
485
+        pod_group_node AS pgn
486
+    ON
487
+        pg.group_id=pgn.group_id
488
+        AND pgn.node_id=:node_id
489
+WHERE
490
+    pg.personnal_group!='t'
491
+ORDER BY
492
+    display_name
493
+;"""
494
+
495
+sqlao.mapper(DIRTY_GroupRightsOnNode, DIRTY_group_rights_on_node_query)
496
+

+ 22 - 0
pod/pod/model/model.template View File

@@ -0,0 +1,22 @@
1
+# -*- coding: utf-8 -*-
2
+"""Sample model module."""
3
+
4
+from sqlalchemy import *
5
+from sqlalchemy.orm import mapper, relation
6
+from sqlalchemy import Table, ForeignKey, Column
7
+from sqlalchemy.types import Integer, Unicode
8
+#from sqlalchemy.orm import relation, backref
9
+
10
+from pod.model import DeclarativeBase, metadata, DBSession
11
+
12
+
13
+class SampleModel(DeclarativeBase):
14
+    __tablename__ = 'sample_model'
15
+    
16
+    #{ Columns
17
+    
18
+    id = Column(Integer, primary_key=True)
19
+    
20
+    data = Column(Unicode(255), nullable=False)
21
+    
22
+    #}

+ 91 - 0
pod/pod/model/serializers.py View File

@@ -0,0 +1,91 @@
1
+# -*- coding: utf-8 -*-
2
+import tg
3
+from pod.model import data as pmd
4
+
5
+def node_to_dict(node: pmd.PBNode, children_content, new_item_state):
6
+    """
7
+        children_content may be boolean or a list containing json values
8
+    """
9
+    url = tg.url('/document/', dict(node_id=node.node_id)) ## FIXME - 2014-05-27 - Make this more flexible
10
+
11
+    return dict(
12
+        id = node.node_id,
13
+        children = children_content,
14
+        text = node.data_label,
15
+        a_attr = { "href" : url },
16
+        li_attr = { "title": node.data_label },
17
+        type = node.node_type, # this property is understandable by jstree (through "types" plugin)
18
+        state = new_item_state,
19
+        node_status = node.getStatus().getId() # this is not jstree understandable data. This requires a JS 'success' callback
20
+    )
21
+
22
+
23
+def PBNodeForMenu(func):
24
+
25
+    def process_item(item: pmd.PBNode):
26
+        """ convert given item into a dictionnary """
27
+        return node_to_dict(item, item.getChildNb()>0, None)
28
+
29
+    def pre_serialize(*args, **kws):
30
+        initial_result = func(*args, **kws)
31
+        real_result = None
32
+
33
+        print("DEBUG ===================>", initial_result)
34
+        if isinstance(initial_result, list):
35
+            real_result = list()
36
+            for value_item in initial_result:
37
+                real_result.append(process_item(value_item))
38
+        else:
39
+            # We suppose here that we have an object only
40
+            real_result = process_item(initial_result)
41
+
42
+        return dict(d = real_result)
43
+
44
+    return pre_serialize
45
+
46
+
47
+def NodeTreeItemForMenu(func):
48
+    """ works with structure NodeTreeItem """
49
+    def process_item(structure_item: pmd.NodeTreeItem, current_node_id=None):
50
+        """ convert given item into a dictionnary """
51
+
52
+        item = structure_item.node
53
+        children = []
54
+
55
+        for child_item in structure_item.children:
56
+            children.append(process_item(child_item, current_node_id))
57
+
58
+        children_field_value = None
59
+        if len(children)>0:
60
+            children_field_value = children
61
+        elif item.getChildNb()>0:
62
+            children_field_value = True
63
+        else:
64
+            children_field_value = False
65
+
66
+        new_item_state = dict(
67
+            opened = item.getChildNb()<=0 or len(children)>0,
68
+            selected = current_node_id!=None and item.node_id==current_node_id,
69
+        )
70
+
71
+        return node_to_dict(item, children_field_value, new_item_state)
72
+
73
+    def pre_serialize(*args, **kws):
74
+        initial_result = func(*args, **kws)
75
+        real_result = None
76
+
77
+        current_node_id = None
78
+        if "current_node_id" in kws:
79
+            current_node_id = int(kws['current_node_id'])
80
+
81
+        if isinstance(initial_result, list):
82
+            real_result = list()
83
+            for value_item in initial_result:
84
+                real_result.append(process_item(value_item, current_node_id))
85
+        else:
86
+            # We suppose here that we have an object only
87
+            real_result = process_item(initial_result, current_node_id)
88
+
89
+        return dict(d = real_result)
90
+
91
+    return pre_serialize

File diff suppressed because it is too large
+ 8 - 0
pod/pod/public/css/bootstrap-datetimepicker.min.css


File diff suppressed because it is too large
+ 9 - 0
pod/pod/public/css/bootstrap-responsive.min.css


File diff suppressed because it is too large
+ 6315 - 0
pod/pod/public/css/bootstrap.css


File diff suppressed because it is too large
+ 874 - 0
pod/pod/public/css/bootstrap.min.css


File diff suppressed because it is too large
+ 4 - 0
pod/pod/public/css/external/font-awesome-4.1.0/css/font-awesome.min.css


BIN
pod/pod/public/css/external/font-awesome-4.1.0/fonts/FontAwesome.otf View File


BIN
pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.eot View File


+ 504 - 0
pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.svg View File

@@ -0,0 +1,504 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<svg xmlns="http://www.w3.org/2000/svg">
4
+<metadata></metadata>
5
+<defs>
6
+<font id="fontawesomeregular" horiz-adv-x="1536" >
7
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
8
+<missing-glyph horiz-adv-x="448" />
9
+<glyph unicode=" "  horiz-adv-x="448" />
10
+<glyph unicode="&#x09;" horiz-adv-x="448" />
11
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
12
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
13
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
14
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
15
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
16
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
17
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
18
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
19
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
20
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
21
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
22
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
23
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
24
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
25
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
26
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
27
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
28
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
29
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
30
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
31
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
32
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
33
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
34
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
35
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
36
+<glyph unicode="&#xf001;" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
37
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
38
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
39
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
40
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
41
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
42
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
43
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
44
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
45
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
46
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
47
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
48
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
49
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
50
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
51
+<glyph unicode="&#xf011;" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
52
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
53
+<glyph unicode="&#xf013;" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
54
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
55
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
56
+<glyph unicode="&#xf016;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
57
+<glyph unicode="&#xf017;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
58
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
59
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
60
+<glyph unicode="&#xf01a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
61
+<glyph unicode="&#xf01b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
62
+<glyph unicode="&#xf01c;" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
63
+<glyph unicode="&#xf01d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
64
+<glyph unicode="&#xf01e;" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
65
+<glyph unicode="&#xf021;" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
66
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
67
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
68
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
69
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
70
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
71
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
72
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
73
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
74
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
75
+<glyph unicode="&#xf02b;" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
76
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
77
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
78
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
79
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
80
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
81
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
82
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
83
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
84
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
85
+<glyph unicode="&#xf035;" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
86
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
87
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
88
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
89
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
90
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
91
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
92
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
93
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
94
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
95
+<glyph unicode="&#xf040;" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
96
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
97
+<glyph unicode="&#xf042;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
98
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
99
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
100
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
101
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
102
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
103
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
104
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
105
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
106
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
107
+<glyph unicode="&#xf04c;" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
108
+<glyph unicode="&#xf04d;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
109
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
110
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
111
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
112
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
113
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
114
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
115
+<glyph unicode="&#xf055;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
116
+<glyph unicode="&#xf056;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
117
+<glyph unicode="&#xf057;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
118
+<glyph unicode="&#xf058;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
119
+<glyph unicode="&#xf059;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
120
+<glyph unicode="&#xf05a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
121
+<glyph unicode="&#xf05b;" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
122
+<glyph unicode="&#xf05c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
123
+<glyph unicode="&#xf05d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
124
+<glyph unicode="&#xf05e;" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
125
+<glyph unicode="&#xf060;" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
126
+<glyph unicode="&#xf061;" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
127
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
128
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
129
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
130
+<glyph unicode="&#xf065;" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
131
+<glyph unicode="&#xf066;" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
132
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
133
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
134
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
135
+<glyph unicode="&#xf06a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
136
+<glyph unicode="&#xf06b;" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
137
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
138
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
139
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
140
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
141
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
142
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
143
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
144
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
145
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
146
+<glyph unicode="&#xf076;" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
147
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
148
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
149
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
150
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
151
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
152
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
153
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
154
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
155
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
156
+<glyph unicode="&#xf081;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
157
+<glyph unicode="&#xf082;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
158
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
159
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
160
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
161
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
162
+<glyph unicode="&#xf087;" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
163
+<glyph unicode="&#xf088;" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
164
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
165
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
166
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
167
+<glyph unicode="&#xf08c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
168
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
169
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
170
+<glyph unicode="&#xf090;" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
171
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
172
+<glyph unicode="&#xf092;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
173
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
174
+<glyph unicode="&#xf094;" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
175
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
176
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
177
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
178
+<glyph unicode="&#xf098;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
179
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
180
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
181
+<glyph unicode="&#xf09b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
182
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
183
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
184
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
185
+<glyph unicode="&#xf0a0;" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
186
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
187
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
188
+<glyph unicode="&#xf0a3;" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
189
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
190
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
191
+<glyph unicode="&#xf0a6;" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
192
+<glyph unicode="&#xf0a7;" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
193
+<glyph unicode="&#xf0a8;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
194
+<glyph unicode="&#xf0a9;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
195
+<glyph unicode="&#xf0aa;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
196
+<glyph unicode="&#xf0ab;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
197
+<glyph unicode="&#xf0ac;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
198
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM768 960q0 185 131.5 316.5t316.5 131.5q58 0 121.5 -16.5 t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25q0 -39 -23 -106q-47 -134 -164.5 -217.5t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5z" />
199
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M0 64v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 576v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1088v256q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM640 640h1024v128h-1024v-128zM1024 128h640v128h-640v-128zM1280 1152h384v128h-384v-128z" />
200
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M5 1241q17 39 59 39h1280q42 0 59 -39q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70z" />
201
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M0 160v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 736v384q0 66 47 113t113 47h352v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113v-384h-1792z M640 1280h512v128h-512v-128zM768 512v128h256v-128h-256z" />
202
+<glyph unicode="&#xf0b2;" d="M0 -64v448q0 42 40 59q39 17 69 -14l144 -144l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45 v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19l-144 144l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19 t-19 45z" />
203
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M0 671q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5zM128 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM256 3q0 53 3.5 103.5 t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5 zM576 896q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM1280 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM1327 640q81 117 81 256q0 29 -5 66q66 -23 133 -23 q59 0 119 21.5t97.5 42.5t43.5 21q124 0 124 -353q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128z" />
204
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l206 -207q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204t-85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88 q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204zM208 1088q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15t21.5 -21.5t18.5 -19q33 31 33 73 q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67zM911 383q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26l147 146q28 28 28 67q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5 q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73z" />
205
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M0 448q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z" />
206
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M115.5 -64.5q-34.5 63.5 21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399l503 -793q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5zM476 384h712l-272 429l-20 31v37v399h-128v-399v-37 l-20 -31z" />
207
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M1 157q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148q4 -48 -10 -97q4 -1 12 -5 l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56l-507 -398l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207zM168 176q-25 -66 21 -108q39 -36 113 -36q100 0 192 59q81 51 106 117t-21 108q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117zM168 976q25 -66 106 -117q92 -59 192 -59q74 0 113 36q46 42 21 108t-106 117q-92 59 -192 59 q-74 0 -113 -36q-46 -42 -21 -108zM672 448l9 -8q2 -2 7 -6q4 -4 11 -12t11 -12l26 -26l160 96l96 -32l736 576l-128 64l-768 -431v-113zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 576q0 26 19 45t45 19t45 -19 t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1018 391l582 -327l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
208
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M0 224v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68zM128 256h512v256q0 40 20 88t48 76l316 316v416h-384 v-416q0 -40 -28 -68t-68 -28h-416v-640zM213 1024h299v299zM768 -128h896v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640zM853 640h299v299z" />
209
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M4 1023q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581 q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776 q-113 115 -113 271z" />
210
+<glyph unicode="&#xf0c7;" d="M0 -32v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 0h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20 t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280zM384 0h768v384h-768v-384zM640 928q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320z" />
211
+<glyph unicode="&#xf0c8;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5z" />
212
+<glyph unicode="&#xf0c9;" d="M0 64v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 576v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 1088v128q0 26 19 45t45 19h1408 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
213
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M0 128q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 640q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 1152q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM512 32v192 q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z M512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
214
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M15 438q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105v-159h-362q-6 36 -6 54zM19 -190 l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66zM34 1400l136 127h106v-404h108v-99 h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54zM512 32v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
215
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M0 544v64q0 14 9 23t23 9h1728q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23zM384 972q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6l-14 2q-50 149 -103 205 q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743q-28 35 -51 80q-48 97 -48 188zM414 154q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22 q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156z" />
216
+<glyph unicode="&#xf0cd;" d="M0 -32v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-1472q-14 0 -23 -9t-9 -23zM0 1405q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5 t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2 q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195 q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39q-37 2 -45 4z" />
217
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M0 160v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 544q0 -14 9 -23t23 -9h320 q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192zM640 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23 v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192z" />
218
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M27 160q0 27 18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45t-18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45zM128 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM320 1216l196 60l60 196l60 -196l196 -60l-196 -60 l-60 -196l-60 196zM768 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM1083 1062l107 -107l293 293l-107 107zM1408 768l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98z" />
219
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M64 192q0 26 19 45t45 19v320q0 8 -0.5 35t0 38t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45v-1024q0 -15 -4 -26.5t-13.5 -18.5t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5 q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM384 128q0 -52 38 -90t90 -38 t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90zM1280 128q0 -52 38 -90t90 -38t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90z" />
220
+<glyph unicode="&#xf0d2;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63 q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5 q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423z" />
221
+<glyph unicode="&#xf0d3;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5 q-104 0 -194.5 -28.5t-153 -76.5t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118 q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5z" />
222
+<glyph unicode="&#xf0d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM276 309q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117 q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94 q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95zM395 338q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78z M462 969q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5t-57.5 96.5t-17.5 106zM960 672h128v-160h64v160h128v64h-128v128h-64v-128h-128v-64z" />
223
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M32 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65 t-59.5 -61.5t-24.5 -66q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131zM218 228q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5q58 0 111.5 13t99 39t73 73 t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5zM324 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q38 0 78 16.5t66 43.5q53 57 53 159 q0 58 -17 125t-48.5 129.5t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160zM1084 731v108h212v217h105v-217h213v-108h-213v-219h-105v219h-212z" />
224
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M0 64v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45zM128 384q106 0 181 -75t75 -181h1152q0 106 75 181t181 75v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512zM640 640q0 70 21 142 t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142t-21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142zM762 791l77 -80q42 37 55 57h2v-288h-128v-96h384v96h-128v448h-114z" />
225
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M0 832q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
226
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M0 320q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
227
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M64 640q0 26 19 45l448 448q19 19 45 19t45 -19t19 -45v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45z" />
228
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M0 192v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45z" />
229
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M0 32v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h608v1152h-640v-1120zM896 0h608q13 0 22.5 9.5t9.5 22.5v1120h-640v-1152z" />
230
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45zM0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
231
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
232
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
233
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M0 32v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 1098q0 78 41.5 130t118.5 52h1472 q65 0 112.5 -47t47.5 -113q0 -79 -49 -151t-122 -123q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5z" />
234
+<glyph unicode="&#xf0e1;" d="M0 1217q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122zM19 -80v991h330v-991h-330zM531 -80q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5v-568 h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329z" />
235
+<glyph unicode="&#xf0e2;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45z" />
236
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M40 736q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18 q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5 q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5 t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68z" />
237
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M0 384q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29q-141 221 -141 483zM128 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M320 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM710 241q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91l101 382q6 26 -7.5 48.5t-38.5 29.5t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5 t-63 -98.5zM768 1024q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1216 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 384q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
238
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M0 640q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5 t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281zM128 640q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5t-381.5 -69.5 t-282 -187.5t-104.5 -255z" />
239
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM128 768q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52t-286 -52t-211.5 -141t-78.5 -191zM616 132 q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22 t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
240
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M1 551l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39z" />
241
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M0 -32v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
242
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M0 681q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17 q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5z M384 128q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180zM768 1310v98q0 26 19 45t45 19t45 -19t19 -45v-98q-42 2 -64 2t-64 -2z" />
243
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M0 96v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88v-672q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68zM256 1312q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5v64 q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64zM768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1280 640h299l-299 299v-299z" />
244
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M0 960q0 99 44.5 184.5t117 142t164 89t186.5 32.5t186.5 -32.5t164 -89t117 -142t44.5 -184.5q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47q0 -46 -31.5 -71t-77.5 -25 q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268zM128 960q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228 q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134zM480 1088q0 13 9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5 q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5z" />
245
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M0 256q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22zM0 800v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23 t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5z" />
246
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 608q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5z" />
247
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 672q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24z" />
248
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M0 131q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89 q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5 t81 -103t47.5 -132.5t24 -138t5.5 -131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190zM256 192q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5z" />
249
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M0 768v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48 q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5 t-131.5 271.5v132q-164 20 -274 128t-110 252zM1152 832q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
250
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h64v-1280h-64q-92 0 -158 66t-66 158zM384 -128v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128v-1280h-1024zM640 1152h512v128h-512v-128zM1504 -128v1280h64q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-64z " />
251
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
252
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM256 480v736q0 26 19 45t45 19h1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158zM1408 704h64q80 0 136 56t56 136 t-56 136t-136 56h-64v-384z" />
253
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M0 832v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128 q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111zM768 416v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
254
+<glyph unicode="&#xf0f6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM384 160v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64 q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 416v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 672v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
255
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1536h-1152v-1536zM256 160v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 928v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 1184v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
256
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M0 -192v1280q0 26 19 45t45 19h320v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1152h-256 v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152zM256 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1056q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128 v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
257
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M64 192q0 26 19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128 q-26 0 -45 19t-19 45zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM384 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 800q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192 q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM1280 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
258
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h32v-1280h-32q-92 0 -158 66t-66 158zM352 -128v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160v-1280h-1088zM512 416q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192 q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM640 1152h512v128h-512v-128zM1536 -128v1280h32q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-32z" />
259
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M0 512v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5 t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8z" />
260
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M64 1152l32 128h480l32 128h960l32 -192l-64 -32v-800l128 -192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320zM384 768q0 -53 37.5 -90.5t90.5 -37.5h128v384h-256v-256z" />
261
+<glyph unicode="&#xf0fd;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 192q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896z" />
262
+<glyph unicode="&#xf0fe;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128z" />
263
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM429 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23 l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
264
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM397 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10 l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
265
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M77 224q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM77 608q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23 l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
266
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M77 672q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM77 1056q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10 l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
267
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
268
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
269
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M77 352q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
270
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M77 800q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
271
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M0 288v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113zM128 544q0 -13 9.5 -22.5 t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832z" />
272
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M0 96v96h160h1600h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68zM256 416v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113zM384 416q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5 t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM864 112q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16z" />
273
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M0 160v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-832q-66 0 -113 47t-47 113zM128 288q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM512 128 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
274
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M0 128v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM96 288q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM288 1136 q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16zM304 128q0 -33 23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5z" />
275
+<glyph unicode="&#xf10c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273z" />
276
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M0 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z M896 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z" />
277
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M0 832v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136zM896 832v384 q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136z" />
278
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M0 640q0 66 47 113t113 47t113 -47t47 -113t-47 -113t-113 -47t-113 47t-47 113zM176 1088q0 73 51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5t-51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5zM208 192q0 60 42 102t102 42q59 0 101.5 -42t42.5 -102t-42.5 -102 t-101.5 -42q-60 0 -102 42t-42 102zM608 1280q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM672 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1136 192q0 46 33 79t79 33t79 -33t33 -79 t-33 -79t-79 -33t-79 33t-33 79zM1168 1088q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1344 640q0 40 28 68t68 28t68 -28t28 -68t-28 -68t-68 -28t-68 28t-28 68z" />
279
+<glyph unicode="&#xf111;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" />
280
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101 t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19l-512 512q-19 19 -19 45z" />
281
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M0 496q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218q0 -87 -27 -168q136 -160 136 -398q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86t-170 -47.5t-171.5 -22t-167 -4.5 q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331zM224 320q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11 q-152 21 -195 21q-118 0 -187 -84t-69 -204zM384 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82zM1024 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34 t-43 76t-12.5 82z" />
282
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158zM128 224q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64 q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960z" />
283
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158zM128 331l256 315q44 53 116 87.5 t140 34.5h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-853zM171 163q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40z " />
284
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
285
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
286
+<glyph unicode="&#xf118;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 461q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38 q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5q-37 -121 -138 -195t-228 -74t-228 74t-138 195zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
287
+<glyph unicode="&#xf119;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 307q37 121 138 195t228 74t228 -74t138 -195q8 -25 -4 -48.5 t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
288
+<glyph unicode="&#xf11a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 448q0 26 19 45t45 19h640q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
289
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M0 512q0 212 150 362t362 150h896q212 0 362 -150t150 -362t-150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150t-150 362zM192 448q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23v128 q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128zM1152 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 640q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
290
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M0 128v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5zM128 128h1664v896h-1664v-896zM256 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM256 528v96 q0 16 16 16h224q16 0 16 -16v-96q0 -16 -16 -16h-224q-16 0 -16 16zM256 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM512 272v96q0 16 16 16h864q16 0 16 -16v-96q0 -16 -16 -16h-864q-16 0 -16 16zM512 784v96q0 16 16 16h96q16 0 16 -16v-96 q0 -16 -16 -16h-96q-16 0 -16 16zM640 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM768 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM896 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z M1024 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1152 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1280 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1408 528v96q0 16 16 16h112v240 q0 16 16 16h96q16 0 16 -16v-352q0 -16 -16 -16h-224q-16 0 -16 16zM1536 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z" />
291
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599z" />
292
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q205 96 384 110v192q-181 -16 -384 -117v-185zM448 836q215 111 384 118v197q-172 -8 -384 -126v-189zM832 730h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15 t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2q-23 0 -49 -3v-222zM1280 828q148 -42 384 90v189q-169 -91 -306 -91q-45 0 -78 8v-196z" />
293
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM640 32v64q0 14 9 23t23 9h960q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-960 q-14 0 -23 9t-9 23z" />
294
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM712 -52l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5 l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5zM1293 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
295
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45l397 -397v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45zM384 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221 q169 -173 169 -509q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45z" />
296
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M2 900.5q9 27.5 54 34.5l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5z M832 310l59 -31l318 -168l-60 355l-12 66l49 47l257 250l-356 52l-66 10l-30 60l-159 322v-963z" />
297
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M2 561q-5 22 4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5z" />
298
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M0 928v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864 q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23zM512 301l595 595h-595v-595zM557 256h595v595z" />
299
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M0 64q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136 q0 -52 -26 -96.5t-70 -69.5q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136zM96 64q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM96 1216q0 -40 28 -68 t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM736 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
300
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M0 448q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23zM16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56l-239 -18l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68 l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204zM128 32q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23zM544 -96v320q0 14 9 23t23 9t23 -9t9 -23v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23zM633 364 l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56zM1056 1184v320q0 14 9 23t23 9t23 -9t9 -23v-320 q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1216 1120q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23zM1280 960q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
301
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M96.5 986q-2.5 15 5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5t-10.5 37.5v45q0 83 65 156.5 t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25zM384 40v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28z" />
302
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M0 64v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM128 1152v192q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-192 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
303
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M98 1344q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45zM128 64v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
304
+<glyph unicode="&#xf12b;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1013 713q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80h126v-206h-514l-3 27q-4 28 -4 46z " />
305
+<glyph unicode="&#xf12c;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1015 -183q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126v-206h-514l-4 27q-3 45 -3 46z" />
306
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M1.5 146.5q5.5 37.5 30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5zM128 128h768l336 384h-768z" />
307
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M0 0v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5 q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124 q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89 q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1z" />
308
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M0 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45 t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5zM256 704v512q0 132 94 226t226 94t226 -94t94 -226v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226z" />
309
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M13 64q0 13 10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23t-10 -23l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5 t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23zM128 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113l-101 -101 q-42 103 -42 214zM384 704v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
310
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M0 576v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150t-33.5 170.5zM640 79 q119 63 213 137q235 184 235 360v640h-448v-1137z" />
311
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h1408v1024h-1408v-1024z M384 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288zM1152 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288z" />
312
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M3.5 940q-8.5 25 3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96 q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37 zM384 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
313
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M36 464l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85 q-3 -1 -9 -1q-14 0 -23 9l-64 64q-17 19 -5 39zM1248 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
314
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M0 0l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334z" />
315
+<glyph unicode="&#xf137;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM346 640q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l102 102q19 19 19 45t-19 45l-307 307l307 307 q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
316
+<glyph unicode="&#xf138;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM506 288q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-454 454 q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45z" />
317
+<glyph unicode="&#xf139;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 544q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19l102 102 q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
318
+<glyph unicode="&#xf13a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 736q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-102 102 q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
319
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M0 1408h1408l-128 -1438l-578 -162l-574 162zM262 1114l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674l16 175h-884z" />
320
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M12 75l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208l59 297h1505l-266 -1333l-804 -267z" />
321
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M0 0v352q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5 l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30zM832 1280q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
322
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181v-320h736q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28 t-28 68z" />
323
+<glyph unicode="&#xf140;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM256 640q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM384 640q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
324
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM512 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM1024 608v192q0 40 28 68t68 28h192 q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
325
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M0 96v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h192q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
326
+<glyph unicode="&#xf143;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M256 575q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10t9 24q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128zM256 959q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128 q13 0 23 10q11 9 9 23q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128z" />
327
+<glyph unicode="&#xf144;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 320q0 -37 32 -56q16 -8 32 -8q17 0 32 9l544 320q32 18 32 55t-32 55l-544 320q-31 19 -64 1 q-32 -19 -32 -56v-640z" />
328
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M54 448.5q0 53.5 37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136t-136 56t-136 -56l-125 126q-37 37 -37 90.5z M342 512q0 -26 19 -45l362 -362q18 -18 45 -18t45 18l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45zM452 512l572 572l316 -316l-572 -572z" />
329
+<glyph unicode="&#xf146;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h896q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128 z" />
330
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
331
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M3 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18z" />
332
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M3 1261q9 19 29 19h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34z" />
333
+<glyph unicode="&#xf14a;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 640q0 -26 19 -45l358 -358q19 -19 45 -19t45 19l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19 t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
334
+<glyph unicode="&#xf14b;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 128h288l544 544l-288 288l-544 -544v-288zM352 320v56l52 52l152 -152l-52 -52h-56v96h-96zM494 494 q-14 13 3 30l291 291q17 17 30 3q14 -13 -3 -30l-291 -291q-17 -17 -30 -3zM864 1024l288 -288l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28z" />
335
+<glyph unicode="&#xf14c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM282 320q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59 v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45z" />
336
+<glyph unicode="&#xf14d;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 448q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5t224 23.5v-160 q0 -42 40 -59q12 -5 24 -5q26 0 45 19l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5z" />
337
+<glyph unicode="&#xf14e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 241v542l512 256v-542zM640 448l256 128l-256 128v-256z" />
338
+<glyph unicode="&#xf150;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 861q17 35 57 35h640q40 0 57 -35q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66z" />
339
+<glyph unicode="&#xf151;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 419q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66q-17 -35 -57 -35h-640q-40 0 -57 35z" />
340
+<glyph unicode="&#xf152;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -14 9 -23t23 -9h960q14 0 23 9t9 23v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960z M512 320v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52t-27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57z" />
341
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M0 514v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5 t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5 l12 3l5 2q13 5 26 -2q12 -7 15 -21l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5z" />
342
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M0 32v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215 h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23z" />
343
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M52 171l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242 t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48 t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50t53 -63.5t31.5 -76.5t13 -94q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5 t-17.5 18q-17 21 -2 41z" />
344
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M0 605v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171 q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22z" />
345
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M4 1360q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103 q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214z" />
346
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M0 256v128q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315t-126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9 h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23zM487 747h320q106 0 171 62t65 162t-65 162t-171 62h-320v-448z" />
347
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M0 672v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111 q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23z M373 896l32 -128h225l35 128h-292zM436 640l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5l81 299h-159zM822 768h139l-35 128h-70zM1118 896l34 -128h230l33 128h-297zM1187 640l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3l78 300h-162z" />
348
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M56 0l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89 t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200zM522 182q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30t24.5 40t9.5 51q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1 t-47.5 -1v-338zM522 674q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307z" />
349
+<glyph unicode="&#xf15b;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
350
+<glyph unicode="&#xf15c;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM384 160q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 416q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 672q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
351
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 768v106h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106 h-287zM988 -166l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121v-233h-584v90zM1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18 t-7.5 -29z" />
352
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 -150h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287 v106zM988 768v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248v119h121v-233h-584zM1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29 z" />
353
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23z" />
354
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h256q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
355
+<glyph unicode="&#xf162;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 261q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 1351l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17 v16h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 261q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
356
+<glyph unicode="&#xf163;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 1285q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 327l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16 h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 1285q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
357
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M0 64v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45zM128 192q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45zM480 64v641q0 25 18 43.5t43 20.5q24 2 76 59 t101 121q68 87 101 120q18 18 31 48t17.5 48.5t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135 q0 -86 -55 -149q15 -44 15 -76q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5z" />
358
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M0 448q0 -26 19 -45t45 -19h288q26 0 45 19t19 45v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640zM128 960q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM480 447v641q0 26 19 44.5t45 19.5q35 1 158 44 q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76q55 -61 55 -149q-1 -78 -57.5 -135t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39 t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121t-76 59q-25 2 -43 20.5t-18 43.5z" />
359
+<glyph unicode="&#xf166;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 366q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73 q20 84 20 260q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5q-20 -87 -20 -260zM300 551v70h232v-70h-80v-423h-74v423h-78zM396 1313l24 -69t23 -69q35 -103 46 -158v-201h74v201l90 296h-75l-51 -195l-53 195 h-78zM542 205v290h66v-270q0 -24 1 -26q1 -15 15 -15q20 0 42 31v280h67v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54zM654 936q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38q-21 -29 -21 -87v-130zM721 923 v156q0 52 32 52t32 -52v-156q0 -51 -32 -51t-32 51zM790 128v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67zM857 200q16 -16 33 -16q29 0 29 49v157q0 50 -29 50q-17 0 -33 -16v-224zM907 893q0 -37 6 -55 q11 -27 43 -27q36 0 77 45v-40h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293zM1037 247v129q0 59 20 86q29 38 80 38t78 -38q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68v-9q0 -29 -2 -43q-3 -22 -15 -40 q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86zM1103 355h66v34q0 51 -33 51t-33 -51v-34z" />
360
+<glyph unicode="&#xf167;" d="M27 260q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99q-26 112 -26 350zM138 509h105v-569h100v569h107v94h-312 v-94zM266 1536h106l71 -263l68 263h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187zM463 43q0 -49 8 -73q12 -37 58 -37q48 0 102 61v-54h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391zM614 1028v175q0 80 28 117q38 51 105 51 q69 0 106 -51q28 -37 28 -117v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51q-28 38 -28 118zM704 1011q0 -70 43 -70t43 70v210q0 69 -43 69t-43 -69v-210zM798 -60h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89 v-663zM887 36v301q22 22 45 22q39 0 39 -67v-211q0 -67 -39 -67q-23 0 -45 22zM955 971v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75zM1130 100q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54 q2 9 2 58v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51q-28 -37 -28 -116v-173zM1219 245v46q0 68 45 68t45 -68v-46h-90z" />
361
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M5 384q-10 17 0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45l164 -286q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17zM536 539q18 32 531 942q25 45 64 45h241q22 0 31 -15q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37 q-10 -15 -32 -15h-239q-42 0 -66 45z" />
362
+<glyph unicode="&#xf169;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM227 396q8 -13 24 -13h185q31 0 50 36l199 352q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29 l125 -216v-1l-196 -346q-9 -14 0 -28zM638 516q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1l409 723q8 16 0 28q-7 12 -24 12h-187q-30 0 -49 -35z" />
363
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M0 640q0 96 1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150t-1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58 t-69.5 123q-14 65 -21.5 147.5t-8.5 136.5t-1 150zM640 320q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54t-30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640z" />
364
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M64 558l338 271l494 -305l-342 -285zM64 1099l490 319l342 -285l-494 -304zM407 166v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284l147 96v-108l-490 -293v-1l-1 1l-1 -1v1zM896 524l494 305l338 -271l-489 -319zM896 1133l343 285l489 -319l-338 -270z" />
365
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M0 -255v736h121v-618h928v618h120v-701l-1 -35v-1h-1132l-35 1h-1zM221 -17v151l707 1v-151zM227 243l14 150l704 -65l-13 -150zM270 563l39 146l683 -183l-39 -146zM395 928l77 130l609 -360l-77 -130zM707 1303l125 86l398 -585l-124 -85zM1136 1510l149 26l121 -697 l-149 -26z" />
366
+<glyph unicode="&#xf16d;" d="M0 69v1142q0 81 58 139t139 58h1142q81 0 139 -58t58 -139v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139zM171 110q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62 q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648zM461 643q0 -124 90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5t-90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5zM1050 1003q0 -29 20 -49t49 -20h174q29 0 49 20t20 49v165q0 28 -20 48.5 t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165z" />
367
+<glyph unicode="&#xf16e;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM274 640q0 -88 62 -150t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150zM838 640q0 -88 62 -150 t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150z" />
368
+<glyph unicode="&#xf170;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM309 384h94l104 160h522l104 -160h94l-459 691zM567 608l201 306l201 -306h-402z" />
369
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M0 1222q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34 t-6 39.5t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158zM173 285l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18t-76.5 27 t-73 43.5t-52 61.5q-25 96 -57 292zM243 1240q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5q-20 27 -56 44.5t-58 22t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43zM481 657q4 -91 77.5 -155t165.5 -56q91 8 152 84 t50 168q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5zM599 710q14 41 52 58q36 18 72.5 12t64 -35.5t27.5 -67.5q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82z" />
370
+<glyph unicode="&#xf172;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM260 1060q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63 q24 13 39.5 23t31 29t19.5 40q48 267 80 473q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54zM385 384q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71q0 7 5.5 26.5t3 32 t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6zM436 1073q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5t-52.5 16t-54.5 32.5zM607 653q-2 49 25.5 93t72.5 64 q70 31 141.5 -10t81.5 -118q8 -66 -36 -121t-110 -61t-119 40t-56 113zM687.5 660.5q0.5 -52.5 43.5 -70.5q39 -23 81 4t36 72q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5z" />
371
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M78 779v217q91 30 155 84q64 55 103 132q39 78 54 196h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170z" />
372
+<glyph unicode="&#xf174;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM413 744h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49v181 q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163z" />
373
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M3 237q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19t-5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35z" />
374
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M3 1043q-8 19 5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19z" />
375
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M64 637q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23z" />
376
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M0 544v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23z" />
377
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M0 634q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32 q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503zM683 1131q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17z" />
378
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M0 -27v557h682v-651zM0 614v565l682 94v-659h-682zM757 -131v661h907v-786zM757 614v669l907 125v-794h-907z" />
379
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M0 337v430q0 42 30 72t73 30q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30t-73 30t-30 73zM241 886q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20l-71 -131q107 -55 171 -153.5t64 -215.5 h-925zM245 184v666h918v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78zM455 1092q0 -16 11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27.5 t-27.5 11.5t-27 -11.5t-11 -27.5zM876 1092q0 -16 11.5 -27.5t27.5 -11.5t27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5zM1203 337v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73z" />
380
+<glyph unicode="&#xf17c;" d="M11 -115q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5 t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195q-12 112 -16 310q-2 90 24 151.5 t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5 t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13 t16.5 -9.5q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5 q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5zM321 495q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54 t7 -70.5q46 24 7 92q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5 t60 -22.5q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18zM372 630q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12zM603 1190q2 -5 5 -6 q10 0 7 -15q-3 -20 8 -20q3 0 3 3q3 17 -2.5 30t-11.5 15q-9 2 -9 -7zM634 1110q0 12 19 15h10q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5zM721 1122q24 11 32 -2q3 -6 -3 -9q-4 -1 -11.5 6.5t-17.5 4.5zM835 1196l4 -2q14 -4 18 -31q0 -3 8 2l2 3q0 11 -5 19.5t-11 12.5 t-9 3q-14 -1 -7 -7zM851 1381.5q-1 -2.5 3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9zM981 1002q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20q-2 8 -6.5 11.5t-13 5 t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5z" />
381
+<glyph unicode="&#xf17d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM112 640q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81t99.5 48l37 13 q4 1 13 3.5t13 4.5q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21zM126 775q302 0 606 80q-120 213 -244 378q-138 -65 -234 -186t-128 -272zM350 134q184 -150 418 -150q132 0 256 52q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5 t-103 -148zM609 1276q1 1 2 1q-1 0 -2 -1zM613 1277q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5l12.5 17.5q-185 164 -433 164q-76 0 -155 -19zM909 797q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5 t36.5 -6t25 -4.5l10 -2q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5zM1007 565q87 -239 128 -469q111 75 185 189.5t96 250.5q-210 60 -409 29z" />
382
+<glyph unicode="&#xf17e;" d="M0 1024q0 159 112.5 271.5t271.5 112.5q130 0 234 -80q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225 t-55.5 273.5q0 73 16 150q-80 104 -80 234zM376 399q0 -92 122 -157.5t291 -65.5q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12 t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5 q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75z" />
383
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M0 640q0 75 53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41l619 619l2 -3q53 -53 53 -128t-53 -128l-587 -587 q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128zM302 660q0 21 14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36z" />
384
+<glyph unicode="&#xf181;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM160 192q0 -14 9 -23t23 -9h480q14 0 23 9t9 23v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024zM832 576q0 -14 9 -23t23 -9h480q14 0 23 9t9 23 v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640z" />
385
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M0 480q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192 q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43q-40 0 -68 28t-28 68zM416 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
386
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M0 416v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68z M288 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
387
+<glyph unicode="&#xf184;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM399.5 766q8.5 -37 24.5 -59l349 -473l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5 t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85z" />
388
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M44 363q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29q-4 -15 -20 -20 l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20zM320 640q0 -117 45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5 t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5z" />
389
+<glyph unicode="&#xf186;" d="M0 640q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384z" />
390
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M64 1088v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM128 -64v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM704 704q0 -26 19 -45t45 -19h256 q26 0 45 19t19 45t-19 45t-45 19h-256q-26 0 -45 -19t-19 -45z" />
391
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M32 576q0 26 19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19t19 -45t-19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19 t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45z M512 1152q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5h-640z" />
392
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M-1 1004q0 11 3 16l4 6q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24 q17 19 38 30q53 26 239 24q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5 t13 3t20 0.5l288 2q39 5 64 -2.5t31 -16.5l6 -10q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12 q-30 21 -70 64t-68.5 77.5t-61 58t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211 t-130.5 272q-6 16 -6 27z" />
393
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M0 391q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5q0 -68 -37 -139.5 t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5zM181 320q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5zM413.5 230.5 q-40.5 92.5 6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5q-45 -102 -158 -150t-224 -12q-107 34 -147.5 126.5zM495 257.5q9 -34.5 43 -50.5t74.5 -2.5t62.5 47.5q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5zM705 399 q-17 -31 13 -45q14 -5 29 0.5t22 18.5q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5zM1165 1274q-6 28 9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158 q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5zM1224 1047q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5t54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37z" />
394
+<glyph unicode="&#xf18b;" d="M0 638q0 187 83.5 349.5t229.5 269.5t325 137v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495zM398 -34q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211q-171 -94 -368 -94q-196 0 -367 94zM898 909v485q179 -30 325 -137t229.5 -269.5 t83.5 -349.5q0 -280 -181 -495q-204 99 -330.5 306.5t-126.5 459.5z" />
395
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M0 -211q0 19 13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23 t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89 t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283 q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32z" />
396
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M21 217v66h1238v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5zM21 354v255h1238v-255h-1238zM21 682v255h1238v-255h-1238zM21 1010v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5v-67h-1238z" />
397
+<glyph unicode="&#xf18e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 544v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5z" />
398
+<glyph unicode="&#xf190;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 640q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23z" />
399
+<glyph unicode="&#xf191;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM448 640q0 33 27 52l448 320q17 12 37 12q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52z" />
400
+<glyph unicode="&#xf192;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
401
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M0 320q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5zM416 1348q-2 16 6 42 q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455l198 99l58 -114l-256 -128q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5z" />
402
+<glyph unicode="&#xf194;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 806q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5 q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237q104 139 172.5 292.5t82.5 226.5q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143 q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7z" />
403
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M0 608v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31 l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26z" />
404
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23z" />
405
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M0 576q0 12 38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113q-110 -64 -268 -64h-128v64 h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5zM323 336h29q157 0 273 64h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96zM323 816l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5 t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64h-29zM1739 484l81 -30q68 48 68 122t-68 122l-81 -30q53 -36 53 -92t-53 -92z" />
406
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M0 796q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5 t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72 l-55 163l-153 -53q-29 -9 -50 -9q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5zM620 811l105 -313l310 105l-105 315z" />
407
+<glyph unicode="&#xf199;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 352q0 -40 28 -68t68 -28h832q40 0 68 28t28 68v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99 q-98 -69 -164 -69t-164 69q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436zM256 928q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13 t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68z" />
408
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM41 640q0 -173 68 -331.5t182.5 -273t273 -182.5t331.5 -68t331.5 68t273 182.5t182.5 273t68 331.5 t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5zM127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM254 1062q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5 q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21t14.5 -24t14 -23q63 -107 63 -212q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15 t-1.5 -18.5t9 -16.5t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5zM679 -97l230 670l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1282 -24l235 678q59 169 59 276q0 42 -6 79 q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5z" />
409
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M0 455q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360l272 133v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5zM1134 860v172q277 -33 481 -157l140 79l37 -390l-525 114l147 83 q-119 70 -280 99z" />
410
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M0 -128q0 26 20.5 45t48.5 19h1782q28 0 48.5 -19t20.5 -45v-128h-1920v128zM0 1024v128l960 384l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128zM128 0v64q0 26 20.5 45t48.5 19h59v768h256v-768h128v768h256v-768h128v768h256 v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664z" />
411
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M0 1024q0 23 22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31t-22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433 q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31zM512 384l18 316l574 -181q22 -7 48 -7t48 7l574 181l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128z" />
412
+<glyph unicode="&#xf19e;" d="M109 1536q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610l13 -707q-62 11 -105 11 q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287z" />
413
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M111 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5t-59.5 -93 t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131zM297 228q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13 t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5zM403 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5 q53 56 53 159q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160z" />
414
+<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M0 722q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58 q94 0 160 -66t66 -160q0 -62 -31 -114t-83 -82q5 -33 5 -61q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5zM77 722q0 -67 51 -111 q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM178 465q0 -101 59.5 -194t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5 t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5zM555 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM661 209.5q0 16.5 11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77q11 11 27 11t27 -11t11 -27.5t-11 -27.5 q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5zM1153 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM1555 1350q0 -45 32 -77t77 -32t77 32t32 77t-32 77t-77 32t-77 -32t-32 -77zM1672 843q131 -105 178 -238 q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28z" />
415
+<glyph unicode="&#xf1a2;" d="M0 193v894q0 133 94 227t226 94h896q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227zM155 709q0 -37 19.5 -67.5t52.5 -45.5q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54 q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43 q-51 0 -87 -36.5t-36 -87.5zM493 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM560 375q0 11 8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18z M882 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM1143 1120q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21q-29 0 -50 21t-21 50z" />
416
+<glyph unicode="&#xf1a3;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 502q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14 q19 0 32.5 -14t13.5 -33v-54l60 -28l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122zM806 500q0 -80 58 -137t139 -57t138.5 57t57.5 139v122h-150v-126q0 -20 -13.5 -33.5t-33.5 -13.5 q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123z" />
417
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M0 336v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58l-131 61v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5zM1062 332 v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275h328v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5z" />
418
+<glyph unicode="&#xf1a5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM64 640h704v-704h480q93 0 158.5 65.5t65.5 158.5v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480z " />
419
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M0 271v697h328v286h204v-983h-532zM205 435h123v369h-123v-369zM614 271h205v697h-205v-697zM614 1050h205v204h-205v-204zM901 26v163h328v82h-328v697h533v-942h-533zM1106 435h123v369h-123v-369zM1516 26v163h327v82h-327v697h532v-942h-532zM1720 435h123v369h-123 v-369z" />
420
+<glyph unicode="&#xf1a7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM293 388l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229t-88.5 229t-213.5 95q-74 0 -141 -36h-186v-840z M504 804v277q28 17 70 17q53 0 91 -45t38 -109t-38 -109.5t-91 -45.5q-43 0 -70 15zM636 -39l211 41v206q51 -19 117 -19q125 0 213 95t88 229t-88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101v-636zM847 377v277q28 17 70 17q53 0 91 -45.5t38 -109.5 t-38 -109t-91 -45q-43 0 -70 15z" />
421
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M41 455q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80 t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5l1 -21q75 3 143.5 -20.5 t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14q6 -5 28 -23.5t25.5 -22t19 -18 t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63 t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27zM764 676q10 1 32.5 7t34.5 6q19 0 35 -10l-96 -20zM822 568l48 12l109 -177l-73 -48zM859 884q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1 v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5 t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43zM1061 45h31l10 -83l-41 -12v95zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM1116 29 q21 2 60.5 8.5t72 10t60.5 3.5h14q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13t-54 -9.5t-53.5 -7.5t-32 -4.5zM1947 1528l1 3l2 4l-1 -5zM1950 1535v1v-1zM1950 1535l1 1z" />
422
+<glyph unicode="&#xf1a9;" d="M0 520q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5 t19.5 -177.5q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302zM333 256q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5zM685.5 -76q-0.5 -10 7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5 q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16zM852 31q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5 t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10q-29 -12 -78 -56q-26 -24 -12 -44z" />
423
+<glyph unicode="&#xf1aa;" d="M0 78q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160l151 -152l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5 t-60 145.5zM2 1202q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5t149.5 -87.5l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5 q-70 15 -115 71t-45 129zM446 803l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126t135.5 51q85 0 145 -60.5t60 -145.5q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152 l-160 -160zM776 793l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5q76 -11 126.5 -68.5t50.5 -134.5q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30 l-152 152z" />
424
+<glyph unicode="&#xf1ab;" d="M0 -16v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5q20 0 20 -21v-418l147 -47v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3zM39 15l694 232v1032l-694 -233v-1031zM147 293q6 4 82 92 q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8 t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110 q-4 -2 -19.5 -4t-18.5 0zM268 933l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41zM310 -116q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11q73 -37 159.5 -61.5t157.5 -24.5 q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5l-43 73l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16zM777 1294l573 -184v380zM885 453l102 -31l45 110l211 -65l37 -135l102 -31l-181 657l-100 31z M1071 630l76 185l63 -227z" />
425
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M0 -96v1088q0 66 47 113t113 47h128q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113zM512 -96v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-163q58 -34 93 -93t35 -128v-768q0 -106 -75 -181 t-181 -75h-864q-66 0 -113 47t-47 113zM640 896h896v256h-160q-40 0 -68 28t-28 68v160h-640v-512zM736 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM736 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9 h-128q-14 0 -23 -9t-9 -23v-128zM736 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 256q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23 v-128zM1248 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128z" />
426
+<glyph unicode="&#xf1ad;" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM256 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 1184q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 96v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23zM512 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM512 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 928q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM1024 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64z" />
427
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M64 1056q0 40 28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68zM416 1152q0 93 65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
428
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M0 724q0 80 42 139.5t119 59.5q76 0 141.5 -55.5t100.5 -134t35 -152.5q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152zM256 19q0 86 56 191.5t139.5 192.5t187.5 146t193 59q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45 t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146zM333 1163q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151zM884 1064 q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5q-61 0 -105 39t-63 92.5t-19 113.5zM1226 581q0 74 35 152.5t100.5 134t141.5 55.5q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5 q-77 0 -119 59t-42 139z" />
429
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M64 1008q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5z" />
430
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M0 256v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65zM134 1026l698 -254l698 254l-698 254zM896 -93l640 349v636l-640 -233v-752z" />
431
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M0 96v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70v-400l434 -186q36 -16 57 -48t21 -70v-416q0 -36 -19 -67t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4 l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67zM172 531l404 -173l404 173l-404 173zM640 -96l384 192v314l-384 -164v-342zM647 1219l441 -189l441 189l-441 189zM1152 651l384 165v266l-384 -164v-267zM1196 531l404 -173l404 173l-404 173zM1664 -96 l384 192v314l-384 -164v-342z" />
432
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M0 22v1260h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5 t45.5 113.5q0 144 -190 144h-260v-294zM1137 477q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658q0 -111 57.5 -171.5t166.5 -60.5q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347zM1337 1073h511v124 h-511v-124zM1388 576h408q-18 195 -200 195q-90 0 -146 -52.5t-62 -142.5z" />
433
+<glyph unicode="&#xf1b5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 254h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5t-56.5 60.5t-79 29.5 t-97 8.5h-371v-787zM301 388v217h189q124 0 124 -113q0 -104 -128 -104h-185zM301 723v184h163q119 0 119 -90q0 -94 -106 -94h-176zM838 538q0 -135 79 -217t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20q-68 0 -104 38t-36 107h411q1 10 1 30 q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216zM964 911v77h319v-77h-319zM996 600q4 56 39 89t91 33q113 0 124 -122h-254z" />
434
+<glyph unicode="&#xf1b6;" horiz-adv-x="2048" d="M0 764q0 86 61 146.5t146 60.5q73 0 130 -46t73 -117l783 -315q49 29 106 29q14 0 21 -1l173 248q1 114 82 194.5t195 80.5q115 0 196.5 -81t81.5 -196t-81.5 -196.5t-196.5 -81.5l-265 -194q-8 -80 -67.5 -133.5t-138.5 -53.5q-73 0 -130 46t-73 117l-783 315 q-51 -30 -106 -30q-85 0 -146 61t-61 147zM55 764q0 -64 44.5 -108.5t107.5 -44.5q11 0 33 4l-64 26q-33 14 -52.5 44.5t-19.5 66.5q0 50 35.5 85.5t85.5 35.5q20 0 41 -8v1l76 -31q-20 37 -56.5 59t-78.5 22q-63 0 -107.5 -44.5t-44.5 -107.5zM1164 244q19 -37 55.5 -59 t79.5 -22q63 0 107.5 44.5t44.5 107.5t-44.5 108t-107.5 45q-13 0 -33 -4q2 -1 20 -8t21.5 -8.5t18.5 -8.5t19 -10t16 -11t15.5 -13.5t11 -14.5t10 -18t5 -21t2.5 -25q0 -50 -35.5 -85.5t-85.5 -35.5q-14 0 -31.5 4.5t-29 9t-31.5 13.5t-28 12zM1584 767q0 -77 54.5 -131.5 t131.5 -54.5t132 54.5t55 131.5t-55 131.5t-132 54.5q-76 0 -131 -54.5t-55 -131.5zM1623 767q0 62 43.5 105.5t104.5 43.5t105 -44t44 -105t-43.5 -104.5t-105.5 -43.5q-61 0 -104.5 43.5t-43.5 104.5z" />
435
+<glyph unicode="&#xf1b7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 693q0 -53 38 -91t92 -38q36 0 66 18l489 -197q10 -44 45.5 -73t81.5 -29q50 0 86.5 34t41.5 83l167 122 q71 0 122 50.5t51 122.5t-51 123t-122 51q-72 0 -122.5 -50.5t-51.5 -121.5l-108 -155q-2 0 -6.5 0.5t-6.5 0.5q-35 0 -67 -19l-489 197q-10 44 -45.5 73t-80.5 29q-54 0 -92 -38t-38 -92zM162 693q0 40 28 68t68 28q27 0 49.5 -14t34.5 -37l-48 19q-29 11 -56.5 -2 t-38.5 -41q-12 -29 -0.5 -57t39.5 -40v-1l40 -16q-14 -2 -20 -2q-40 0 -68 27.5t-28 67.5zM855 369q5 -2 47 -19q29 -12 58 0.5t41 41.5q11 29 -1 57.5t-41 40.5l-40 16q14 2 21 2q39 0 67 -27.5t28 -67.5t-28 -67.5t-67 -27.5q-59 0 -85 51zM1118 695q0 48 34 82t83 34 q48 0 82 -34t34 -82t-34 -82t-82 -34q-49 0 -83 34t-34 82zM1142 696q0 -39 27.5 -66t65.5 -27t65.5 27t27.5 66q0 38 -27.5 65.5t-65.5 27.5t-65.5 -27.5t-27.5 -65.5z" />
436
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M16 970l433 -17l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188zM270.5 158q-3.5 28 4 65t12 55t21.5 64t19 53q78 -12 509 -28l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5 q-11 27 -14.5 55zM294 1124l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5t36 -39.5t32 -35q-47 -63 -265 -435l-317 187zM782 1524l405 -1q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190l142 83l-220 -373l-419 20l151 86q-34 89 -75 166 t-75.5 123.5t-64.5 80t-47 46.5zM953 197l211 362l7 -173q170 -16 283 -5t170 33l56 22l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164zM1218 847l313 195l19 11l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22 t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436z" />
437
+<glyph unicode="&#xf1b9;" horiz-adv-x="1984" d="M0 160v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h704q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-928v-128q0 -80 -56 -136 t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23zM160 448q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 768h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 448q0 -66 47 -113t113 -47t113 47t47 113 t-47 113t-113 47t-113 -47t-47 -113z" />
438
+<glyph unicode="&#xf1ba;" horiz-adv-x="1984" d="M0 32v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h64q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-64q0 -80 -56 -136t-136 -56 t-136 56t-56 136v64h-928v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23zM160 320q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 640h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 320 q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" />
439
+<glyph unicode="&#xf1bb;" d="M32 64q0 26 19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45t-19 -45t-45 -19 h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45z" />
440
+<glyph unicode="&#xf1bc;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM237 886q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37q159 0 309.5 -34t253.5 -95q21 -12 40 -12 q29 0 50.5 20.5t21.5 51.5q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5zM289 637q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5q0 40 -35 61 q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64zM321 406q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52z" />
441
+<glyph unicode="&#xf1bd;" d="M0 11v1258q0 58 40.5 98.5t98.5 40.5h1258q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5zM71 11q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258z M121 11v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5zM121 709v560q0 7 5.5 12.5 t12.5 5.5h1258q7 0 12.5 -5.5t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137zM246 413q-24 203 166 305l129 -270l-255 -61q-14 -3 -26 4.5t-14 21.5z" />
442
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M0 405l17 128q2 9 9 9t9 -9l20 -128l-20 -126q-2 -9 -9 -9t-9 9zM79 405l23 207q0 9 9 9q8 0 10 -9l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10zM169 405l21 245q2 12 12 12q11 0 11 -12l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11zM259 405l21 252q0 13 13 13 q12 0 14 -13l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13zM350 405l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5zM401 159zM442 405l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5l21 -380l-21 -246q0 -7 -5 -12.5 t-12 -5.5q-16 0 -18 18zM534 403l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19zM628 405l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5l18 -506l-18 -242q-2 -21 -22 -21q-19 0 -21 21zM723 405l14 -241 q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17zM784 164zM817 405l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18zM913 404l12 492q1 12 9 20t19 8t18.5 -8 t8.5 -20l14 -492l-14 -236q0 -11 -8 -19t-19 -8t-19 8t-9 19zM1010 405q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11q11 0 20 9q9 7 9 20l1 24l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6zM1079 169zM1103 404l12 636v3q2 15 12 24q9 7 20 7 q8 0 15 -5q14 -8 16 -26l14 -639l-14 -231q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114zM1204 174v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22z" />
443
+<glyph unicode="&#xf1c0;" d="M0 0v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 384v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 768 v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 1152v128q0 69 103 128t280 93.5t385 34.5t385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128z" />
444
+<glyph unicode="&#xf1c1;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM257 60q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4 q52 85 107 197q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38 q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83z M714 842q1 7 7 44q0 3 7 43q1 4 4 8q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2q-15 -42 -2 -132zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1098 353q76 -28 124 -28q14 0 18 1q0 1 -2 3q-24 24 -140 24z" />
445
+<glyph unicode="&#xf1c2;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM233 661h70l164 -661h159l128 485q7 20 10 46q2 16 2 24 h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300v-107zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
446
+<glyph unicode="&#xf1c3;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM429 0h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4 h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107h-290v-107h68l189 -272l-194 -283h-68v-106zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
447
+<glyph unicode="&#xf1c4;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM416 0h327v106h-93v167h137q76 0 118 15q67 23 106.5 87 t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92v-106zM650 386v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15h-119zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
448
+<glyph unicode="&#xf1c5;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 0v192l192 192l128 -128l384 384l320 -320v-320 h-1024zM256 704q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
449
+<glyph unicode="&#xf1c6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536zM384 192q0 25 8 52q21 63 120 396 v128h128v-128h79q22 0 39 -13t23 -34l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5zM512 192q0 -26 37.5 -45t90.5 -19t90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45zM512 896h128v128h-128v-128zM512 1152h128v128h-128v-128 zM640 768h128v128h-128v-128zM640 1024h128v128h-128v-128zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
450
+<glyph unicode="&#xf1c7;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 288v192q0 14 9 23t23 9h131l166 167q16 15 35 7 q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23zM762 206.5q1 -26.5 20 -44.5q20 -17 44 -17q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5z M973.5 54.5q2.5 -26.5 23.5 -42.5q18 -15 40 -15q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
451
+<glyph unicode="&#xf1c8;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 256v384q0 52 38 90t90 38h384q52 0 90 -38t38 -90 v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90zM960 403v90l265 266q9 9 23 9q4 0 12 -2q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
452
+<glyph unicode="&#xf1c9;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM254 429q-14 19 0 38l226 301q8 11 21 12.5t24 -6.5 l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5zM636 43l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5l-63 10q-13 2 -20.5 13t-5.5 24zM947.5 181 q-1.5 13 6.5 24l182 243l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5l226 -301q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
453
+<glyph unicode="&#xf1ca;" d="M39 1286h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132 t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390z" />
454
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M0 367v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64v-546q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64zM154 511l193 129l-193 129v-258zM216 367l603 -402v359l-334 223zM216 913l269 -180l334 223v359zM624 640 l272 -182l272 182l-272 182zM973 -35l603 402l-269 180l-334 -223v-359zM973 956l334 -223l269 180l-603 402v-359zM1445 640l193 -129v258z" />
455
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M0 407q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5 h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55t121.5 -21 q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z " />
456
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM128 640q0 -190 90 -361l194 194q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361zM512 640 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM535 -38q171 -90 361 -90t361 90l-194 194q-82 -28 -167 -28t-167 28zM535 1318l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90t-361 -90z M1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
457
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M0 640q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348z" />
458
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
459
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM44 640q0 -173 67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331 t-67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331zM87 640q0 205 98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385zM206 217l58 34q29 -49 73 -99 l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13v-66q-208 6 -385 109.5t-283 275.5zM207 1063q106 172 282 275.5t385 109.5v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98zM415 805q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10 t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162q-67 77 -98 169l232 80q-14 42 -14 85t14 85zM918 -102 q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99l58 -34q-106 -172 -283 -275.5t-385 -109.5v66zM918 1382v66q209 -6 385 -109.5t282 -275.5l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13zM1516 428q36 103 36 212q0 112 -35 212l82 28 q-19 56 -49 112l57 33q98 -180 98 -385t-98 -385l-57 33q27 52 49 112z" />
460
+<glyph unicode="&#xf1d2;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 218q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5 t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85q0 -53 41 -77v-3q-113 -37 -113 -139zM382 225q0 64 98 64q102 0 102 -61q0 -66 -93 -66 q-107 0 -107 63zM395 693q0 90 77 90q36 0 55 -25.5t19 -63.5q0 -85 -74 -85q-77 0 -77 84zM755 1072q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392q0 -50 -3 -75z M966 771q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117z" />
461
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M68 7q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47q98 0 218 47v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58q0 -31 22.5 -51.5t58 -32 t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5zM272 18q0 -101 172 -101q151 0 151 105q0 100 -165 100q-158 0 -158 -104zM293 775q0 -135 124 -135q119 0 119 137q0 61 -30 102t-89 41 q-124 0 -124 -145zM875 1389q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5t-39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5zM901 220q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134h-222zM1217 901v190h96v76q0 54 -6 89h227q-6 -41 -6 -165 h171v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6z" />
462
+<glyph unicode="&#xf1d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM368 1135l323 -589v-435h134v436l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3 q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150z" />
463
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M57 953q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5t-78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153 t-153 102t-186 38t-186 -38t-153 -102t-102 -153t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265zM113.5 38.5q10.5 121.5 29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5t136.5 -56.5 t56.5 -136.5t-57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5z" />
464
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M18 264q0 275 252 466q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5 t3.5 -5t2 -3.5q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9 t-98 20t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20 q-18 -41 -54.5 -74.5t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100z" />
465
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M0 858q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490z M380 1075q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5t-25 66t-66 25q-43 0 -76 -25.5t-33 -65.5zM816 404q0 143 81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109q-150 -37 -218 -37 q-169 0 -311 70.5t-223.5 191.5t-81.5 264zM888 1075q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5t-24.5 66t-65.5 25q-43 0 -76 -25.5t-33 -65.5zM1160 568q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5 t-22.5 -49.5zM1559 568q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5z" />
466
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M0 508q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55z" />
467
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M0 508q-3 39 32 59l1664 960q35 21 68 -2q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55zM209 522l336 -137l863 639l-478 -797l492 -201 l221 1323z" />
468
+<glyph unicode="&#xf1da;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45zM512 480v64q0 14 9 23t23 9h224v352 q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
469
+<glyph unicode="&#xf1db;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5z" />
470
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M62 1338q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5 t45 -15t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18 q-15 10 -45 12t-53 2t-41 14t-18 45z" />
471
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M24 926q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108 q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179q-64 117 -64 259z" />
472
+<glyph unicode="&#xf1de;" d="M0 736v64q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM128 -96v672h256v-672q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM128 960v416q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-416h-256zM512 224v64q0 40 28 68 t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 64h256v-160q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v160zM640 448v928q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-928h-256zM1024 992v64q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1152 -96v928h256v-928q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 1216v160q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-160h-256z" />
473
+<glyph unicode="&#xf1e0;" d="M0 640q0 133 93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86q133 0 226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5z" />
474
+<glyph unicode="&#xf1e1;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 640q0 -88 62.5 -150.5t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5 t150.5 62.5t62.5 150.5t-62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5z" />
475
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M0 448q0 143 55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68l243 244l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5 t-225 150t-150 225t-55.5 273.5zM170 615q10 -24 35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49t-34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49zM1376 1472q0 13 9 23q10 9 23 9t23 -9l90 -91q10 -9 10 -22.5t-10 -22.5 q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23zM1536 1408v96q0 14 9 23t23 9t23 -9t9 -23v-96q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1605 1242.5q0 13.5 10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5z M1605 1381.5q0 13.5 10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5zM1632 1312q0 14 9 23t23 9h96q14 0 23 -9t9 -23t-9 -23t-23 -9h-96q-14 0 -23 9t-9 23z" />
476
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" />
477
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" />
478
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" />
479
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" />
480
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" />
481
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" />
482
+<glyph unicode="&#xf1e9;" horiz-adv-x="1792" />
483
+<glyph unicode="&#xf1ea;" horiz-adv-x="1792" />
484
+<glyph unicode="&#xf1eb;" horiz-adv-x="1792" />
485
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" />
486
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" />
487
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" />
488
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
489
+<glyph horiz-adv-x="1792" />
490
+<glyph horiz-adv-x="1792" />
491
+<glyph horiz-adv-x="1792" />
492
+<glyph horiz-adv-x="1792" />
493
+<glyph horiz-adv-x="1792" />
494
+<glyph horiz-adv-x="1792" />
495
+<glyph horiz-adv-x="1792" />
496
+<glyph horiz-adv-x="1792" />
497
+<glyph horiz-adv-x="1792" />
498
+<glyph horiz-adv-x="1792" />
499
+<glyph horiz-adv-x="1792" />
500
+<glyph horiz-adv-x="1792" />
501
+<glyph horiz-adv-x="1792" />
502
+<glyph horiz-adv-x="1792" />
503
+</font>
504
+</defs></svg> 

BIN
pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf View File


BIN
pod/pod/public/css/external/font-awesome-4.1.0/fonts/fontawesome-webfont.woff View File


+ 1 - 0
pod/pod/public/css/external/google-code-prettify/prettify.css View File

@@ -0,0 +1 @@
1
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

+ 418 - 0
pod/pod/public/css/glyphicons.css View File

@@ -0,0 +1,418 @@
1
+[class^="icon-g-"], 
2
+[class*=" icon-g-"] {
3
+    background-image: url("../img/glyphicons.png");
4
+}
5
+
6
+[class^="icon-g-grey"], 
7
+[class*=" icon-g-grey"] {
8
+    background-image: url("../img/glyphicons-grey.png");
9
+}
10
+
11
+[class^="icon-g-white"], 
12
+[class*=" icon-g-white"] {
13
+    background-image: url("../img/glyphicons-white.png");
14
+}
15
+
16
+.icon-g-white{}
17
+
18
+
19
+.icon-g-glass { background-position: 0 0 }
20
+.icon-g-leaf { background-position: -34px 0 }
21
+.icon-g-dog { background-position: -68px 0 }
22
+.icon-g-user { background-position: -102px 0 }
23
+.icon-g-girl { background-position: -136px 0 }
24
+.icon-g-car { background-position: -170px 0 }
25
+.icon-g-user-add { background-position: -204px 0 }
26
+.icon-g-user-remove { background-position: -238px 0 }
27
+.icon-g-film { background-position: -272px 0 }
28
+.icon-g-magic { background-position: -306px 0 }
29
+.icon-g-envelope { background-position: -340px 0 }
30
+.icon-g-camera { background-position: -374px 0 }
31
+.icon-g-heart { background-position: -408px 0 }
32
+.icon-g-beach-umbrella { background-position: -442px 0 }
33
+.icon-g-train { background-position: -476px 0 }
34
+.icon-g-print { background-position: -510px 0 }
35
+.icon-g-bin { background-position: -544px 0 }
36
+.icon-g-music { background-position: -578px 0 }
37
+.icon-g-note { background-position: -612px 0 }
38
+.icon-g-cogwheel { background-position: -646px 0 }
39
+.icon-g-home { background-position: -680px 0 }
40
+.icon-g-snowflake { background-position: -714px 0 }
41
+.icon-g-fire { background-position: -748px 0 }
42
+.icon-g-cogwheels { background-position: -782px 0 }
43
+.icon-g-parents { background-position: -816px 0 }
44
+.icon-g-binoculars { background-position: -850px 0 }
45
+.icon-g-road { background-position: -884px 0 }
46
+.icon-g-search { background-position: -918px 0 }
47
+.icon-g-cars { background-position: -952px 0 }
48
+.icon-g-notes-2 { background-position: -986px 0 }
49
+.icon-g-pencil { background-position: -1020px 0 }
50
+.icon-g-bus { background-position: -1054px 0 }
51
+.icon-g-wifi-alt { background-position: -1088px 0 }
52
+.icon-g-luggage { background-position: -1122px 0 }
53
+.icon-g-old-man { background-position: -1156px 0 }
54
+.icon-g-woman { background-position: -1190px 0 }
55
+.icon-g-file { background-position: -1224px 0 }
56
+.icon-g-credit { background-position: -1258px 0 }
57
+.icon-g-airplane { background-position: -1292px 0 }
58
+.icon-g-notes { background-position: -1326px 0 }
59
+.icon-g-stats { background-position: -1360px 0 }
60
+.icon-g-charts { background-position: -1394px 0 }
61
+.icon-g-pie-chart { background-position: -1428px 0 }
62
+.icon-g-group { background-position: -1462px 0 }
63
+.icon-g-keys { background-position: -1496px 0 }
64
+.icon-g-calendar { background-position: -1530px 0 }
65
+.icon-g-router { background-position: -1564px 0 }
66
+.icon-g-camera-small { background-position: -1598px 0 }
67
+.icon-g-dislikes { background-position: -1632px 0 }
68
+.icon-g-star { background-position: -1666px 0 }
69
+.icon-g-link { background-position: -1700px 0 }
70
+.icon-g-eye-open { background-position: -1734px 0 }
71
+.icon-g-eye-close { background-position: -1768px 0 }
72
+.icon-g-alarm { background-position: -1802px 0 }
73
+.icon-g-clock { background-position: -1836px 0 }
74
+.icon-g-stopwatch { background-position: -1870px 0 }
75
+.icon-g-projector { background-position: -1904px 0 }
76
+.icon-g-history { background-position: -1938px 0 }
77
+.icon-g-truck { background-position: -1972px 0 }
78
+.icon-g-cargo { background-position: 0 -34px }
79
+.icon-g-compass { background-position: -34px -34px }
80
+.icon-g-keynote { background-position: -68px -34px }
81
+.icon-g-attach { background-position: -102px -34px }
82
+.icon-g-power { background-position: -136px -34px }
83
+.icon-g-lightbulb { background-position: -170px -34px }
84
+.icon-g-tag { background-position: -204px -34px }
85
+.icon-g-tags { background-position: -238px -34px }
86
+.icon-g-cleaning { background-position: -272px -34px }
87
+.icon-g-ruller { background-position: -306px -34px }
88
+.icon-g-gift { background-position: -340px -34px }
89
+.icon-g-umbrella { background-position: -374px -34px }
90
+.icon-g-book { background-position: -408px -34px }
91
+.icon-g-bookmark { background-position: -442px -34px }
92
+.icon-g-signal { background-position: -476px -34px }
93
+.icon-g-cup { background-position: -510px -34px }
94
+.icon-g-stroller { background-position: -544px -34px }
95
+.icon-g-headphones { background-position: -578px -34px }
96
+.icon-g-headset { background-position: -612px -34px }
97
+.icon-g-warning-sign { background-position: -646px -34px }
98
+.icon-g-signal { background-position: -680px -34px }
99
+.icon-g-retweet { background-position: -714px -34px }
100
+.icon-g-refresh { background-position: -748px -34px }
101
+.icon-g-roundabout { background-position: -782px -34px }
102
+.icon-g-random { background-position: -816px -34px }
103
+.icon-g-heat { background-position: -850px -34px }
104
+.icon-g-repeat { background-position: -884px -34px }
105
+.icon-g-display { background-position: -918px -34px }
106
+.icon-g-log-book { background-position: -952px -34px }
107
+.icon-g-adress-book { background-position: -986px -34px }
108
+.icon-g-magnet { background-position: -1020px -34px }
109
+.icon-g-table { background-position: -1054px -34px }
110
+.icon-g-adjust { background-position: -1088px -34px }
111
+.icon-g-tint { background-position: -1122px -34px }
112
+.icon-g-crop { background-position: -1156px -34px }
113
+.icon-g-vector-path-square { background-position: -1190px -34px }
114
+.icon-g-vector-path-circle { background-position: -1224px -34px }
115
+.icon-g-vector-path-polygon { background-position: -1258px -34px }
116
+.icon-g-vector-path-line { background-position: -1292px -34px }
117
+.icon-g-vector-path-curve { background-position: -1326px -34px }
118
+.icon-g-vector-path-all { background-position: -1360px -34px }
119
+.icon-g-font { background-position: -1394px -34px }
120
+.icon-g-italic { background-position: -1428px -34px }
121
+.icon-g-bold { background-position: -1462px -34px }
122
+.icon-g-text-underline { background-position: -1496px -34px }
123
+.icon-g-text-strike { background-position: -1530px -34px }
124
+.icon-g-text-height { background-position: -1564px -34px }
125
+.icon-g-text-width { background-position: -1598px -34px }
126
+.icon-g-text-resize { background-position: -1632px -34px }
127
+.icon-g-left-indent { background-position: -1666px -34px }
128
+.icon-g-right-indent { background-position: -1700px -34px }
129
+.icon-g-align-left { background-position: -1734px -34px }
130
+.icon-g-align-center { background-position: -1768px -34px }
131
+.icon-g-align-right { background-position: -1802px -34px }
132
+.icon-g-justify { background-position: -1836px -34px }
133
+.icon-g-list { background-position: -1870px -34px }
134
+.icon-g-text-smaller { background-position: -1904px -34px }
135
+.icon-g-text-bigger { background-position: -1938px -34px }
136
+.icon-g-embed { background-position: -1972px -34px }
137
+.icon-g-embed-close { background-position: 0 -68px }
138
+.icon-g-adjust { background-position: -34px -68px }
139
+.icon-g-message-full { background-position: -68px -68px }
140
+.icon-g-message-empty { background-position: -102px -68px }
141
+.icon-g-message-in { background-position: -136px -68px }
142
+.icon-g-message-out { background-position: -170px -68px }
143
+.icon-g-message-plus { background-position: -204px -68px }
144
+.icon-g-message-minus { background-position: -238px -68px }
145
+.icon-g-message-ban { background-position: -272px -68px }
146
+.icon-g-message-flag { background-position: -306px -68px }
147
+.icon-g-message-lock { background-position: -340px -68px }
148
+.icon-g-message-new { background-position: -374px -68px }
149
+.icon-g-inbox { background-position: -408px -68px }
150
+.icon-g-inbox-plus { background-position: -442px -68px }
151
+.icon-g-inbox-minus { background-position: -476px -68px }
152
+.icon-g-inbox-lock { background-position: -510px -68px }
153
+.icon-g-inbox-in { background-position: -544px -68px }
154
+.icon-g-inbox-out { background-position: -578px -68px }
155
+.icon-g-computer-locked { background-position: -612px -68px }
156
+.icon-g-computer-service { background-position: -646px -68px }
157
+.icon-g-computer-proces { background-position: -680px -68px }
158
+.icon-g-phone { background-position: -714px -68px }
159
+.icon-g-database-lock { background-position: -748px -68px }
160
+.icon-g-database-plus { background-position: -782px -68px }
161
+.icon-g-database-minus { background-position: -816px -68px }
162
+.icon-g-database-ban { background-position: -850px -68px }
163
+.icon-g-folder-open { background-position: -884px -68px }
164
+.icon-g-folder-plus { background-position: -918px -68px }
165
+.icon-g-folder-minus { background-position: -952px -68px }
166
+.icon-g-folder-lock { background-position: -986px -68px }
167
+.icon-g-folder-flag { background-position: -1020px -68px }
168
+.icon-g-folder-new { background-position: -1054px -68px }
169
+.icon-g-check { background-position: -1088px -68px }
170
+.icon-g-edit { background-position: -1122px -68px }
171
+.icon-g-new-window { background-position: -1156px -68px }
172
+.icon-g-more-windows { background-position: -1190px -68px }
173
+.icon-g-show-big-thumbnails { background-position: -1224px -68px }
174
+.icon-g-show-thumbnails { background-position: -1258px -68px }
175
+.icon-g-show-thumbnails-with-lines { background-position: -1292px -68px }
176
+.icon-g-show-lines { background-position: -1326px -68px }
177
+.icon-g-playlist { background-position: -1360px -68px }
178
+.icon-g-picture { background-position: -1394px -68px }
179
+.icon-g-imac { background-position: -1428px -68px }
180
+.icon-g-macbook { background-position: -1462px -68px }
181
+.icon-g-ipad { background-position: -1496px -68px }
182
+.icon-g-iphone { background-position: -1530px -68px }
183
+.icon-g-iphone-transfer { background-position: -1564px -68px }
184
+.icon-g-iphone-exchange { background-position: -1598px -68px }
185
+.icon-g-ipod { background-position: -1632px -68px }
186
+.icon-g-ipod-shuffle { background-position: -1666px -68px }
187
+.icon-g-ear-plugs { background-position: -1700px -68px }
188
+.icon-g-albums { background-position: -1734px -68px }
189
+.icon-g-step-backward { background-position: -1768px -68px }
190
+.icon-g-fast-backward { background-position: -1802px -68px }
191
+.icon-g-rewind { background-position: -1836px -68px }
192
+.icon-g-play { background-position: -1870px -68px }
193
+.icon-g-pause { background-position: -1904px -68px }
194
+.icon-g-stop { background-position: -1938px -68px }
195
+.icon-g-forward { background-position: -1972px -68px }
196
+.icon-g-fast-forward { background-position: 0 -102px }
197
+.icon-g-step-forward { background-position: -34px -102px }
198
+.icon-g-eject { background-position: -68px -102px }
199
+.icon-g-facetime-video { background-position: -102px -102px }
200
+.icon-g-download-alt { background-position: -136px -102px }
201
+.icon-g-mute { background-position: -170px -102px }
202
+.icon-g-volume-down { background-position: -204px -102px }
203
+.icon-g-volume-up { background-position: -238px -102px }
204
+.icon-g-screenshot { background-position: -272px -102px }
205
+.icon-g-move { background-position: -306px -102px }
206
+.icon-g-more { background-position: -340px -102px }
207
+.icon-g-brightness-reduce { background-position: -374px -102px }
208
+.icon-g-brightness-increase { background-position: -408px -102px }
209
+.icon-g-circle-plus { background-position: -442px -102px }
210
+.icon-g-circle-minus { background-position: -476px -102px }
211
+.icon-g-circle-remove { background-position: -510px -102px }
212
+.icon-g-circle-ok { background-position: -544px -102px }
213
+.icon-g-circle-question-mark { background-position: -578px -102px }
214
+.icon-g-circle-info { background-position: -612px -102px }
215
+.icon-g-circle-exclamation-mark { background-position: -646px -102px }
216
+.icon-g-remove { background-position: -680px -102px }
217
+.icon-g-ok { background-position: -714px -102px }
218
+.icon-g-ban { background-position: -748px -102px }
219
+.icon-g-download { background-position: -782px -102px }
220
+.icon-g-upload { background-position: -816px -102px }
221
+.icon-g-shopping-cart { background-position: -850px -102px }
222
+.icon-g-lock { background-position: -884px -102px }
223
+.icon-g-unlock { background-position: -918px -102px }
224
+.icon-g-electricity { background-position: -952px -102px }
225
+.icon-g-ok-2 { background-position: -986px -102px }
226
+.icon-g-remove-2 { background-position: -1020px -102px }
227
+.icon-g-cart-out { background-position: -1054px -102px }
228
+.icon-g-cart-in { background-position: -1088px -102px }
229
+.icon-g-left-arrow { background-position: -1122px -102px }
230
+.icon-g-right-arrow { background-position: -1156px -102px }
231
+.icon-g-down-arrow { background-position: -1190px -102px }
232
+.icon-g-up-arrow { background-position: -1224px -102px }
233
+.icon-g-resize-small { background-position: -1258px -102px }
234
+.icon-g-resize-full { background-position: -1292px -102px }
235
+.icon-g-circle-arrow-left { background-position: -1326px -102px }
236
+.icon-g-circle-arrow-right { background-position: -1360px -102px }
237
+.icon-g-circle-arrow-top { background-position: -1394px -102px }
238
+.icon-g-circle-arrow-down { background-position: -1428px -102px }
239
+.icon-g-play-button { background-position: -1462px -102px }
240
+.icon-g-unshare { background-position: -1496px -102px }
241
+.icon-g-share { background-position: -1530px -102px }
242
+.icon-g-thin-right-arrow { background-position: -1564px -102px }
243
+.icon-g-thin-arrow-left { background-position: -1598px -102px }
244
+.icon-g-bluetooth { background-position: -1632px -102px }
245
+.icon-g-euro { background-position: -1666px -102px }
246
+.icon-g-usd { background-position: -1700px -102px }
247
+.icon-g-bp { background-position: -1734px -102px }
248
+.icon-g-retweet-2 { background-position: -1768px -102px }
249
+.icon-g-moon { background-position: -1802px -102px }
250
+.icon-g-sun { background-position: -1836px -102px }
251
+.icon-g-cloud { background-position: -1870px -102px }
252
+.icon-g-direction { background-position: -1904px -102px }
253
+.icon-g-brush { background-position: -1938px -102px }
254
+.icon-g-pen { background-position: -1972px -102px }
255
+.icon-g-zoom-in { background-position: 0 -136px }
256
+.icon-g-zoom-out { background-position: -34px -136px }
257
+.icon-g-pin { background-position: -68px -136px }
258
+.icon-g-riflescope { background-position: -102px -136px }
259
+.icon-g-rotation-lock { background-position: -136px -136px }
260
+.icon-g-flash { background-position: -170px -136px }
261
+.icon-g-google-maps { background-position: -204px -136px }
262
+.icon-g-anchor { background-position: -238px -136px }
263
+.icon-g-conversation { background-position: -272px -136px }
264
+.icon-g-chat { background-position: -306px -136px }
265
+.icon-g-male { background-position: -340px -136px }
266
+.icon-g-female { background-position: -374px -136px }
267
+.icon-g-asterisk { background-position: -408px -136px }
268
+.icon-g-divide { background-position: -442px -136px }
269
+.icon-g-snorkel-diving { background-position: -476px -136px }
270
+.icon-g-scuba-diving { background-position: -510px -136px }
271
+.icon-g-oxygen-bottle { background-position: -544px -136px }
272
+.icon-g-fins { background-position: -578px -136px }
273
+.icon-g-fishes { background-position: -612px -136px }
274
+.icon-g-boat { background-position: -646px -136px }
275
+.icon-g-delete-point { background-position: -680px -136px }
276
+.icon-g-sheriffs--star { background-position: -714px -136px }
277
+.icon-g-qrcode { background-position: -748px -136px }
278
+.icon-g-barcode { background-position: -782px -136px }
279
+.icon-g-pool { background-position: -816px -136px }
280
+.icon-g-buoy { background-position: -850px -136px }
281
+.icon-g-spade { background-position: -884px -136px }
282
+.icon-g-bank { background-position: -918px -136px }
283
+.icon-g-vcard { background-position: -952px -136px }
284
+.icon-g-electrical-plug { background-position: -986px -136px }
285
+.icon-g-flag { background-position: -1020px -136px }
286
+.icon-g-credit-card { background-position: -1054px -136px }
287
+.icon-g-keyboard-wireless { background-position: -1088px -136px }
288
+.icon-g-keyboard-wired { background-position: -1122px -136px }
289
+.icon-g-shield { background-position: -1156px -136px }
290
+.icon-g-ring { background-position: -1190px -136px }
291
+.icon-g-cake { background-position: -1224px -136px }
292
+.icon-g-drink { background-position: -1258px -136px }
293
+.icon-g-beer { background-position: -1292px -136px }
294
+.icon-g-fast-food { background-position: -1326px -136px }
295
+.icon-g-cutlery { background-position: -1360px -136px }
296
+.icon-g-pizza { background-position: -1394px -136px }
297
+.icon-g-birthday-cake { background-position: -1428px -136px }
298
+.icon-g-tablet { background-position: -1462px -136px }
299
+.icon-g-settings { background-position: -1496px -136px }
300
+.icon-g-bullets { background-position: -1530px -136px }
301
+.icon-g-cardio { background-position: -1564px -136px }
302
+.icon-g-t-shirt { background-position: -1598px -136px }
303
+.icon-g-pants { background-position: -1632px -136px }
304
+.icon-g-sweater { background-position: -1666px -136px }
305
+.icon-g-fabric { background-position: -1700px -136px }
306
+.icon-g-leather { background-position: -1734px -136px }
307
+.icon-g-scissors { background-position: -1768px -136px }
308
+.icon-g-podium { background-position: -1802px -136px }
309
+.icon-g-skull { background-position: -1836px -136px }
310
+.icon-g-celebration { background-position: -1870px -136px }
311
+.icon-g-tea-kettle { background-position: -1904px -136px }
312
+.icon-g-french-press { background-position: -1938px -136px }
313
+.icon-g-coffe-cup { background-position: -1972px -136px }
314
+.icon-g-pot { background-position: 0 -170px }
315
+.icon-g-grater { background-position: -34px -170px }
316
+.icon-g-kettle { background-position: -68px -170px }
317
+.icon-g-hospital { background-position: -102px -170px }
318
+.icon-g-hospital-h { background-position: -136px -170px }
319
+.icon-g-microphone { background-position: -170px -170px }
320
+.icon-g-webcam { background-position: -204px -170px }
321
+.icon-g-temple-christianity-church { background-position: -238px -170px }
322
+.icon-g-temple-islam { background-position: -272px -170px }
323
+.icon-g-temple-hindu { background-position: -306px -170px }
324
+.icon-g-temple-buddhist { background-position: -340px -170px }
325
+.icon-g-electrical-socket-eu { background-position: -374px -170px }
326
+.icon-g-electrical-socket-us { background-position: -408px -170px }
327
+.icon-g-bomb { background-position: -442px -170px }
328
+.icon-g-comments { background-position: -476px -170px }
329
+.icon-g-flower { background-position: -510px -170px }
330
+.icon-g-baseball { background-position: -544px -170px }
331
+.icon-g-rugby { background-position: -578px -170px }
332
+.icon-g-ax { background-position: -612px -170px }
333
+.icon-g-table-tennis { background-position: -646px -170px }
334
+.icon-g-bowling { background-position: -680px -170px }
335
+.icon-g-tree-conifer { background-position: -714px -170px }
336
+.icon-g-tree-deciduous { background-position: -748px -170px }
337
+.icon-g-more-items { background-position: -782px -170px }
338
+.icon-g-sort { background-position: -816px -170px }
339
+.icon-g-filter { background-position: -850px -170px }
340
+.icon-g-gamepad { background-position: -884px -170px }
341
+.icon-g-playing-dices { background-position: -918px -170px }
342
+.icon-g-calculator { background-position: -952px -170px }
343
+.icon-g-tie { background-position: -986px -170px }
344
+.icon-g-wallet { background-position: -1020px -170px }
345
+.icon-g-share { background-position: -1054px -170px }
346
+.icon-g-sampler { background-position: -1088px -170px }
347
+.icon-g-piano { background-position: -1122px -170px }
348
+.icon-g-web-browser { background-position: -1156px -170px }
349
+.icon-g-blog { background-position: -1190px -170px }
350
+.icon-g-dashboard { background-position: -1224px -170px }
351
+.icon-g-certificate { background-position: -1258px -170px }
352
+.icon-g-bell { background-position: -1292px -170px }
353
+.icon-g-candle { background-position: -1326px -170px }
354
+.icon-g-pin-classic { background-position: -1360px -170px }
355
+.icon-g-iphone-shake { background-position: -1394px -170px }
356
+.icon-g-pin-flag { background-position: -1428px -170px }
357
+.icon-g-turtle { background-position: -1462px -170px }
358
+.icon-g-rabbit { background-position: -1496px -170px }
359
+.icon-g-globe { background-position: -1530px -170px }
360
+.icon-g-briefcase { background-position: -1564px -170px }
361
+.icon-g-hdd { background-position: -1598px -170px }
362
+.icon-g-thumbs-up { background-position: -1632px -170px }
363
+.icon-g-thumbs-down { background-position: -1666px -170px }
364
+.icon-g-hand-right { background-position: -1700px -170px }
365
+.icon-g-hand-left { background-position: -1734px -170px }
366
+.icon-g-hand-up { background-position: -1768px -170px }
367
+.icon-g-hand-down { background-position: -1802px -170px }
368
+.icon-g-fullscreen { background-position: -1836px -170px }
369
+.icon-g-shopping-bag { background-position: -1870px -170px }
370
+.icon-g-book-open { background-position: -1904px -170px }
371
+.icon-g-nameplate { background-position: -1938px -170px }
372
+.icon-g-nameplate-alt { background-position: -1972px -170px }
373
+.icon-g-vases { background-position: 0 -204px }
374
+.icon-g-announcement { background-position: -34px -204px }
375
+.icon-g-dumbbell { background-position: -68px -204px }
376
+.icon-g-suitcase { background-position: -102px -204px }
377
+.icon-g-file-import { background-position: -136px -204px }
378
+.icon-g-file-export { background-position: -170px -204px }
379
+.icon-g-pinterest { background-position: -204px -204px }
380
+.icon-g-dropbox { background-position: -238px -204px }
381
+.icon-g-google-alt { background-position: -272px -204px }
382
+.icon-g-jolicloud { background-position: -306px -204px }
383
+.icon-g-yahoo { background-position: -340px -204px }
384
+.icon-g-blogger { background-position: -374px -204px }
385
+.icon-g-picasa { background-position: -408px -204px }
386
+.icon-g-amazon { background-position: -442px -204px }
387
+.icon-g-tumblr { background-position: -476px -204px }
388
+.icon-g-wordpress { background-position: -510px -204px }
389
+.icon-g-instapaper { background-position: -544px -204px }
390
+.icon-g-evernote { background-position: -578px -204px }
391
+.icon-g-xing { background-position: -612px -204px }
392
+.icon-g-zootool { background-position: -646px -204px }
393
+.icon-g-dribbble { background-position: -680px -204px }
394
+.icon-g-deviantart { background-position: -714px -204px }
395
+.icon-g-read-it-later { background-position: -748px -204px }
396
+.icon-g-linked-in { background-position: -782px -204px }
397
+.icon-g-forrst { background-position: -816px -204px }
398
+.icon-g-pinboard { background-position: -850px -204px }
399
+.icon-g-behance { background-position: -884px -204px }
400
+.icon-g-github { background-position: -918px -204px }
401
+.icon-g-youtube { background-position: -952px -204px }
402
+.icon-g-skitch { background-position: -986px -204px }
403
+.icon-g-4square { background-position: -1020px -204px }
404
+.icon-g-quora { background-position: -1054px -204px }
405
+.icon-g-google-plus { background-position: -1088px -204px }
406
+.icon-g-spootify { background-position: -1122px -204px }
407
+.icon-g-stumbleupon { background-position: -1156px -204px }
408
+.icon-g-readability { background-position: -1190px -204px }
409
+.icon-g-facebook { background-position: -1224px -204px }
410
+.icon-g-twitter-t { background-position: -1258px -204px }
411
+.icon-g-twitter { background-position: -1292px -204px }
412
+.icon-g-buzz { background-position: -1326px -204px }
413
+.icon-g-vimeo { background-position: -1360px -204px }
414
+.icon-g-flickr { background-position: -1394px -204px }
415
+.icon-g-last-fm { background-position: -1428px -204px }
416
+.icon-g-rss { background-position: -1462px -204px }
417
+.icon-g-skype { background-position: -1496px -204px }
418
+.icon-g-e-mail { background-position: -1530px -204px }

+ 198 - 0
pod/pod/public/css/style.css View File

@@ -0,0 +1,198 @@
1
+#flash > div {
2
+  padding: 8px 35px 8px 14px;
3
+  margin-bottom: 20px;
4
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
5
+  background-color: #fcf8e3;
6
+  border: 1px solid #fbeed5;
7
+  -webkit-border-radius: 4px;
8
+     -moz-border-radius: 4px;
9
+          border-radius: 4px;
10
+  color: #c09853;
11
+}
12
+
13
+#flash > .ok {
14
+  color: #468847;
15
+  background-color: #dff0d8;
16
+  border-color: #d6e9c6;
17
+}
18
+
19
+#flash > .error {
20
+  color: #b94a48;
21
+  background-color: #f2dede;
22
+  border-color: #eed3d7;
23
+}
24
+
25
+#flash > .info {
26
+  color: #3a87ad;
27
+  background-color: #d9edf7;
28
+  border-color: #bce8f1;
29
+}
30
+
31
+/* Footer styling */
32
+.footer {
33
+    margin-top: 2em;
34
+    padding: 0.5em 0 36px;
35
+    border-top: 1px solid #e5e5e5;
36
+}
37
+
38
+.footer p {
39
+    margin-bottom: 0;
40
+    color: #555;
41
+}
42
+
43
+/* Wrapper for page content to push down footer */
44
+#wrap {
45
+  min-height: 100%;
46
+  height: auto !important;
47
+  height: 100%;
48
+  /* Negative indent footer by it's height */
49
+  margin: 0 auto -60px;
50
+}
51
+
52
+/* Lastly, apply responsive CSS fixes as necessary */
53
+@media (max-width: 767px) {
54
+  #footer {
55
+    margin-left: -20px;
56
+    margin-right: -20px;
57
+    padding-left: 20px;
58
+    padding-right: 20px;
59
+  }
60
+}
61
+
62
+/* vertical align icons in legend nodes */
63
+legend > i {
64
+  vertical-align: baseline !important;
65
+}
66
+      
67
+
68
+div.pod-toolbar {
69
+  visibility: hidden;
70
+  position: absolute;
71
+  right: 1.2em;
72
+  top: 0;
73
+}
74
+
75
+.pod-toolbar-parent {
76
+  border-bottom: 1px dotted #CCC;
77
+}
78
+.pod-toolbar-parent:Hover {
79
+  background-color: #EFEFEF;
80
+}
81
+.pod-toolbar-parent:Hover > div.pod-toolbar {
82
+  visibility: visible;
83
+}
84
+.pod-status {
85
+  position: absolute;
86
+  width: 1.2em;
87
+  text-align: center;
88
+  right: 0;
89
+  top: 0;
90
+}
91
+
92
+.pod-item-nb-sup-block {
93
+  color: #3a87ad;
94
+  font-weight: bold;
95
+}
96
+
97
+h3:Hover div.pod-toolbar {
98
+  visibility: visible;
99
+}
100
+
101
+.pod-blue {color: #3a87ad !important; }
102
+.pod-red {color: #F00 !important; }
103
+.pod-grey {color: #999 !important; }
104
+.pod-dark-grey {color: #333333 !important; }
105
+
106
+
107
+body { padding-top: 60px; }
108
+@media screen and (max-width: 768px) {
109
+    body { padding-top: 0px; }
110
+}
111
+
112
+/*
113
+##########################
114
+##
115
+## HERE COMES THE FULLSCREEN CODE FOR RICH TEXT EDITING
116
+##
117
+## FIXME - D.A. - 2013-11-13 - This code is testing, to remove later
118
+*/
119
+.full-size-overlay {
120
+  height:100%;
121
+  width:100%;
122
+  position:fixed;
123
+  left:0;
124
+  top:0;
125
+  z-index:2001 !important;
126
+  background-color:white;
127
+
128
+  padding: 0.5em 0.5em 0.5em 0.5em;
129
+  
130
+  filter: alpha(opacity=95); /* internet explorer */
131
+  -khtml-opacity: 0.95;      /* khtml, old safari */
132
+  -moz-opacity: 0.95;       /* mozilla, netscape */
133
+  opacity: 0.95;           /* fx, safari, opera */
134
+}
135
+
136
+.full-size-overlay-inner {
137
+  margin: 0.5em 1em 0.5em 0em;
138
+  overflow: auto;
139
+  max-height: 90%;
140
+}
141
+
142
+
143
+tr:Hover td div.pod-toolbar {
144
+  visibility: hidden;
145
+}
146
+tr:Hover td div.pod-toolbar {
147
+  visibility: visible;
148
+}
149
+
150
+.pod-status-grey-light  { background-color: #DDD; }
151
+.pod-status-grey-middle { background-color: #BBB; }
152
+.pod-status-grey-dark   { background-color: #AAA; }
153
+.pod-status-active      { background-color: #FEE; }
154
+
155
+.pod-rich-text-zone {
156
+  overflow:auto;
157
+  min-height:3em;
158
+  max-height: 10%;
159
+  border: 1px solid #CCC;
160
+  padding: 0.5em;
161
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
162
+  border-radius: 4px;
163
+  background-color: white;
164
+}
165
+
166
+.pod-input-like-shadow {
167
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
168
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
169
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
170
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
171
+  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
172
+  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
173
+  -o-transition: border linear 0.2s, box-shadow linear 0.2s;
174
+  transition: border linear 0.2s, box-shadow linear 0.2s;
175
+}
176
+.pod-input-like-shadow:focus {
177
+  border-color: rgba(82, 168, 236, 0.8);
178
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
179
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
180
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
181
+  outline: 0;
182
+  outline: thin dotted \9;
183
+}
184
+
185
+.navbar .nav > li > a.pod-do-not-display { display: none; }
186
+
187
+/* SEARCH RESULTS SCREEN */
188
+
189
+div.search-result-item > h5 {
190
+  margin-bottom: 0;
191
+}
192
+
193
+ul.nav-tabs li.active > a { background-color: #efefef; }
194
+div.tab-pane > h4 { background-color: #efefef; padding: 0.5em; margin: 0 0 0.5em 0;}
195
+
196
+/* Admin form select */
197
+
198
+#sx_users { height: 250px; }

BIN
pod/pod/public/favicon.ico View File


BIN
pod/pod/public/img/glyphicons-grey.png View File


BIN
pod/pod/public/img/glyphicons-halflings-white.original.png View File


BIN
pod/pod/public/img/glyphicons-halflings-white.png View File


BIN
pod/pod/public/img/glyphicons-halflings.original.png View File


BIN
pod/pod/public/img/glyphicons-halflings.png View File


BIN
pod/pod/public/img/glyphicons-white.png View File


BIN
pod/pod/public/img/glyphicons.png View File


File diff suppressed because it is too large
+ 26 - 0
pod/pod/public/javascript/external/bootstrap-datetimepicker.min.js


+ 201 - 0
pod/pod/public/javascript/external/bootstrap-wysiwyg.js View File

@@ -0,0 +1,201 @@
1
+/* http://github.com/mindmup/bootstrap-wysiwyg */
2
+/*global jQuery, $, FileReader*/
3
+/*jslint browser:true*/
4
+(function ($) {
5
+	'use strict';
6
+	var readFileIntoDataUrl = function (fileInfo) {
7
+		var loader = $.Deferred(),
8
+			fReader = new FileReader();
9
+		fReader.onload = function (e) {
10
+			loader.resolve(e.target.result);
11
+		};
12
+		fReader.onerror = loader.reject;
13
+		fReader.onprogress = loader.notify;
14
+		fReader.readAsDataURL(fileInfo);
15
+		return loader.promise();
16
+	};
17
+	$.fn.cleanHtml = function () {
18
+		var html = $(this).html();
19
+		return html && html.replace(/(<br>|\s|<div><br><\/div>|&nbsp;)*$/, '');
20
+	};
21
+	$.fn.wysiwyg = function (userOptions) {
22
+		var editor = this,
23
+			selectedRange,
24
+			options,
25
+			toolbarBtnSelector,
26
+			updateToolbar = function () {
27
+				if (options.activeToolbarClass) {
28
+					$(options.toolbarSelector).find(toolbarBtnSelector).each(function () {
29
+						var command = $(this).data(options.commandRole);
30
+						if (document.queryCommandState(command)) {
31
+							$(this).addClass(options.activeToolbarClass);
32
+						} else {
33
+							$(this).removeClass(options.activeToolbarClass);
34
+						}
35
+					});
36
+				}
37
+			},
38
+			execCommand = function (commandWithArgs, valueArg) {
39
+				var commandArr = commandWithArgs.split(' '),
40
+					command = commandArr.shift(),
41
+					args = commandArr.join(' ') + (valueArg || '');
42
+				document.execCommand(command, 0, args);
43
+				updateToolbar();
44
+			},
45
+			bindHotkeys = function (hotKeys) {
46
+				$.each(hotKeys, function (hotkey, command) {
47
+					editor.keydown(hotkey, function (e) {
48
+						if (editor.attr('contenteditable') && editor.is(':visible')) {
49
+							e.preventDefault();
50
+							e.stopPropagation();
51
+							execCommand(command);
52
+						}
53
+					}).keyup(hotkey, function (e) {
54
+						if (editor.attr('contenteditable') && editor.is(':visible')) {
55
+							e.preventDefault();
56
+							e.stopPropagation();
57
+						}
58
+					});
59
+				});
60
+			},
61
+			getCurrentRange = function () {
62
+				var sel = window.getSelection();
63
+				if (sel.getRangeAt && sel.rangeCount) {
64
+					return sel.getRangeAt(0);
65
+				}
66
+			},
67
+			saveSelection = function () {
68
+				selectedRange = getCurrentRange();
69
+			},
70
+			restoreSelection = function () {
71
+				var selection = window.getSelection();
72
+				if (selectedRange) {
73
+					try {
74
+						selection.removeAllRanges();
75
+					} catch (ex) {
76
+						document.body.createTextRange().select();
77
+						document.selection.empty();
78
+					}
79
+
80
+					selection.addRange(selectedRange);
81
+				}
82
+			},
83
+			insertFiles = function (files) {
84
+				editor.focus();
85
+				$.each(files, function (idx, fileInfo) {
86
+					if (/^image\//.test(fileInfo.type)) {
87
+						$.when(readFileIntoDataUrl(fileInfo)).done(function (dataUrl) {
88
+							execCommand('insertimage', dataUrl);
89
+						}).fail(function (e) {
90
+							options.fileUploadError("file-reader", e);
91
+						});
92
+					} else {
93
+						options.fileUploadError("unsupported-file-type", fileInfo.type);
94
+					}
95
+				});
96
+			},
97
+			markSelection = function (input, color) {
98
+				restoreSelection();
99
+				if (document.queryCommandSupported('hiliteColor')) {
100
+					document.execCommand('hiliteColor', 0, color || 'transparent');
101
+				}
102
+				saveSelection();
103
+				input.data(options.selectionMarker, color);
104
+			},
105
+			bindToolbar = function (toolbar, options) {
106
+				toolbar.find(toolbarBtnSelector).click(function () {
107
+					restoreSelection();
108
+					editor.focus();
109
+					execCommand($(this).data(options.commandRole));
110
+					saveSelection();
111
+				});
112
+				toolbar.find('[data-toggle=dropdown]').click(restoreSelection);
113
+
114
+				toolbar.find('input[type=text][data-' + options.commandRole + ']').on('webkitspeechchange change', function () {
115
+					var newValue = this.value; /* ugly but prevents fake double-calls due to selection restoration */
116
+					this.value = '';
117
+					restoreSelection();
118
+					if (newValue) {
119
+						editor.focus();
120
+						execCommand($(this).data(options.commandRole), newValue);
121
+					}
122
+					saveSelection();
123
+				}).on('focus', function () {
124
+					var input = $(this);
125
+					if (!input.data(options.selectionMarker)) {
126
+						markSelection(input, options.selectionColor);
127
+						input.focus();
128
+					}
129
+				}).on('blur', function () {
130
+					var input = $(this);
131
+					if (input.data(options.selectionMarker)) {
132
+						markSelection(input, false);
133
+					}
134
+				});
135
+				toolbar.find('input[type=file][data-' + options.commandRole + ']').change(function () {
136
+					restoreSelection();
137
+					if (this.type === 'file' && this.files && this.files.length > 0) {
138
+						insertFiles(this.files);
139
+					}
140
+					saveSelection();
141
+					this.value = '';
142
+				});
143
+			},
144
+			initFileDrops = function () {
145
+				editor.on('dragenter dragover', false)
146
+					.on('drop', function (e) {
147
+						var dataTransfer = e.originalEvent.dataTransfer;
148
+						e.stopPropagation();
149
+						e.preventDefault();
150
+						if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {
151
+							insertFiles(dataTransfer.files);
152
+						}
153
+					});
154
+			};
155
+		options = $.extend({}, $.fn.wysiwyg.defaults, userOptions);
156
+		toolbarBtnSelector = 'a[data-' + options.commandRole + '],button[data-' + options.commandRole + '],input[type=button][data-' + options.commandRole + ']';
157
+		bindHotkeys(options.hotKeys);
158
+		if (options.dragAndDropImages) {
159
+			initFileDrops();
160
+		}
161
+		bindToolbar($(options.toolbarSelector), options);
162
+		
163
+		editor.attr('contenteditable', true)
164
+			.on('mouseup keyup mouseout', function () {
165
+				saveSelection();
166
+				updateToolbar();
167
+			});
168
+		$(window).bind('touchend', function (e) {
169
+			var isInside = (editor.is(e.target) || editor.has(e.target).length > 0),
170
+				currentRange = getCurrentRange(),
171
+				clear = currentRange && (currentRange.startContainer === currentRange.endContainer && currentRange.startOffset === currentRange.endOffset);
172
+			if (!clear || isInside) {
173
+				saveSelection();
174
+				updateToolbar();
175
+			}
176
+		});
177
+		return this;
178
+	};
179
+	$.fn.wysiwyg.defaults = {
180
+		hotKeys: {
181
+			'ctrl+b meta+b': 'bold',
182
+			'ctrl+i meta+i': 'italic',
183
+			'ctrl+u meta+u': 'underline',
184
+			'ctrl+z meta+z': 'undo',
185
+			'ctrl+y meta+y meta+shift+z': 'redo',
186
+			'ctrl+l meta+l': 'justifyleft',
187
+			'ctrl+r meta+r': 'justifyright',
188
+			'ctrl+e meta+e': 'justifycenter',
189
+			'ctrl+j meta+j': 'justifyfull',
190
+			'shift+tab': 'outdent',
191
+			'tab': 'indent'
192
+		},
193
+		toolbarSelector: '[data-role=editor-toolbar]',
194
+		commandRole: 'edit',
195
+		activeToolbarClass: 'btn-info',
196
+		selectionMarker: 'edit-focus-marker',
197
+		selectionColor: 'darkgrey',
198
+		dragAndDropImages: true,
199
+		fileUploadError: function (reason, detail) { console.log("File upload error", reason, detail); }
200
+	};
201
+}(window.jQuery));

File diff suppressed because it is too large
+ 2291 - 0
pod/pod/public/javascript/external/bootstrap.js


File diff suppressed because it is too large
+ 7 - 0
pod/pod/public/javascript/external/bootstrap.min.js


+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-apollo.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\n\r]*/,null,"#"],["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,
2
+null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[!-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["apollo","agc","aea"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-basic.js View File

@@ -0,0 +1,3 @@
1
+var a=null;
2
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^"(?:[^\n\r"\\]|\\.)*(?:"|$)/,a,'"'],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["com",/^REM[^\n\r]*/,a],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,a],["pln",/^[a-z][^\W_]?(?:\$|%)?/i,a],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i,a,"0123456789"],["pun",
3
+/^.[^\s\w"$%.]*/,a]]),["basic","cbm"]);

+ 18 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-clj.js View File

@@ -0,0 +1,18 @@
1
+/*
2
+ Copyright (C) 2011 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+*/
16
+var a=null;
17
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[([{]+/,a,"([{"],["clo",/^[)\]}]+/,a,")]}"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,a],
18
+["typ",/^:[\dA-Za-z-]+/]]),["clj"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-css.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n\u000c"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]+)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],
2
+["com",/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}\b/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-dart.js View File

@@ -0,0 +1,3 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["com",/^#!.*/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/.*/],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],
2
+["typ",/^\b(?:bool|double|dynamic|int|num|object|string|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?'''[\S\s]*?[^\\]'''/],["str",/^r?"""[\S\s]*?[^\\]"""/],["str",/^r?'('|[^\n\f\r]*?[^\\]')/],["str",/^r?"("|[^\n\f\r]*?[^\\]")/],["pln",/^[$_a-z]\w*/i],["pun",/^[!%&*+/:<-?^|~-]/],["lit",/^\b0x[\da-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(),.;[\]{}]/]]),
3
+["dart"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-erlang.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["lit",/^[a-z]\w*/],["lit",/^'(?:[^\n\f\r'\\]|\\[^&])+'?/,null,"'"],["lit",/^\?[^\t\n ({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],
2
+["kwd",/^-[_a-z]+/],["typ",/^[A-Z_]\w*/],["pun",/^[,.;]/]]),["erlang","erl"]);

+ 1 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-go.js View File

@@ -0,0 +1 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["pln",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])+(?:'|$)|`[^`]*(?:`|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\/\*[\S\s]*?\*\/)/],["pln",/^(?:[^"'/`]|\/(?![*/]))+/]]),["go"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-hs.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/,
2
+null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-lisp.js View File

@@ -0,0 +1,3 @@
1
+var a=null;
2
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a],
3
+["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","lsp","scm","ss","rkt"]);

+ 1 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-llvm.js View File

@@ -0,0 +1 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^!?"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["com",/^;[^\n\r]*/,null,";"]],[["pln",/^[!%@](?:[$\-.A-Z_a-z][\w$\-.]*|\d+)/],["kwd",/^[^\W\d]\w*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[Xx][\dA-Fa-f]+)/],["pun",/^[(-*,:<->[\]{}]|\.\.\.$/]]),["llvm","ll"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-lua.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],
2
+["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]);

File diff suppressed because it is too large
+ 6 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-matlab.js


+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-ml.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
2
+["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-mumps.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"]|\\.)*"/,null,'"']],[["com",/^;[^\n\r]*/,null,";"],["dec",/^\$(?:d|device|ec|ecode|es|estack|et|etrap|h|horolog|i|io|j|job|k|key|p|principal|q|quit|st|stack|s|storage|sy|system|t|test|tl|tlevel|tr|trestart|x|y|z[a-z]*|a|ascii|c|char|d|data|e|extract|f|find|fn|fnumber|g|get|j|justify|l|length|na|name|o|order|p|piece|ql|qlength|qs|qsubscript|q|query|r|random|re|reverse|s|select|st|stack|t|text|tr|translate|nan)\b/i,
2
+null],["kwd",/^(?:[^$]b|break|c|close|d|do|e|else|f|for|g|goto|h|halt|h|hang|i|if|j|job|k|kill|l|lock|m|merge|n|new|o|open|q|quit|r|read|s|set|tc|tcommit|tre|trestart|tro|trollback|ts|tstart|u|use|v|view|w|write|x|xecute)\b/i,null],["lit",/^[+-]?(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?/i],["pln",/^[a-z][^\W_]*/i],["pun",/^[^\w\t\n\r"$%;^\xa0]|_/]]),["mumps"]);

+ 4 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-n.js View File

@@ -0,0 +1,4 @@
1
+var a=null;
2
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,
3
+a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,
4
+a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-pascal.js View File

@@ -0,0 +1,3 @@
1
+var a=null;
2
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],
3
+["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]);

+ 1 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-proto.js View File

@@ -0,0 +1 @@
1
+PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-r.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],
2
+["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]);

+ 1 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-rd.js View File

@@ -0,0 +1 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-scala.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
2
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-sql.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,
2
+null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-tcl.js View File

@@ -0,0 +1,3 @@
1
+var a=null;
2
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",
3
+/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]);

+ 1 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-tex.js View File

@@ -0,0 +1 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-vb.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"\u201c\u201d'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'\u2018\u2019"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,
2
+null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]);

+ 3 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-vhdl.js View File

@@ -0,0 +1,3 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,
2
+null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],
3
+["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]);

+ 2 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-wiki.js View File

@@ -0,0 +1,2 @@
1
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"\t \u00a0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]);
2
+PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);

+ 0 - 0
pod/pod/public/javascript/external/google-code-prettify/lang-xq.js View File


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