New upstream version 3.5.0
Sophie Brun
5 years ago
0 | December 6th, 2018 |
0 | 0 | * In GTK, check active_workspace its not null |
1 | ||
2 | 1 | * Add fbruteforce services fplugin |
3 | ||
4 | ||
5 | 2 | * Attachments can be added to a vulnerability through the API. |
6 | ||
7 | 3 | * Catch gaierror error on lynis plugin |
8 | ||
9 | 4 | * Add OR and NOT with parenthesis support on status report search |
10 | ||
11 | 5 | * Info API now is public |
12 | 6 | * Web UI now detects Appscan plugin |
13 | ||
14 | 7 | * Improve performance on the workspace using cusotm query |
15 | ||
16 | 8 | * Workspaces can be set as active/disable in welcome page. |
17 | 9 | * Change Nmap plugin, response field in VulnWeb now goes to Data field. |
18 | ||
19 | 10 | * Update code to support latest SQLAlchemy version |
20 | ||
21 | 11 | * Fix `create_vuln` fplugin bug that incorrectly reported duplicated vulns |
22 | ||
12 | * Attachments on a vulnerability can be deleted through the API. | |
13 | * Improvement in the coverage of the tests. |
0 | Jan 16th, 2019 |
0 | * Redesgin of new/edit vulnerability forms | |
1 | * Add new custom fields feature to vulnerabilities | |
2 | * Add ./manage.py migrate to perform alembic migrations | |
3 | * Faraday will use webargs==4.4.1 because webargs==5.0.0 fails with Python2 | |
4 | * New system for online plugins using Threads, a few fixes for metasploit plugin online also. | |
5 | * Fix Command "python manage.py process-reports" now stops once all reports have been processed | |
6 | * Fix bug in query when it checks if a vulnerability or a workspace exists | |
7 | * Fix Once a workspace is created through the web UI, a folder with its name is created inside ~/.faraday/report/ | |
8 | * The manage.py now has a new support funtionality that creates a .zip file with all the information faraday's support team will need to throubleshoot your issue | |
9 | * Status-check checks PostgreSQL encoding | |
10 | * Fix a bug when fail importation of reports, command duration say "In Progress" forever. | |
11 | * Fix confirmed bug in vulns API | |
12 | * Update websockets code to use latest lib version | |
13 | * bootstrap updated to v3.4.0 | |
14 | * Manage.py support now throws a message once it finishes the process. | |
15 | * Update Lynis to its version 2.7.1 | |
16 | * Updated arp-scan plugin, added support in the Host class for mac address which was deprecated before v3.0 | |
17 | * OpenVAS Plugin now supports OpenVAS v-9.0.3 |
1 | 1 | =========== |
2 | 2 | |
3 | 3 | Please be kind to remove all your pyc files before running faraday if you are updating this piece of software. |
4 | Make sure you run ```./faraday.py --update``` the first time after an update! | |
4 | Make sure you run ```./manage.py migrate``` the first time after an update! | |
5 | 5 | |
6 | 6 | |
7 | 7 | New features in the latest update |
8 | 8 | ===================================== |
9 | 9 | |
10 | 10 | |
11 | 3.4: | |
11 | 3.5 [Jan 16th, 2019]: | |
12 | --- | |
13 | * Redesgin of new/edit vulnerability forms | |
14 | * Add new custom fields feature to vulnerabilities | |
15 | * Add ./manage.py migrate to perform alembic migrations | |
16 | * Faraday will use webargs==4.4.1 because webargs==5.0.0 fails with Python2 | |
17 | * New system for online plugins using Threads, a few fixes for metasploit plugin online also. | |
18 | * Fix Command "python manage.py process-reports" now stops once all reports have been processed | |
19 | * Fix bug in query when it checks if a vulnerability or a workspace exists | |
20 | * Fix Once a workspace is created through the web UI, a folder with its name is created inside ~/.faraday/report/ | |
21 | * The manage.py now has a new support funtionality that creates a .zip file with all the information faraday's support team will need to throubleshoot your issue | |
22 | * Status-check checks PostgreSQL encoding | |
23 | * Fix a bug when fail importation of reports, command duration say "In Progress" forever. | |
24 | * Fix confirmed bug in vulns API | |
25 | * Update websockets code to use latest lib version | |
26 | * bootstrap updated to v3.4.0 | |
27 | * Manage.py support now throws a message once it finishes the process. | |
28 | * Update Lynis to its version 2.7.1 | |
29 | * Updated arp-scan plugin, added support in the Host class for mac address which was deprecated before v3.0 | |
30 | * OpenVAS Plugin now supports OpenVAS v-9.0.3 | |
31 | ||
32 | 3.4 [December 6th, 2018]: | |
12 | 33 | --- |
13 | 34 | * In GTK, check active_workspace its not null |
14 | ||
15 | 35 | * Add fbruteforce services fplugin |
16 | ||
17 | ||
18 | 36 | * Attachments can be added to a vulnerability through the API. |
19 | ||
20 | 37 | * Catch gaierror error on lynis plugin |
21 | ||
22 | 38 | * Add OR and NOT with parenthesis support on status report search |
23 | ||
24 | 39 | * Info API now is public |
25 | 40 | * Web UI now detects Appscan plugin |
26 | ||
27 | 41 | * Improve performance on the workspace using cusotm query |
28 | ||
29 | 42 | * Workspaces can be set as active/disable in welcome page. |
30 | 43 | * Change Nmap plugin, response field in VulnWeb now goes to Data field. |
31 | ||
32 | 44 | * Update code to support latest SQLAlchemy version |
33 | ||
34 | 45 | * Fix `create_vuln` fplugin bug that incorrectly reported duplicated vulns |
35 | ||
46 | * Attachments on a vulnerability can be deleted through the API. | |
47 | * Improvement in the coverage of the tests. | |
36 | 48 | |
37 | 49 | 3.3 [Novemeber 14th, 2018]: |
38 | 50 | --- |
1 | 1 | =========== |
2 | 2 | |
3 | 3 | Please be kind to remove all your pyc files before running faraday if you are updating this piece of software. |
4 | Make sure you run ```./faraday.py --update``` the first time after an update! | |
4 | Make sure you run ```./manage.py migrate``` the first time after an update! | |
5 | 5 | |
6 | 6 | |
7 | 7 | New features in the latest update |
18 | 18 | stage ("Install Application Dependencies") { |
19 | 19 | sh """ |
20 | 20 | source ${ENV_PATH}/bin/activate |
21 | pip install virtualenv responses | |
21 | pip install virtualenv responses pytest-xdist | |
22 | 22 | pip install -U -r $WORKSPACE/requirements.txt |
23 | 23 | pip install -U -r $WORKSPACE/requirements_server.txt |
24 | 24 | pip install -U -r $WORKSPACE/requirements_extras.txt |
69 | 69 | withCredentials([string(credentialsId: 'postgresql_connection_string', variable: 'CONN_STRING')]) { |
70 | 70 | sh """ |
71 | 71 | source ${ENV_PATH}/bin/activate |
72 | cd $WORKSPACE && pytest -v --junitxml=$WORKSPACE/xunit-postgres.xml --connection-string "$CONN_STRING" || : | |
72 | cd $WORKSPACE && pytest -v --junitxml=$WORKSPACE/xunit-postgres.xml --connection-string "$CONN_STRING" -n 15 || : | |
73 | 73 | deactivate |
74 | 74 | """ |
75 | 75 | step([$class: 'CoberturaPublisher', autoUpdateHealth: false, autoUpdateStability: false, coberturaReportFile: '**/coverage.xml', failNoReports: false, failUnhealthy: false, failUnstable: false, maxNumberOfBuilds: 0, onlyStable: false, sourceEncoding: 'ASCII', zoomCoverageChart: false]) |
96 | 96 | |
97 | 97 | ## Presentations |
98 | 98 | |
99 | * Ekoparty Security Conference - 2017: | |
100 | * http://blog.infobytesec.com/2017/10/ekoparty-2017-review_23.html | |
99 | * Ekoparty ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/argentina.png): | |
100 | [2010](http://vimeo.com/16516987) - | |
101 | [2014](https://www.youtube.com/watch?v=_j0T2S6Ppfo) - | |
102 | [2017](http://blog.infobytesec.com/2017/10/ekoparty-2017-review_23.html) - | |
103 | [2018](http://blog.infobytesec.com/2018/10/ekoparty-2018-review_18.html) | |
101 | 104 | |
102 | * Black Hat Arsenal Asia - 2017: | |
103 | * https://www.blackhat.com/asia-17/arsenal.html#faraday | |
105 | * Black Hat: | |
106 | * USA ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/usa.png): | |
107 | [2011](http://www.infobytesec.com/down/Faraday_BH2011_Arsenal.pdf) - | |
108 | [2015](https://www.blackhat.com/us-15/arsenal.html#faraday) - | |
109 | [2016](https://www.blackhat.com/us-16/arsenal.html#faraday) - | |
110 | [2017](https://www.blackhat.com/us-17/event-sponsors.html#faraday) - | |
111 | [2018](https://www.blackhat.com/us-18/event-sponsors.html#faraday) | |
104 | 112 | |
105 | * Zero Nights - 2016 | |
106 | * https://www.slideshare.net/AlexanderLeonov2/enterprise-vulnerability-management-zeronights16 | |
113 | * Asia ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/singapore.png): | |
114 | [2016](https://www.blackhat.com/asia-16/arsenal.html#faraday) - | |
115 | [2017](https://www.blackhat.com/asia-17/arsenal.html#faraday) - | |
116 | [2018](https://www.blackhat.com/asia-18/arsenal.html#faraday-v3-collaborative-penetration-test-and-vulnerability-management-platform) | |
107 | 117 | |
108 | * AV Tokio - 2016: | |
109 | * http://en.avtokyo.org/avtokyo2016/event | |
118 | * Europe ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/europe.png): | |
119 | [2015](https://www.blackhat.com/eu-15/arsenal.html#faraday) - | |
120 | [2016](https://www.blackhat.com/eu-16/arsenal.html#faraday) | |
110 | 121 | |
111 | * Black Hat Arsenal USA - 2016: | |
122 | * RSA USA ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/usa.png): | |
123 | [2015](https://www.rsaconference.com/events/us15/expo-sponsors/exhibitor-list/1782/infobyte-llc) | |
112 | 124 | |
113 | * https://www.blackhat.com/us-16/arsenal.html#faraday | |
125 | * HITBSecConf Dubai ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/uae.png): | |
126 | [2018](https://conference.hitb.org/hitbsecconf2018dxb/hitb-armory/) | |
114 | 127 | |
115 | * Black Hat Arsenal Europe - 2016 | |
116 | * https://www.blackhat.com/eu-16/arsenal.html#faraday | |
128 | * SecurityWeekly ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/usa.png): | |
129 | [2016](http://securityweekly.com/2016/08/02/security-weekly-475-federico-kirschbaum/) | |
117 | 130 | |
118 | * SecurityWeekly - 2016: | |
119 | * http://securityweekly.com/2016/08/02/security-weekly-475-federico-kirschbaum/ | |
131 | * Zero Nights ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/russia.png): | |
132 | [2016](https://www.slideshare.net/AlexanderLeonov2/enterprise-vulnerability-management-zeronights16) | |
120 | 133 | |
121 | * Bsides Latam - 2016: | |
122 | * http://www.infobytesec.com/down/Faraday_BsideLatam_2016.pdf | |
134 | * AVTokyo ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/japan.png): | |
135 | [2016](http://en.avtokyo.org/avtokyo2016/event) - | |
136 | [2018](http://en.avtokyo.org/avtokyo2018/event) | |
123 | 137 | |
124 | * Black Hat Arsenal Asia - 2016: | |
125 | * https://www.blackhat.com/asia-16/arsenal.html#faraday | |
138 | * Tel Aviv-Yafo ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/israel.png): | |
139 | [2018](https://www.meetup.com/infobyte/events/254031671/) | |
126 | 140 | |
127 | * Black Hat Arsenal Europe - 2015: | |
128 | * https://www.blackhat.com/eu-15/arsenal.html#faraday | |
141 | * SECCON ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/japan.png): | |
142 | [2018](https://2018.seccon.jp/seccon/yorozu2018.html) | |
129 | 143 | |
130 | * Black Hat Arsenal USA - 2015: | |
131 | * https://www.blackhat.com/us-15/arsenal.html#faraday | |
132 | * http://blog.infobytesec.com/2015/08/blackhat-2015_24.html | |
133 | 144 | |
134 | * RSA - 2015: | |
135 | * http://www.rsaconference.com/events/us15/expo-sponsors/exhibitor-list/1782/infobyte-llc | |
136 | * http://blog.infobytesec.com/2015/05/infobyte-en-la-rsa-2015.html | |
145 | * PyConAr ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/argentina.png): | |
146 | [2018](https://eventos.python.org.ar/events/pyconar2018/activity/75/) | |
137 | 147 | |
138 | * Ekoparty Security Conference - 2014: | |
139 | * https://www.youtube.com/watch?v=_j0T2S6Ppfo | |
148 | * 8.8 Chile ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/chile.png): | |
149 | [2018](http://blog.infobytesec.com/2018/11/chronicles-of-trip-to-santiago-88-review.html) | |
140 | 150 | |
141 | * Black Hat Arsenal - 2011 | |
142 | * http://www.infobytesec.com/down/Faraday_BH2011_Arsenal.pdf | |
151 | * CharruaCon ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/uruguay.png): | |
152 | [2018](https://charrua.org/presentaciones2018/Love_is_in_the_air__Reverse_Engineering_a_hitty_drone.pdf) | |
143 | 153 | |
144 | * Ekoparty Security Conference - 2010: | |
145 | * http://prezi.com/fw46zt6_zgi8/faraday/ | |
146 | * http://vimeo.com/16516987 | |
154 | * NotPinkCon ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/argentina.png): | |
155 | [2018](https://twitter.com/NotPinkCon) | |
156 | ||
157 | * plusCODE ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/argentina.png): | |
158 | [2018](http://pluscode.cc/portfolio_page/introduccion-practica-al-hardware-hacking/) | |
159 | ||
160 | * BSides LATAM ![](https://raw.github.com/wiki/infobyte/faraday/images/flags/brazil.png): | |
161 | [2016](http://www.infobytesec.com/down/Faraday_BsideLatam_2016.pdf) |
1 | 1 | =========== |
2 | 2 | |
3 | 3 | Please be kind to remove all your pyc files before running faraday if you are updating this piece of software. |
4 | Make sure you run ```./faraday.py --update``` the first time after an update! | |
4 | Make sure you run ```./manage.py migrate``` the first time after an update! | |
5 | 5 | |
6 | 6 | |
7 | 7 | New features in the latest update |
8 | 8 | ===================================== |
9 | 9 | |
10 | 10 | |
11 | 3.4: | |
11 | 3.5 [Jan 16th, 2019]: | |
12 | --- | |
13 | * Redesgin of new/edit vulnerability forms | |
14 | * Add new custom fields feature to vulnerabilities | |
15 | * Add ./manage.py migrate to perform alembic migrations | |
16 | * Faraday will use webargs==4.4.1 because webargs==5.0.0 fails with Python2 | |
17 | * New system for online plugins using Threads, a few fixes for metasploit plugin online also. | |
18 | * Fix Command "python manage.py process-reports" now stops once all reports have been processed | |
19 | * Fix bug in query when it checks if a vulnerability or a workspace exists | |
20 | * Fix Once a workspace is created through the web UI, a folder with its name is created inside ~/.faraday/report/ | |
21 | * The manage.py now has a new support funtionality that creates a .zip file with all the information faraday's support team will need to throubleshoot your issue | |
22 | * Status-check checks PostgreSQL encoding | |
23 | * Fix a bug when fail importation of reports, command duration say "In Progress" forever. | |
24 | * Fix confirmed bug in vulns API | |
25 | * Update websockets code to use latest lib version | |
26 | * bootstrap updated to v3.4.0 | |
27 | * Manage.py support now throws a message once it finishes the process. | |
28 | * Update Lynis to its version 2.7.1 | |
29 | * Updated arp-scan plugin, added support in the Host class for mac address which was deprecated before v3.0 | |
30 | * OpenVAS Plugin now supports OpenVAS v-9.0.3 | |
31 | ||
32 | 3.4 [December 6th, 2018]: | |
12 | 33 | --- |
13 | 34 | * In GTK, check active_workspace its not null |
14 | ||
15 | 35 | * Add fbruteforce services fplugin |
16 | ||
17 | ||
18 | 36 | * Attachments can be added to a vulnerability through the API. |
19 | ||
20 | 37 | * Catch gaierror error on lynis plugin |
21 | ||
22 | 38 | * Add OR and NOT with parenthesis support on status report search |
23 | ||
24 | 39 | * Info API now is public |
25 | 40 | * Web UI now detects Appscan plugin |
26 | ||
27 | 41 | * Improve performance on the workspace using cusotm query |
28 | ||
29 | 42 | * Workspaces can be set as active/disable in welcome page. |
30 | 43 | * Change Nmap plugin, response field in VulnWeb now goes to Data field. |
31 | ||
32 | 44 | * Update code to support latest SQLAlchemy version |
33 | ||
34 | 45 | * Fix `create_vuln` fplugin bug that incorrectly reported duplicated vulns |
35 | ||
46 | * Attachments on a vulnerability can be deleted through the API. | |
47 | * Improvement in the coverage of the tests. | |
36 | 48 | |
37 | 49 | 3.3 [Novemeber 14th, 2018]: |
38 | 50 | --- |
51 | 51 | ioloop_instance = IOLoop.current() |
52 | 52 | _http_server = HTTPServer(WSGIContainer(app)) |
53 | 53 | hostnames = [hostname] |
54 | ||
54 | ||
55 | 55 | #Fixed hostname bug |
56 | 56 | if hostname == "localhost": |
57 | ||
58 | 57 | hostnames.append("127.0.0.1") |
59 | print hostname | |
60 | ||
58 | ||
61 | 59 | listening = False |
62 | 60 | for hostname in hostnames: |
63 | 61 | try: |
53 | 53 | models.create_credential(workspace, obj) |
54 | 54 | old = models.get_credential(workspace, **params) |
55 | 55 | else: |
56 | print "A credential with ID %s already exists!" % old.getID() | |
56 | print("A credential with ID %s already exists!" % old.getID()) | |
57 | 57 | return 2, None |
58 | 58 | |
59 | 59 | return 0, old.getID() |
49 | 49 | else: |
50 | 50 | return 0, None |
51 | 51 | else: |
52 | print "A host with ID %s already exists!" % old_host.getID() | |
52 | print("A host with ID %s already exists!" % old_host.getID()) | |
53 | 53 | return 2, None |
54 | 54 | |
55 | 55 | return 0, old_host.getID() |
53 | 53 | models.create_service(workspace, obj) |
54 | 54 | old = models.get_service(workspace, **params) |
55 | 55 | else: |
56 | print "A service with ID %s already exists!" % old.getID() | |
56 | print("A service with ID %s already exists!" % old.getID()) | |
57 | 57 | |
58 | 58 | res_ids.append(old.getID()) |
59 | 59 |
61 | 61 | try: |
62 | 62 | old_id = ex.answer.json()['object']['_id'] |
63 | 63 | except KeyError: |
64 | print "Vulnerability already exists. Couldn't fetch ID" | |
64 | print("Vulnerability already exists. Couldn't fetch ID") | |
65 | 65 | return 2, None |
66 | 66 | else: |
67 | print "A vulnerability with ID %s already exists!" % old_id | |
67 | print("A vulnerability with ID %s already exists!" % old_id) | |
68 | 68 | return 2, None |
69 | 69 | else: |
70 | print "Unknown error while creating the vulnerability" | |
70 | print("Unknown error while creating the vulnerability") | |
71 | 71 | return 2, None |
72 | 72 | except CantCommunicateWithServerError as ex: |
73 | print "Error while creating vulnerability:", ex.response.text | |
73 | print("Error while creating vulnerability:", ex.response.text) | |
74 | 74 | return 2, None |
75 | 75 | |
76 | 76 | new = models.get_vulns( |
81 | 81 | models.create_vuln_web(workspace, obj) |
82 | 82 | old = models.get_web_vuln(workspace, **params) |
83 | 83 | else: |
84 | print "A web vulnerability with ID %s already exists!" % old.getID() | |
84 | print("A web vulnerability with ID %s already exists!" % old.getID()) | |
85 | 85 | return 2, None |
86 | 86 | |
87 | 87 | return 0, old.getID() |
140 | 140 | |
141 | 141 | # Muestro los servicios en el workspace soportados por hydra, en formato tabla |
142 | 142 | table_services, services = show_table_services(workspace) |
143 | print table_services | |
143 | print(table_services) | |
144 | 144 | |
145 | 145 | service = int(input_index("What service do you want to bruteforce?", len(services))) |
146 | 146 | |
147 | 147 | # Verifico si el usuario quiere armar un diccionario con las credenciales |
148 | 148 | # guardadas en faraday o si quiere utilizar uno propio |
149 | print "\n[0] Choose a dictionary" | |
150 | print "[1] Create dictionary from Faraday (based in credentials stored in Faraday)\n" | |
149 | print("\n[0] Choose a dictionary") | |
150 | print("[1] Create dictionary from Faraday (based in credentials stored in Faraday)\n") | |
151 | 151 | |
152 | 152 | dictionary = int(input_index("Options ", 2)) |
153 | 153 | |
159 | 159 | |
160 | 160 | else: |
161 | 161 | |
162 | print "\n[*] Obtaining credentials from the workspace %s" % workspace | |
162 | print("\n[*] Obtaining credentials from the workspace %s" % workspace) | |
163 | 163 | |
164 | 164 | user_faraday = save_targets(get_credentials(workspace, "username")) |
165 | 165 | passwd_faraday = save_targets(get_credentials(workspace, "password")) |
166 | 166 | |
167 | print "[*] Credentials found: %s" % total_credentials(workspace) | |
168 | print "\nUsername\t\tPassword" | |
169 | print "--------\t\t--------" | |
167 | print("[*] Credentials found: %s" % total_credentials(workspace)) | |
168 | print("\nUsername\t\tPassword") | |
169 | print("--------\t\t--------") | |
170 | 170 | |
171 | 171 | for user, passw in zip( |
172 | 172 | open(user_faraday, "r"), open(passwd_faraday, "r")): |
173 | 173 | |
174 | print "%s\t\t%s" % (user.strip(), passw.strip()) | |
174 | print("%s\t\t%s" % (user.strip(), passw.strip())) | |
175 | 175 | |
176 | 176 | |
177 | 177 | return service, services, user_define_dictionary, user_faraday, passwd_faraday, usernames_dic_path, passwords_dic_path |
190 | 190 | |
191 | 191 | def main(workspace='', args=None, parser=None): |
192 | 192 | |
193 | print "\nThis script needs to be run inside from Faraday GTK.\n" | |
193 | print("\nThis script needs to be run inside from Faraday GTK.\n") | |
194 | 194 | if check_hydra(): |
195 | 195 | |
196 | 196 | service, services, user_define_dictionary, user_faraday, passwd_faraday, usernames_dic_path, passwords_dic_path = show_options(workspace) |
201 | 201 | |
202 | 202 | hydra_output = "/tmp/hydra_output-%s.txt" % time.time() |
203 | 203 | |
204 | print "Running Hydra, please wait to finish the bruteforce...\n" | |
204 | print("Running Hydra, please wait to finish the bruteforce...\n") | |
205 | 205 | |
206 | 206 | if user_define_dictionary: |
207 | 207 | |
226 | 226 | add_output(hydra_command2) |
227 | 227 | call(shlex.split(hydra_command2)) |
228 | 228 | |
229 | print "Processing information found in Faraday...\n" | |
229 | print("Processing information found in Faraday...\n") | |
230 | 230 | send_output(hydra_output) |
231 | 231 | |
232 | 232 | return None, None |
66 | 66 | Fore.RESET) |
67 | 67 | |
68 | 68 | if not port_list and not parsed_args.no_filter: |
69 | print "Empty filter set." | |
69 | print("Empty filter set.") | |
70 | 70 | return 1, None |
71 | 71 | |
72 | 72 | if parsed_args.additional_info and not parsed_args.no_filter: |
73 | print 'Filtering services for ports: ' + ', '.join(map(str, sorted(port_list))) | |
73 | print('Filtering services for ports: ' + ', '.join(map(str, sorted(port_list)))) | |
74 | 74 | |
75 | 75 | columns = filter(None, parsed_args.columns.split(',')) |
76 | 76 | |
96 | 96 | lines += [column_data] |
97 | 97 | |
98 | 98 | if not lines: |
99 | print "No services running on that port found." | |
99 | print("No services running on that port found.") | |
100 | 100 | return 0, None |
101 | 101 | |
102 | 102 | col_width = max(len(word) for row in lines for word in row) + 2 |
103 | 103 | |
104 | 104 | if parsed_args.additional_info: |
105 | print ''.join(col.ljust(col_width) for col in columns) | |
106 | print '-' * (col_width * len(columns)) | |
105 | print(''.join(col.ljust(col_width) for col in columns)) | |
106 | print('-' * (col_width * len(columns))) | |
107 | 107 | |
108 | 108 | if parsed_args.sorted: |
109 | 109 | # Compare lines using the first column (IP) |
110 | 110 | for row in sorted(lines, cmp=lambda l1, l2: cmp(l1[0], l2[0])): |
111 | print "".join(word.ljust(col_width) for word in row) | |
111 | print("".join(word.ljust(col_width) for word in row)) | |
112 | 112 | else: |
113 | 113 | for row in lines: |
114 | print "".join(word.ljust(col_width) for word in row) | |
114 | print("".join(word.ljust(col_width) for word in row)) | |
115 | 115 | |
116 | 116 | return 0, None |
120 | 120 | ret, obj_id = call_main(workspace=args.workspace, args=unknown, parser=new_parser) |
121 | 121 | |
122 | 122 | if obj_id is not None: |
123 | print obj_id | |
123 | print(obj_id) | |
124 | 124 | else: |
125 | 125 | # Use old API to call plugin |
126 | 126 | sys.stderr.write(Fore.YELLOW + |
132 | 132 | ret = 0 |
133 | 133 | |
134 | 134 | if args.interactive: |
135 | # print 'code = %d' % ret | |
135 | # print ('code = %d' % ret) | |
136 | 136 | return obj_id |
137 | 137 | else: |
138 | 138 | sys.exit(ret) |
191 | 191 | dispatch(args, unknown, parser.format_help(), args.username, args.password) |
192 | 192 | else: |
193 | 193 | |
194 | # print "Loading command history..." | |
194 | # print ("Loading command history...") | |
195 | 195 | histfile = os.path.join(CONF.getDataPath(), ".faraday_hist") |
196 | 196 | readline.parse_and_bind('tab: complete') |
197 | 197 | atexit.register(readline.write_history_file, histfile) |
203 | 203 | except IOError: |
204 | 204 | pass |
205 | 205 | |
206 | print "Welcome to interactive Faraday!" | |
207 | print "Press CTRL-D or run 'exit' to quit interactive mode." | |
206 | print("Welcome to interactive Faraday!") | |
207 | print("Press CTRL-D or run 'exit' to quit interactive mode.") | |
208 | 208 | last_id = None |
209 | 209 | |
210 | 210 | while True: |
0 | #!/usr/bin/env python2.7 | |
1 | # -*- coding: utf-8 -*- | |
2 | ''' | |
3 | Faraday Penetration Test IDE | |
4 | Copyright (C) 2016 Infobyte LLC (http://www.infobytesec.com/) | |
5 | See the file 'doc/LICENSE' for the license information | |
6 | ''' | |
7 | import json | |
8 | ||
9 | import requests | |
10 | ||
11 | from persistence.server import models | |
12 | ||
13 | __description__ = 'Get Vulns filtered by Severity and change Severity based in CWE' | |
14 | __prettyname__ = 'Get Severity By CWE' | |
15 | ||
16 | SEVERITY_OPTIONS = ('unclassified', 'info', 'low', 'med', 'high', 'critical', 'all') | |
17 | ||
18 | ||
19 | def getCweData(couch_url): | |
20 | # Get elements from cwe DB in couchdb | |
21 | headers = {'Content-Type': 'application/json'} | |
22 | ||
23 | payload = { | |
24 | 'map': | |
25 | 'function(doc) { if(doc.severity && doc.name){' | |
26 | 'emit(doc.name, doc.severity); }}' | |
27 | } | |
28 | ||
29 | r = requests.post( | |
30 | couch_url + '/cwe/_temp_view', | |
31 | headers=headers, | |
32 | data=json.dumps(payload) | |
33 | ) | |
34 | ||
35 | response_code = r.status_code | |
36 | ||
37 | if response_code == 200: | |
38 | ||
39 | data = r.json()['rows'] | |
40 | dict = {} | |
41 | ||
42 | for item in data: | |
43 | ||
44 | value = item['value'] | |
45 | if value == 'informational': | |
46 | value = 'info' | |
47 | ||
48 | dict.update({item['key']: value}) | |
49 | ||
50 | if dict == {}: | |
51 | return None | |
52 | else: | |
53 | print 'Get CWE data: OK\n' | |
54 | return dict | |
55 | ||
56 | elif response_code == 401: | |
57 | print 'Autorization required, make sure to add user:pwd to Couch URI' | |
58 | else: | |
59 | print 'Error couchDB: ' + str(response_code) + str(r.text) | |
60 | ||
61 | ||
62 | def checkSeverity(vuln, cwe_dict, severity_choose, workspace, couch_url): | |
63 | severity_dict = { | |
64 | 'unclassified': 0, | |
65 | 'info': 1, | |
66 | 'low': 2, | |
67 | 'med': 3, | |
68 | 'high': 4, | |
69 | 'critical': 5, | |
70 | 'all': 100 | |
71 | } | |
72 | ||
73 | if vuln._name in cwe_dict and severity_dict[vuln.severity] <= severity_dict[severity_choose]: | |
74 | ||
75 | print 'Change: ' + vuln._name + ' to ' + cwe_dict[vuln._name] | |
76 | ||
77 | # Get object Vuln | |
78 | response = requests.get( | |
79 | models.server.SERVER_URL + '/' + workspace + '/' + str(vuln._id) | |
80 | ) | |
81 | vulnWeb = response.json() | |
82 | ||
83 | # Change severity | |
84 | vulnWeb['severity'] = cwe_dict[vuln._name] | |
85 | ||
86 | # Put changes... | |
87 | headers = {'Content-Type': 'application/json'} | |
88 | update = requests.put( | |
89 | couch_url + '/' + workspace + '/' + vuln._id, | |
90 | headers=headers, | |
91 | data=json.dumps(vulnWeb) | |
92 | ) | |
93 | ||
94 | if update.status_code == 200 or update.status_code == 201: | |
95 | print 'Change OK\n' | |
96 | else: | |
97 | print 'Error in update Vulnerability, status code: ' + str(update.status_code) | |
98 | print update.text | |
99 | ||
100 | ||
101 | def main(workspace='', args=None, parser=None): | |
102 | parser.add_argument('severity', nargs='?', help='Filter by Severity (<=)', default="info", choices=SEVERITY_OPTIONS) | |
103 | parser.add_argument('--couchdb', nargs='?', help='CouchDB URL', default="http://faraday:faraday@localhost:5984") | |
104 | ||
105 | parsed_args = parser.parse_args(args) | |
106 | ||
107 | cwe = getCweData(parsed_args.couchdb) | |
108 | ||
109 | if cwe is None: | |
110 | print 'CWE DB not downloaded....EXIT' | |
111 | return 2, None | |
112 | ||
113 | for host in models.get_hosts(workspace): | |
114 | for v in host.getVulns(): | |
115 | checkSeverity(v, cwe, parsed_args.severity, workspace, parsed_args.couchdb) | |
116 | ||
117 | for i in host.getAllInterfaces(): | |
118 | for s in i.getAllServices(): | |
119 | for v in s.getVulns(): | |
120 | checkSeverity(v, cwe, parsed_args.severity, workspace, parsed_args.couchdb) | |
121 | ||
122 | return 0, None |
0 | #!/usr/bin/env python2.7 | |
1 | # -*- coding: utf-8 -*- | |
2 | ''' | |
3 | Faraday Penetration Test IDE | |
4 | Copyright (C) 2016 Infobyte LLC (http://www.infobytesec.com/) | |
5 | See the file 'doc/LICENSE' for the license information | |
6 | ''' | |
7 | import json | |
8 | ||
9 | import requests | |
10 | ||
11 | from persistence.server import models | |
12 | ||
13 | __description__ = 'Get Vulns filtered by Severity and change Severity based in CWE' | |
14 | __prettyname__ = 'Get Severity By CWE' | |
15 | ||
16 | SEVERITY_OPTIONS = ('unclassified', 'info', 'low', 'med', 'high', 'critical', 'all') | |
17 | ||
18 | ||
19 | def getCweData(couch_url): | |
20 | # Get elements from cwe DB in couchdb | |
21 | headers = {'Content-Type': 'application/json'} | |
22 | ||
23 | payload = { | |
24 | 'map': | |
25 | 'function(doc) { if(doc.severity && doc.name){' | |
26 | 'emit(doc.name, doc.severity); }}' | |
27 | } | |
28 | ||
29 | r = requests.post( | |
30 | couch_url + '/cwe/_temp_view', | |
31 | headers=headers, | |
32 | data=json.dumps(payload) | |
33 | ) | |
34 | ||
35 | response_code = r.status_code | |
36 | ||
37 | if response_code == 200: | |
38 | ||
39 | data = r.json()['rows'] | |
40 | dict = {} | |
41 | ||
42 | for item in data: | |
43 | ||
44 | value = item['value'] | |
45 | if value == 'informational': | |
46 | value = 'info' | |
47 | ||
48 | dict.update({item['key']: value}) | |
49 | ||
50 | if dict == {}: | |
51 | return None | |
52 | else: | |
53 | print('Get CWE data: OK\n') | |
54 | return dict | |
55 | ||
56 | elif response_code == 401: | |
57 | print('Autorization required, make sure to add user:pwd to Couch URI') | |
58 | else: | |
59 | print('Error couchDB: ' + str(response_code) + str(r.text)) | |
60 | ||
61 | ||
62 | def checkSeverity(vuln, cwe_dict, severity_choose, workspace, couch_url): | |
63 | severity_dict = { | |
64 | 'unclassified': 0, | |
65 | 'info': 1, | |
66 | 'low': 2, | |
67 | 'med': 3, | |
68 | 'high': 4, | |
69 | 'critical': 5, | |
70 | 'all': 100 | |
71 | } | |
72 | ||
73 | if vuln._name in cwe_dict and severity_dict[vuln.severity] <= severity_dict[severity_choose]: | |
74 | ||
75 | print('Change: ' + vuln._name + ' to ' + cwe_dict[vuln._name]) | |
76 | ||
77 | # Get object Vuln | |
78 | response = requests.get( | |
79 | models.server.SERVER_URL + '/' + workspace + '/' + str(vuln._id) | |
80 | ) | |
81 | vulnWeb = response.json() | |
82 | ||
83 | # Change severity | |
84 | vulnWeb['severity'] = cwe_dict[vuln._name] | |
85 | ||
86 | # Put changes... | |
87 | headers = {'Content-Type': 'application/json'} | |
88 | update = requests.put( | |
89 | couch_url + '/' + workspace + '/' + vuln._id, | |
90 | headers=headers, | |
91 | data=json.dumps(vulnWeb) | |
92 | ) | |
93 | ||
94 | if update.status_code == 200 or update.status_code == 201: | |
95 | print('Change OK\n') | |
96 | else: | |
97 | print('Error in update Vulnerability, status code: ' + str(update.status_code)) | |
98 | print(update.text) | |
99 | ||
100 | ||
101 | def main(workspace='', args=None, parser=None): | |
102 | parser.add_argument('severity', nargs='?', help='Filter by Severity (<=)', default="info", choices=SEVERITY_OPTIONS) | |
103 | parser.add_argument('--couchdb', nargs='?', help='CouchDB URL', default="http://faraday:faraday@localhost:5984") | |
104 | ||
105 | parsed_args = parser.parse_args(args) | |
106 | ||
107 | cwe = getCweData(parsed_args.couchdb) | |
108 | ||
109 | if cwe is None: | |
110 | print('CWE DB not downloaded....EXIT') | |
111 | return 2, None | |
112 | ||
113 | for host in models.get_hosts(workspace): | |
114 | for v in host.getVulns(): | |
115 | checkSeverity(v, cwe, parsed_args.severity, workspace, parsed_args.couchdb) | |
116 | ||
117 | for i in host.getAllInterfaces(): | |
118 | for s in i.getAllServices(): | |
119 | for v in s.getVulns(): | |
120 | checkSeverity(v, cwe, parsed_args.severity, workspace, parsed_args.couchdb) | |
121 | ||
122 | return 0, None |
132 | 132 | datetime_object = datetime.strptime(date, "%m/%d/%Y") |
133 | 133 | host._metadata.create_time = mktime(datetime_object.timetuple()) |
134 | 134 | except Exception: |
135 | print "Invalid date", host.name | |
135 | print("Invalid date", host.name) | |
136 | 136 | |
137 | 137 | return host |
138 | 138 | |
183 | 183 | datetime_object = datetime.strptime(date, "%m/%d/%Y") |
184 | 184 | vulnerability._metadata.create_time = mktime(datetime_object.timetuple()) |
185 | 185 | except Exception: |
186 | print "Invalid date", vulnerability.name | |
186 | print("Invalid date", vulnerability.name) | |
187 | 187 | |
188 | 188 | return vulnerability |
189 | 189 | |
221 | 221 | datetime_object = datetime.strptime(date, "%m/%d/%Y") |
222 | 222 | vulnerability_web._metadata.create_time = mktime(datetime_object.timetuple()) |
223 | 223 | except Exception: |
224 | print "Invalid date", vulnerability_web.name | |
224 | print("Invalid date", vulnerability_web.name) | |
225 | 225 | |
226 | 226 | return vulnerability_web |
227 | 227 | |
234 | 234 | parsed_args = parser.parse_args(args) |
235 | 235 | |
236 | 236 | if not parsed_args.csv: |
237 | print "Error: Give a CSV file to import with --csv" | |
237 | print("Error: Give a CSV file to import with --csv") | |
238 | 238 | return 2, None |
239 | 239 | |
240 | 240 | try: |
241 | 241 | file_csv = open(parsed_args.csv, "r") |
242 | 242 | except: |
243 | print "Error: Unreadeable CSV file, check the path" | |
243 | print("Error: Unreadeable CSV file, check the path") | |
244 | 244 | raise |
245 | 245 | |
246 | 246 | counter = 0 |
256 | 256 | |
257 | 257 | counter += 1 |
258 | 258 | |
259 | print "New host: " + host.getName() | |
259 | print("New host: " + host.getName()) | |
260 | 260 | try: |
261 | 261 | models.create_host(WORKSPACE, host) |
262 | 262 | except Exception as ex: |
275 | 275 | if not old_service: |
276 | 276 | |
277 | 277 | counter += 1 |
278 | print "New service: " + service.getName() | |
278 | print("New service: " + service.getName()) | |
279 | 279 | models.create_service(WORKSPACE, service) |
280 | 280 | service = models.get_service(WORKSPACE, **service_params) |
281 | 281 | |
300 | 300 | |
301 | 301 | if not models.get_vuln(WORKSPACE, **vuln_params): |
302 | 302 | counter += 1 |
303 | print "New vulnerability: " + vulnerability.getName() | |
303 | print("New vulnerability: " + vulnerability.getName()) | |
304 | 304 | models.create_vuln(WORKSPACE, vulnerability) |
305 | 305 | |
306 | 306 | elif vulnerability_web is not None: |
319 | 319 | if not models.get_web_vuln(WORKSPACE, **vuln_web_params): |
320 | 320 | |
321 | 321 | counter += 1 |
322 | print "New web vulnerability: " + vulnerability_web.getName() | |
322 | print("New web vulnerability: " + vulnerability_web.getName()) | |
323 | 323 | models.create_vuln_web(WORKSPACE, vulnerability_web) |
324 | 324 | except ConflictInDatabase: |
325 | 325 | print('Conflict in Database, skiping csv row') |
326 | 326 | except CantCommunicateWithServerError as ex: |
327 | 327 | print(register) |
328 | 328 | print('Error', ex) |
329 | print "[*]", counter, "new Faraday objects created." | |
329 | print("[*]", counter, "new Faraday objects created.") | |
330 | 330 | file_csv.close() |
331 | 331 | return 0, None |
31 | 31 | from pcapfile import savefile |
32 | 32 | import pcapfile |
33 | 33 | except ImportError: |
34 | print 'capfile not found, please install it to use this plugin.' \ | |
35 | ' You can do it executing pip2 install pcapfile in a shell.' | |
34 | print('capfile not found, please install it to use this plugin.' \ | |
35 | ' You can do it executing pip2 install pcapfile in a shell.') | |
36 | 36 | return 1, None |
37 | 37 | |
38 | 38 | if not os.path.isfile(parsed_args.pcap): |
39 | print "pcap file not found: " % parsed_args.pcap | |
39 | print("pcap file not found: " % parsed_args.pcap) | |
40 | 40 | return 2, None |
41 | 41 | |
42 | 42 | testcap = open(parsed_args.pcap, 'rb') |
44 | 44 | try: |
45 | 45 | capfile = savefile.load_savefile(testcap, layers=2, verbose=parsed_args.verbose) |
46 | 46 | except pcapfile.Error: |
47 | print "Invalid pcap file" | |
47 | print("Invalid pcap file") | |
48 | 48 | return 3, None |
49 | 49 | |
50 | print 'pcap file loaded. Parsing packets...' | |
50 | print('pcap file loaded. Parsing packets...') | |
51 | 51 | |
52 | 52 | # Set() to store already added hosts. This will save an enormous amount of time by not querying the database |
53 | 53 | # for hosts we already know are in Faraday |
81 | 81 | if old is None: |
82 | 82 | if not parsed_args.dry_run: |
83 | 83 | models.create_host(workspace, obj) |
84 | print '%s\t%s' % (src, obj.getID()) | |
84 | print('%s\t%s' % (src, obj.getID())) | |
85 | 85 | |
86 | 86 | if dst not in added: |
87 | 87 | |
97 | 97 | if old is None: |
98 | 98 | if not parsed_args.dry_run: |
99 | 99 | models.create_host(workspace, obj) |
100 | print '%s\t%s' % (dst, obj.getID()) | |
100 | print('%s\t%s' % (dst, obj.getID())) | |
101 | 101 | |
102 | 102 | return 0, None |
19 | 19 | for host in models.get_hosts(workspace): |
20 | 20 | |
21 | 21 | if not parsed_args.os_filter or (parsed_args.os_filter and host.os in parsed_args.os_filter): |
22 | print '%s\t%s' % (host.name, host.os) | |
22 | print('%s\t%s' % (host.name, host.os)) | |
23 | 23 | |
24 | 24 | return 0, None |
28 | 28 | host_count[host.os] = 1 |
29 | 29 | |
30 | 30 | else: |
31 | print host.os | |
31 | print(host.os) | |
32 | 32 | |
33 | 33 | if parsed_args.unique: |
34 | 34 | for host, count in host_count.items(): |
35 | print '%s\t(%d)' % (host, count) | |
35 | print('%s\t(%d)' % (host, count)) | |
36 | 36 | |
37 | 37 | return 0, None |
88 | 88 | for event, elem in ET.iterparse(f, ('start', )): |
89 | 89 | root = elem.tag |
90 | 90 | break |
91 | except SyntaxError, err: | |
92 | print "Not an xml file.\n %s" % (err) | |
91 | except SyntaxError as err: | |
92 | print("Not an xml file.\n %s" % (err)) | |
93 | 93 | return False |
94 | 94 | |
95 | except IOError, err: | |
96 | print "Error while opening file.\n%s. %s" % (err, self.filepath) | |
95 | except IOError as err: | |
96 | print("Error while opening file.\n%s. %s" % (err, self.filepath)) | |
97 | 97 | return False |
98 | 98 | |
99 | 99 | finally: |
108 | 108 | f = open(self.filepath) |
109 | 109 | try: |
110 | 110 | tree = ET.fromstring(f.read()) |
111 | except SyntaxError, err: | |
112 | print "SyntaxError: %s. %s" % (err, self.filepath) | |
111 | except SyntaxError as err: | |
112 | print("SyntaxError: %s. %s" % (err, self.filepath)) | |
113 | 113 | return None |
114 | 114 | return tree |
115 | 115 |
1 | 1 | <faraday> |
2 | 2 | |
3 | 3 | <appname>Faraday - Penetration Test IDE</appname> |
4 | <version>3.3</version> | |
4 | <version>3.5.0</version> | |
5 | 5 | <debug_status>0</debug_status> |
6 | 6 | <font>-Misc-Fixed-medium-r-normal-*-12-100-100-100-c-70-iso8859-1</font> |
7 | 7 | <home_path>~/</home_path> |
0 | with (import <nixpkgs> {}); | |
1 | let | |
2 | server_pkgs = callPackage ./nix/server {}; | |
3 | in | |
4 | { | |
5 | server = server_pkgs.server; | |
6 | python = server_pkgs.python; | |
7 | } |
19 | 19 | from utils import dependencies |
20 | 20 | from utils.user_input import query_yes_no |
21 | 21 | from faraday import FARADAY_BASE |
22 | from alembic.script import ScriptDirectory | |
23 | from alembic.config import Config | |
24 | from alembic.migration import MigrationContext | |
22 | 25 | except ImportError as ex: |
23 | 26 | print(ex) |
24 | 27 | print('Missing dependencies.\nPlease execute: pip install -r requirements_server.txt') |
122 | 125 | sys.exit(1) |
123 | 126 | |
124 | 127 | |
128 | def check_alembic_version(): | |
129 | config = Config() | |
130 | config.set_main_option("script_location", "migrations") | |
131 | script = ScriptDirectory.from_config(config) | |
132 | ||
133 | head_revision = script.get_current_head() | |
134 | with app.app_context(): | |
135 | conn = db.session.connection() | |
136 | context = MigrationContext.configure(conn) | |
137 | ||
138 | if head_revision != context.get_current_revision(): | |
139 | print('--' * 20) | |
140 | print('Missing migrations, please execute: \n\n') | |
141 | print('python manage.py migrate --upgrade head') | |
142 | sys.exit(1) | |
143 | ||
125 | 144 | def main(): |
145 | os.chdir(FARADAY_BASE) | |
126 | 146 | check_postgresql() |
127 | os.chdir(FARADAY_BASE) | |
147 | check_alembic_version() | |
128 | 148 | parser = argparse.ArgumentParser() |
129 | 149 | parser.add_argument('--ssl', action='store_true', help='enable HTTPS') |
130 | 150 | parser.add_argument('--debug', action='store_true', help='run Faraday Server in debug mode') |
6 | 6 | ''' |
7 | 7 | |
8 | 8 | import re |
9 | import sys | |
9 | 10 | |
10 | 11 | import click |
11 | 12 | import requests |
12 | import sys | |
13 | from alembic.config import CommandLine | |
13 | 14 | |
14 | 15 | import server.config |
15 | 16 | from persistence.server.server import _conf, FARADAY_UP, SERVER_URL |
19 | 20 | from server.commands.reports import import_external_reports |
20 | 21 | from server.commands import status_check as status_check_functions |
21 | 22 | from server.commands import change_password as change_pass |
23 | from server.commands.custom_fields import add_custom_field_main, delete_custom_field_main | |
24 | from server.commands import support as support_zip | |
22 | 25 | from server.models import db, User |
23 | 26 | from server.importer import ImportCouchDB |
24 | 27 | |
119 | 122 | if check_postgresql: |
120 | 123 | # exit_code was created for Faraday automation-testing purposes |
121 | 124 | exit_code = status_check_functions.print_postgresql_status() |
122 | status_check_functions.print_postgresql_locks_status() | |
125 | status_check_functions.print_postgresql_other_status() | |
123 | 126 | selected = True |
124 | 127 | |
125 | 128 | if check_faraday: |
194 | 197 | click.echo(click.style( |
195 | 198 | 'Tables created successfully!', |
196 | 199 | fg='green', bold=True)) |
200 | ||
201 | @click.command(help="Generates a .zip file with technical information") | |
202 | def support(): | |
203 | support_zip.all_for_support() | |
204 | ||
205 | ||
206 | @click.command( | |
207 | context_settings={"ignore_unknown_options": True}, | |
208 | help='Migrates database schema. If the target revision ' | |
209 | 'is not specified, use "head" when upgrading and "-1" when ' | |
210 | 'downgrading') | |
211 | @click.option( | |
212 | '--downgrade', | |
213 | help="Perform a downgrade migration instead of an upgrade one", | |
214 | is_flag=True) | |
215 | @click.argument( | |
216 | 'revision', | |
217 | required=False, | |
218 | ) | |
219 | def migrate(downgrade, revision): | |
220 | revision = revision or ("-1" if downgrade else "head") | |
221 | action = "downgrade" if downgrade else "upgrade" | |
222 | CommandLine(prog=None).main(argv=[action, revision]) | |
223 | ||
224 | ||
225 | @click.command(help='Custom field wizard') | |
226 | def add_custom_field(): | |
227 | add_custom_field_main() | |
228 | ||
229 | ||
230 | @click.command(help='Custom field delete wizard') | |
231 | def delete_custom_field(): | |
232 | delete_custom_field_main() | |
197 | 233 | |
198 | 234 | |
199 | 235 | cli.add_command(process_reports) |
206 | 242 | cli.add_command(status_check) |
207 | 243 | cli.add_command(create_tables) |
208 | 244 | cli.add_command(change_password) |
209 | ||
245 | cli.add_command(migrate) | |
246 | cli.add_command(add_custom_field) | |
247 | cli.add_command(delete_custom_field) | |
248 | cli.add_command(support) | |
210 | 249 | |
211 | 250 | if __name__ == '__main__': |
212 | 251 | cli() |
0 | #!/usr/bin/env python | |
1 | ''' | |
0 | """ | |
2 | 1 | Faraday Penetration Test IDE |
3 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
2 | Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) | |
4 | 3 | See the file 'doc/LICENSE' for the license information |
5 | ||
6 | ''' | |
4 | """ | |
5 | ||
7 | 6 | import json |
8 | ||
9 | ||
10 | 7 | import os |
11 | 8 | import re |
12 | 9 | import time |
13 | 10 | import traceback |
14 | from threading import Thread | |
15 | ||
11 | ||
12 | from random import random | |
13 | from threading import Thread, Timer | |
16 | 14 | from utils.logs import getLogger |
15 | ||
16 | from config.configuration import getInstanceConfiguration | |
17 | CONF = getInstanceConfiguration() | |
17 | 18 | |
18 | 19 | try: |
19 | 20 | import xml.etree.cElementTree as ET |
20 | ||
21 | 21 | except ImportError: |
22 | print "cElementTree could not be imported. Using ElementTree instead" | |
22 | print("cElementTree could not be imported. Using ElementTree instead") | |
23 | 23 | import xml.etree.ElementTree as ET |
24 | 24 | |
25 | from config.configuration import getInstanceConfiguration | |
26 | CONF = getInstanceConfiguration() | |
27 | ||
28 | ||
29 | class ReportProcessor(): | |
25 | ||
26 | class OnlinePlugins(Thread): | |
27 | ||
28 | def __init__(self, plugin_controller): | |
29 | ||
30 | Thread.__init__(self) | |
31 | self.setDaemon(True) | |
32 | self._stop = False | |
33 | ||
34 | self.online_plugins = { | |
35 | "MetasploitOn": { | |
36 | "time": 30, | |
37 | "command": "./metasploiton online"}, | |
38 | "Beef": { | |
39 | "time": 30, | |
40 | "command": "./beef online"}, | |
41 | "Sentinel": { | |
42 | "time": 60, | |
43 | "command": "sentinel"} | |
44 | } | |
45 | ||
46 | self.plugins_settings = CONF.getPluginSettings() | |
47 | self.plugin_controller = plugin_controller | |
48 | ||
49 | def runPluginThread(self, cmd): | |
50 | random_id = random() | |
51 | self.plugin_controller.processCommandInput(random_id, cmd, './') | |
52 | self.plugin_controller.onCommandFinished(random_id, 0, cmd) | |
53 | getLogger(self).debug("Running online plugin...") | |
54 | ||
55 | def stop(self): | |
56 | self._stop = True | |
57 | ||
58 | def run(self): | |
59 | ||
60 | while not self._stop: | |
61 | ||
62 | for name, config_dict in self.online_plugins.iteritems(): | |
63 | if name in self.plugins_settings: | |
64 | if self.plugins_settings[name]['settings']['Enable'] == "1": | |
65 | ||
66 | t = Timer( | |
67 | config_dict["time"], | |
68 | self.runPluginThread, args=(config_dict["command"],)) | |
69 | ||
70 | getLogger(self).debug( | |
71 | "Starting Thread for online plugin: %s" % name) | |
72 | ||
73 | self.online_plugins[name]["thread_running"] = True | |
74 | t.start() | |
75 | ||
76 | time.sleep(60) | |
77 | ||
78 | ||
79 | class ReportProcessor: | |
80 | ||
30 | 81 | def __init__(self, plugin_controller, ws_name=None): |
31 | 82 | self.plugin_controller = plugin_controller |
32 | 83 | self.ws_name = ws_name |
33 | 84 | |
34 | 85 | def processReport(self, filename): |
35 | """ | |
36 | Process one Report | |
37 | """ | |
86 | """ Process one Report """ | |
38 | 87 | getLogger(self).debug("Report file is %s" % filename) |
39 | 88 | |
40 | 89 | parser = ReportParser(filename) |
41 | 90 | |
42 | 91 | if parser.report_type is None: |
92 | ||
43 | 93 | getLogger(self).error( |
44 | 94 | 'Plugin not found: automatic and manual try!') |
45 | 95 | return False |
48 | 98 | |
49 | 99 | def sendReport(self, plugin_id, filename): |
50 | 100 | """Sends a report to the appropiate plugin specified by plugin_id""" |
101 | ||
51 | 102 | getLogger(self).info( |
52 | 103 | 'The file is %s, %s' % (filename, plugin_id)) |
53 | command_id = self.plugin_controller.processReport(plugin_id, filename, ws_name=self.ws_name) | |
104 | ||
105 | command_id = self.plugin_controller.processReport( | |
106 | plugin_id, filename, ws_name=self.ws_name) | |
107 | ||
54 | 108 | if not command_id: |
109 | ||
55 | 110 | getLogger(self).error( |
56 | "Faraday doesn't have a plugin for this tool..." | |
57 | " Processing: ABORT") | |
111 | "Faraday doesn't have a plugin for this tool... Processing: ABORT") | |
58 | 112 | return False |
113 | ||
59 | 114 | return command_id |
60 | 115 | |
61 | def onlinePlugin(self, cmd): | |
62 | _, new_cmd = self.plugin_controller.processCommandInput('0', cmd, './') | |
63 | self.plugin_controller.onCommandFinished('0', 0, cmd) | |
64 | ||
65 | 116 | |
66 | 117 | class ReportManager(Thread): |
118 | ||
67 | 119 | def __init__(self, timer, ws_name, plugin_controller, polling=True): |
120 | ||
68 | 121 | Thread.__init__(self) |
69 | 122 | self.setDaemon(True) |
123 | ||
70 | 124 | self.polling = polling |
71 | 125 | self.ws_name = ws_name |
72 | 126 | self.timer = timer |
73 | 127 | self._stop = False |
128 | ||
74 | 129 | self._report_path = os.path.join(CONF.getReportPath(), ws_name) |
75 | 130 | self._report_ppath = os.path.join(self._report_path, "process") |
76 | 131 | self._report_upath = os.path.join(self._report_path, "unprocessed") |
132 | ||
77 | 133 | self.processor = ReportProcessor(plugin_controller, ws_name) |
134 | self.online_plugins = OnlinePlugins(plugin_controller) | |
135 | ||
78 | 136 | |
79 | 137 | if not os.path.exists(self._report_path): |
80 | 138 | os.mkdir(self._report_path) |
86 | 144 | os.mkdir(self._report_upath) |
87 | 145 | |
88 | 146 | def run(self): |
147 | ||
148 | self.online_plugins.start() | |
89 | 149 | tmp_timer = .0 |
90 | tmp_timer_sentinel = 0 | |
150 | ||
91 | 151 | while not self._stop: |
92 | 152 | |
93 | 153 | time.sleep(.1) |
94 | 154 | tmp_timer += .1 |
95 | tmp_timer_sentinel += 1 | |
96 | ||
97 | if tmp_timer_sentinel == 1800: | |
98 | tmp_timer_sentinel = 0 | |
99 | self.launchSentinel() | |
100 | 155 | |
101 | 156 | if tmp_timer >= self.timer: |
157 | ||
102 | 158 | try: |
103 | 159 | self.syncReports() |
104 | 160 | if not self.polling: |
105 | 161 | break |
162 | ||
106 | 163 | except Exception: |
164 | ||
107 | 165 | getLogger(self).error( |
108 | 166 | "An exception was captured while saving reports\n%s" |
109 | 167 | % traceback.format_exc()) |
168 | ||
110 | 169 | finally: |
111 | 170 | tmp_timer = 0 |
112 | 171 | |
113 | 172 | def stop(self): |
114 | 173 | self._stop = True |
115 | ||
116 | def launchSentinel(self): | |
117 | psettings = CONF.getPluginSettings() | |
118 | ||
119 | name, cmd = "Sentinel", "sentinel" | |
120 | if name in psettings: | |
121 | if psettings[name]['settings']['Enable'] == "1": | |
122 | getLogger(self).info("Plugin Started: Sentinel") | |
123 | self.processor.onlinePlugin(cmd) | |
124 | getLogger(self).info("Plugin Ended: Sentinel") | |
174 | self.online_plugins.stop() | |
125 | 175 | |
126 | 176 | def syncReports(self): |
127 | 177 | """ |
129 | 179 | We first make sure that all shared reports were added to the repo |
130 | 180 | """ |
131 | 181 | for root, dirs, files in os.walk(self._report_path, False): |
182 | ||
132 | 183 | # skip processed and unprocessed directories |
133 | 184 | if root == self._report_path: |
134 | 185 | for name in files: |
186 | ||
135 | 187 | filename = os.path.join(root, name) |
136 | 188 | name = os.path.basename(filename) |
189 | ||
137 | 190 | # If plugin not is detected... move to unprocessed |
138 | 191 | # PluginCommiter will rename the file to processed or unprocessed |
139 | 192 | # when the plugin finishes |
140 | 193 | if self.processor.processReport(filename) is False: |
141 | getLogger(self).info('Plugin not detected. Moving {0} to unprocessed'.format(filename)) | |
194 | ||
195 | getLogger(self).info( | |
196 | 'Plugin not detected. Moving {0} to unprocessed'.format(filename)) | |
197 | ||
142 | 198 | os.rename( |
143 | 199 | filename, |
144 | 200 | os.path.join(self._report_upath, name)) |
145 | 201 | else: |
202 | ||
146 | 203 | getLogger(self).info( |
147 | 204 | 'Detected valid report {0}'.format(filename)) |
205 | ||
148 | 206 | os.rename( |
149 | 207 | filename, |
150 | 208 | os.path.join(self._report_ppath, name)) |
151 | 209 | |
152 | self.onlinePlugins() | |
153 | ||
154 | def onlinePlugins(self): | |
155 | """ | |
156 | Process online plugins | |
157 | """ | |
158 | pluginsOn = {"MetasploitOn": "./metasploiton online"} | |
159 | pluginsOn.update({"Beef": "./beef online"}) | |
160 | psettings = CONF.getPluginSettings() | |
161 | ||
162 | for name, cmd in pluginsOn.iteritems(): | |
163 | if name in psettings: | |
164 | if psettings[name]['settings']['Enable'] == "1": | |
165 | self.processor.onlinePlugin(cmd) | |
166 | ||
167 | 210 | def sendReportToPluginById(self, plugin_id, filename): |
168 | 211 | """Sends a report to be processed by the specified plugin_id""" |
169 | 212 | self.processor.sendReport(plugin_id, filename) |
170 | 213 | |
171 | 214 | |
172 | 215 | class ReportParser(object): |
173 | ||
174 | 216 | """ |
175 | 217 | Class that handles reports files. |
176 | ||
177 | 218 | :param filepath: report file. |
178 | ||
179 | 219 | :class:`.LoadReport` |
180 | 220 | """ |
181 | 221 | |
215 | 255 | This method uses file signatures to recognize file types |
216 | 256 | |
217 | 257 | :param file_path: report file. |
218 | """ | |
219 | ||
220 | """ | |
258 | ||
221 | 259 | If you need add support to a new report type |
222 | 260 | add the file signature here |
223 | 261 | and add the code in self.getRootTag() for get the root tag. |
225 | 263 | f = result = None |
226 | 264 | |
227 | 265 | signatures = { |
228 | "\x50\x4B": "zip", | |
229 | "\x3C\x3F\x78\x6D\x6C": "xml", | |
230 | "# Lynis Re": "dat", | |
266 | "\x50\x4B": "zip", | |
267 | "\x3C\x3F\x78\x6D\x6C": "xml", | |
268 | "# Lynis Re": "dat", | |
231 | 269 | } |
232 | 270 | |
233 | 271 | try: |
253 | 291 | except ValueError: |
254 | 292 | pass |
255 | 293 | |
256 | except IOError, err: | |
294 | except IOError as err: | |
257 | 295 | self.report_type = None |
258 | 296 | getLogger(self).error( |
259 | 297 | "Error while opening file.\n%s. %s" % (err, file_path)) |
289 | 327 | result = elem.tag |
290 | 328 | break |
291 | 329 | |
292 | except SyntaxError, err: | |
330 | except SyntaxError as err: | |
293 | 331 | self.report_type = None |
294 | 332 | getLogger(self).error("Not an xml file.\n %s" % (err)) |
295 | 333 | |
301 | 339 | return result, output |
302 | 340 | |
303 | 341 | def rType(self, tag, output): |
304 | """Compares report root tag with known root tags. | |
305 | ||
306 | :param root_tag | |
307 | :rtype | |
308 | """ | |
309 | if "nmaprun" == tag: | |
342 | """ Compares report root tag with known root tags """ | |
343 | if tag == "nmaprun": | |
310 | 344 | return "Nmap" |
311 | elif "w3af-run" == tag: | |
345 | elif tag == "w3af-run": | |
312 | 346 | return "W3af" |
313 | elif "NessusClientData_v2" == tag: | |
347 | elif tag == "NessusClientData_v2": | |
314 | 348 | return "Nessus" |
315 | elif "report" == tag: | |
349 | elif tag == "report": | |
316 | 350 | |
317 | 351 | if re.search( |
318 | "https://raw.githubusercontent.com/Arachni/arachni/", | |
319 | output) is not None: | |
352 | "https://raw.githubusercontent.com/Arachni/arachni/", output) is not None: | |
320 | 353 | return "Arachni" |
321 | 354 | |
322 | elif re.search("OpenVAS", output) is not None or re.search( | |
323 | '<omp><version>', | |
324 | output) is not None: | |
355 | elif re.search("OpenVAS", output) is not None or re.search('<omp><version>', output) is not None: | |
325 | 356 | return "Openvas" |
326 | 357 | |
327 | 358 | else: |
328 | 359 | return "Zap" |
329 | 360 | |
330 | elif "xml-report" == tag: | |
331 | if re.search("Appscan",output) is not None: | |
361 | elif tag == "xml-report": | |
362 | if re.search("Appscan", output) is not None: | |
332 | 363 | return "Appscan" |
333 | elif "niktoscan" == tag: | |
364 | elif tag == "niktoscan": | |
334 | 365 | return "Nikto" |
335 | elif "MetasploitV4" == tag: | |
366 | elif tag == "MetasploitV4": | |
336 | 367 | return "Metasploit" |
337 | elif "MetasploitV5" == tag: | |
368 | elif tag == "MetasploitV5": | |
338 | 369 | return "Metasploit" |
339 | elif "issues" == tag: | |
370 | elif tag == "issues": | |
340 | 371 | return "Burp" |
341 | elif "OWASPZAPReport" == tag: | |
372 | elif tag == "OWASPZAPReport": | |
342 | 373 | return "Zap" |
343 | elif "ScanGroup" == tag: | |
374 | elif tag == "ScanGroup": | |
344 | 375 | return "Acunetix" |
345 | elif "session" == tag: | |
376 | elif tag == "session": | |
346 | 377 | return "X1" |
347 | elif "landscapePolicy" == tag: | |
378 | elif tag == "landscapePolicy": | |
348 | 379 | return "X1" |
349 | elif "entities" == tag: | |
380 | elif tag == "entities": | |
350 | 381 | return "Core Impact" |
351 | elif "NexposeReport" == tag: | |
382 | elif tag == "NexposeReport": | |
352 | 383 | return "NexposeFull" |
353 | elif "ASSET_DATA_REPORT" == tag or "SCAN" == tag: | |
384 | elif tag == "ASSET_DATA_REPORT" or "SCAN": | |
354 | 385 | return "Qualysguard" |
355 | elif "scanJob" == tag: | |
386 | elif tag == "scanJob": | |
356 | 387 | return "Retina" |
357 | elif "netsparker" == tag: | |
388 | elif tag == "netsparker": | |
358 | 389 | return "Netsparker" |
359 | elif "netsparker-cloud" == tag: | |
390 | elif tag == "netsparker-cloud": | |
360 | 391 | return "NetsparkerCloud" |
361 | elif "maltego" == tag: | |
392 | elif tag == "maltego": | |
362 | 393 | return "Maltego" |
363 | elif "lynis" == tag: | |
394 | elif tag == "lynis": | |
364 | 395 | return "Lynis" |
365 | elif "reconng" == tag: | |
396 | elif tag == "reconng": | |
366 | 397 | return "Reconng" |
367 | 398 | else: |
368 | 399 | return None |
0 | """empty message | |
1 | ||
2 | Revision ID: 8a10ff3926a5 | |
3 | Revises: | |
4 | Create Date: 2018-11-29 16:34:44.081899+00:00 | |
5 | ||
6 | """ | |
7 | from alembic import op | |
8 | import sqlalchemy as sa | |
9 | ||
10 | ||
11 | # revision identifiers, used by Alembic. | |
12 | revision = '8a10ff3926a5' | |
13 | down_revision = 'e61afb450465' | |
14 | branch_labels = None | |
15 | depends_on = None | |
16 | ||
17 | ||
18 | def upgrade(): | |
19 | op.add_column('faraday_user', sa.Column('otp_secret', sa.String(16))) | |
20 | op.execute("CREATE TYPE user_otp_states AS ENUM('disabled', 'requested', 'confirmed')") | |
21 | op.add_column('faraday_user', sa.Column( | |
22 | 'state_otp', | |
23 | sa.Enum(("disabled", "requested", "confirmed"), name='user_otp_states'), | |
24 | nullable=False, | |
25 | server_default='disabled')) | |
26 | ||
27 | ||
28 | def downgrade(): | |
29 | op.drop_column('faraday_user', 'otp_secret') | |
30 | op.drop_column('faraday_user', 'state_otp') | |
31 | op.execute('DROP TYPE user_otp_states') |
0 | """Add custom fields | |
1 | ||
2 | Revision ID: e61afb450465 | |
3 | Revises: | |
4 | Create Date: 2018-10-23 15:43:52.612619+00:00 | |
5 | ||
6 | """ | |
7 | from alembic import op | |
8 | import sqlalchemy as sa | |
9 | ||
10 | ||
11 | # revision identifiers, used by Alembic. | |
12 | revision = 'e61afb450465' | |
13 | down_revision = None | |
14 | branch_labels = None | |
15 | depends_on = None | |
16 | ||
17 | ||
18 | def upgrade(): | |
19 | conn = op.get_bind() | |
20 | conn.execute('ALTER TABLE vulnerability ADD COLUMN custom_fields JSONB') | |
21 | conn.execute('ALTER TABLE vulnerability_template ADD COLUMN custom_fields JSONB') | |
22 | conn.execute('CREATE TABLE custom_fields_schema ( '\ | |
23 | 'id SERIAL PRIMARY KEY,' \ | |
24 | 'table_name TEXT,' \ | |
25 | 'field_name TEXT,' \ | |
26 | 'field_type TEXT,' \ | |
27 | 'field_order INTEGER,' \ | |
28 | 'field_display_name TEXT)' | |
29 | ) | |
30 | ||
31 | def downgrade(): | |
32 | conn = op.get_bind() | |
33 | conn.execute('ALTER TABLE vulnerability DROP COLUMN custom_fields') | |
34 | conn.execute('ALTER TABLE vulnerability_template DROP COLUMN custom_fields') | |
35 | conn.execute('DROP TABLE custom_fields_schema') |
79 | 79 | hostnames = [hostname] |
80 | 80 | if hostname == "localhost": |
81 | 81 | hostnames.append("127.0.0.1") |
82 | ||
82 | ||
83 | 83 | listening = False |
84 | 84 | for hostname in hostnames: |
85 | 85 | |
116 | 116 | "XMLRPC API server configured on %s" % str( |
117 | 117 | CONF.getApiConInfo())) |
118 | 118 | break |
119 | ||
119 | ||
120 | 120 | except socket.error as e: |
121 | 121 | msg = "There was an error creating the XMLRPC API Server (Host:{}): {}".format(hostname,e) |
122 | 122 | log(msg) |
11 | 11 | import threading |
12 | 12 | from json import loads |
13 | 13 | from time import sleep |
14 | from Queue import Queue | |
15 | ||
14 | try: | |
15 | from Queue import Queue | |
16 | except ImportError: | |
17 | from queue import Queue | |
16 | 18 | import requests |
17 | 19 | |
18 | 20 | from model.controller import ModelController |
180 | 182 | exit_code = self.app.run(self.args) |
181 | 183 | |
182 | 184 | except Exception as exception: |
183 | print "There was an error while starting Faraday:" | |
184 | print "*" * 3, | |
185 | print exception, # instead of traceback.print_exc() | |
186 | print "*" * 3 | |
185 | print("There was an error while starting Faraday:") | |
186 | print("*" * 3) | |
187 | print(exception) # instead of traceback.print_exc() | |
188 | print("*" * 3) | |
187 | 189 | exit_code = -1 |
188 | 190 | |
189 | 191 | finally: |
7 | 7 | import traceback |
8 | 8 | import threading |
9 | 9 | import logging |
10 | import xmlrpclib | |
11 | import SimpleXMLRPCServer | |
10 | try: | |
11 | import xmlrpclib | |
12 | import SimpleXMLRPCServer | |
13 | except ImportError: | |
14 | from xmlrpc import client as xmlrpclib | |
15 | from xmlrpc.server import SimpleXMLRPCServer | |
12 | 16 | |
13 | 17 | try: |
14 | 18 | import model.api as api |
168 | 172 | response = self.server._marshaled_dispatch( |
169 | 173 | data, getattr(self, '_dispatch', None) |
170 | 174 | ) |
171 | except Exception, e: # This should only happen if the module is buggy | |
175 | except Exception as e: # This should only happen if the module is buggy | |
172 | 176 | # internal error, report as HTTP server error |
173 | 177 | self.send_response(500) |
174 | 178 |
418 | 418 | def _pluginStart(self, name, command_id): |
419 | 419 | self.active_plugins_count_lock.acquire() |
420 | 420 | self.processing = True |
421 | getLogger(self).info("Plugin Started: {0}. ".format(name, command_id)) | |
421 | if name not in ["MetasploitOn", "Beef", "Sentinel"]: | |
422 | getLogger(self).info("Plugin Started: {0}. ".format(name, command_id)) | |
422 | 423 | self.active_plugins_count += 1 |
423 | 424 | self.active_plugins_count_lock.release() |
424 | 425 | return True |
425 | 426 | |
426 | 427 | def _pluginEnd(self, name, command_id): |
427 | 428 | self.active_plugins_count_lock.acquire() |
428 | getLogger(self).info("Plugin Ended: {0}".format(name)) | |
429 | if name not in ["MetasploitOn", "Beef", "Sentinel"]: | |
430 | getLogger(self).info("Plugin Ended: {0}".format(name)) | |
429 | 431 | if self.active_plugins_count == 0: |
430 | 432 | self.active_plugins_count_lock.release() |
431 | 433 | getLogger(self).warn("All plugins ended, but a plugin end action was received.") |
0 | { pkgs ? import <nixpkgs> {} | |
1 | }: | |
2 | let | |
3 | python_env = (pkgs.callPackage ./requirements.nix {inherit pkgs;}); | |
4 | cleanPycs = path: type: type == "directory" || builtins.match ".*\.pyc" path != null; | |
5 | src = ./../..; | |
6 | in | |
7 | { | |
8 | server = pkgs.stdenv.mkDerivation { | |
9 | name = "faraday_server"; | |
10 | src = builtins.filterSource cleanPycs src; | |
11 | buildInputs = with pkgs; [coreutils makeWrapper python_env.interpreter]; | |
12 | builder = "${pkgs.bash}/bin/bash"; | |
13 | args = ["-c" '' | |
14 | ||
15 | source $stdenv/setup | |
16 | mkdir -p $out/{bin,src} | |
17 | cp -rv ${src}/* $out/src/ | |
18 | ||
19 | makeWrapper \ | |
20 | ${python_env.interpreter}/bin/python \ | |
21 | $out/bin/faraday-server \ | |
22 | --prefix PATH : $out \ | |
23 | --add-flags ${src}/faraday-server.py | |
24 | '']; | |
25 | }; | |
26 | python = python_env; | |
27 | } |
0 | # generated using pypi2nix tool (version: 1.8.1) | |
1 | # See more at: https://github.com/garbas/pypi2nix | |
2 | # | |
3 | # COMMAND: | |
4 | # pypi2nix -V 2.7 -r ../../requirements_server.txt -r ../../requirements_dev.txt -E libffi -E openssl -E postgresql -E pkgconfig -E zlib -E libjpeg -E openjpeg -E libtiff -E freetype -E lcms2 -E libwebp -E tcl -e setuptools_scm -e m2r -e pytest-runner | |
5 | # | |
6 | ||
7 | { pkgs ? import <nixpkgs> {} | |
8 | }: | |
9 | ||
10 | let | |
11 | ||
12 | inherit (pkgs) makeWrapper; | |
13 | inherit (pkgs.stdenv.lib) fix' extends inNixShell; | |
14 | ||
15 | pythonPackages = | |
16 | import "${toString pkgs.path}/pkgs/top-level/python-packages.nix" { | |
17 | inherit pkgs; | |
18 | inherit (pkgs) stdenv; | |
19 | python = pkgs.python27Full; | |
20 | # patching pip so it does not try to remove files when running nix-shell | |
21 | overrides = | |
22 | self: super: { | |
23 | bootstrapped-pip = super.bootstrapped-pip.overrideDerivation (old: { | |
24 | patchPhase = old.patchPhase + '' | |
25 | if [ -e $out/${pkgs.python27Full.sitePackages}/pip/req/req_install.py ]; then | |
26 | sed -i \ | |
27 | -e "s|paths_to_remove.remove(auto_confirm)|#paths_to_remove.remove(auto_confirm)|" \ | |
28 | -e "s|self.uninstalled = paths_to_remove|#self.uninstalled = paths_to_remove|" \ | |
29 | $out/${pkgs.python27Full.sitePackages}/pip/req/req_install.py | |
30 | fi | |
31 | ''; | |
32 | }); | |
33 | }; | |
34 | }; | |
35 | ||
36 | commonBuildInputs = with pkgs; [ libffi openssl postgresql pkgconfig zlib libjpeg openjpeg libtiff freetype lcms2 libwebp tcl ]; | |
37 | commonDoCheck = false; | |
38 | ||
39 | withPackages = pkgs': | |
40 | let | |
41 | pkgs = builtins.removeAttrs pkgs' ["__unfix__"]; | |
42 | interpreter = pythonPackages.buildPythonPackage { | |
43 | name = "python27Full-interpreter"; | |
44 | buildInputs = [ makeWrapper ] ++ (builtins.attrValues pkgs); | |
45 | buildCommand = '' | |
46 | mkdir -p $out/bin | |
47 | ln -s ${pythonPackages.python.interpreter} \ | |
48 | $out/bin/${pythonPackages.python.executable} | |
49 | for dep in ${builtins.concatStringsSep " " | |
50 | (builtins.attrValues pkgs)}; do | |
51 | if [ -d "$dep/bin" ]; then | |
52 | for prog in "$dep/bin/"*; do | |
53 | if [ -x "$prog" ] && [ -f "$prog" ]; then | |
54 | ln -s $prog $out/bin/`basename $prog` | |
55 | fi | |
56 | done | |
57 | fi | |
58 | done | |
59 | for prog in "$out/bin/"*; do | |
60 | wrapProgram "$prog" --prefix PYTHONPATH : "$PYTHONPATH" | |
61 | done | |
62 | pushd $out/bin | |
63 | ln -s ${pythonPackages.python.executable} python | |
64 | ln -s ${pythonPackages.python.executable} \ | |
65 | python2 | |
66 | popd | |
67 | ''; | |
68 | passthru.interpreter = pythonPackages.python; | |
69 | }; | |
70 | in { | |
71 | __old = pythonPackages; | |
72 | inherit interpreter; | |
73 | mkDerivation = pythonPackages.buildPythonPackage; | |
74 | packages = pkgs; | |
75 | overrideDerivation = drv: f: | |
76 | pythonPackages.buildPythonPackage ( | |
77 | drv.drvAttrs // f drv.drvAttrs // { meta = drv.meta; } | |
78 | ); | |
79 | withPackages = pkgs'': | |
80 | withPackages (pkgs // pkgs''); | |
81 | }; | |
82 | ||
83 | python = withPackages {}; | |
84 | ||
85 | generated = self: { | |
86 | "Automat" = python.mkDerivation { | |
87 | name = "Automat-0.6.0"; | |
88 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/de/05/b8e453085cf8a7f27bb1226596f4ccf5cc9e758377d60284f990bbdc592c/Automat-0.6.0.tar.gz"; sha256 = "3c1fd04ecf08ac87b4dd3feae409542e9bf7827257097b2b6ed5692f69d6f6a8"; }; | |
89 | doCheck = commonDoCheck; | |
90 | buildInputs = commonBuildInputs; | |
91 | propagatedBuildInputs = [ | |
92 | self."Twisted" | |
93 | self."attrs" | |
94 | self."six" | |
95 | ]; | |
96 | meta = with pkgs.stdenv.lib; { | |
97 | homepage = "https://github.com/glyph/Automat"; | |
98 | license = licenses.mit; | |
99 | description = "Self-service finite-state machines for the programmer on the go."; | |
100 | }; | |
101 | }; | |
102 | ||
103 | "Babel" = python.mkDerivation { | |
104 | name = "Babel-2.6.0"; | |
105 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/be/cc/9c981b249a455fa0c76338966325fc70b7265521bad641bf2932f77712f4/Babel-2.6.0.tar.gz"; sha256 = "8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"; }; | |
106 | doCheck = commonDoCheck; | |
107 | buildInputs = commonBuildInputs; | |
108 | propagatedBuildInputs = [ | |
109 | self."pytz" | |
110 | ]; | |
111 | meta = with pkgs.stdenv.lib; { | |
112 | homepage = "http://babel.pocoo.org/"; | |
113 | license = licenses.bsdOriginal; | |
114 | description = "Internationalization utilities"; | |
115 | }; | |
116 | }; | |
117 | ||
118 | "Faker" = python.mkDerivation { | |
119 | name = "Faker-0.8.15"; | |
120 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f9/74/f86d1b7493493a4fbfc69c327488f991ddbc8b8b1774357515d1cbb64fc4/Faker-0.8.15.tar.gz"; sha256 = "a77a1a2223a8e0d32618878350bbd2171040f32b526ba2cddfab8864704bb370"; }; | |
121 | doCheck = commonDoCheck; | |
122 | buildInputs = commonBuildInputs; | |
123 | propagatedBuildInputs = [ | |
124 | self."ipaddress" | |
125 | self."python-dateutil" | |
126 | self."six" | |
127 | self."text-unidecode" | |
128 | ]; | |
129 | meta = with pkgs.stdenv.lib; { | |
130 | homepage = "https://github.com/joke2k/faker"; | |
131 | license = licenses.mit; | |
132 | description = "Faker is a Python package that generates fake data for you."; | |
133 | }; | |
134 | }; | |
135 | ||
136 | "Flask" = python.mkDerivation { | |
137 | name = "Flask-0.12.4"; | |
138 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/1b/72/ffc594a6832337ace475f939e61c34a44cbb150cde9589f98c482b407dd8/Flask-0.12.4.tar.gz"; sha256 = "2ea22336f6d388b4b242bc3abf8a01244a8aa3e236e7407469ef78c16ba355dd"; }; | |
139 | doCheck = commonDoCheck; | |
140 | buildInputs = commonBuildInputs; | |
141 | propagatedBuildInputs = [ | |
142 | self."Jinja2" | |
143 | self."Werkzeug" | |
144 | self."click" | |
145 | self."itsdangerous" | |
146 | ]; | |
147 | meta = with pkgs.stdenv.lib; { | |
148 | homepage = "http://github.com/pallets/flask/"; | |
149 | license = licenses.bsdOriginal; | |
150 | description = "A microframework based on Werkzeug, Jinja2 and good intentions"; | |
151 | }; | |
152 | }; | |
153 | ||
154 | "Flask-BabelEx" = python.mkDerivation { | |
155 | name = "Flask-BabelEx-0.9.3"; | |
156 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/80/ad/cc2b0becd98050eed775ca85d6e5fa784547acff69f968183098df8a52b3/Flask-BabelEx-0.9.3.tar.gz"; sha256 = "cf79cdedb5ce860166120136b0e059e9d97b8df07a3bc2411f6243de04b754b4"; }; | |
157 | doCheck = commonDoCheck; | |
158 | buildInputs = commonBuildInputs; | |
159 | propagatedBuildInputs = [ | |
160 | self."Babel" | |
161 | self."Flask" | |
162 | self."Jinja2" | |
163 | self."speaklater" | |
164 | ]; | |
165 | meta = with pkgs.stdenv.lib; { | |
166 | homepage = "http://github.com/mrjoes/flask-babelex"; | |
167 | license = licenses.bsdOriginal; | |
168 | description = "Adds i18n/l10n support to Flask applications"; | |
169 | }; | |
170 | }; | |
171 | ||
172 | "Flask-Classful" = python.mkDerivation { | |
173 | name = "Flask-Classful-0.14.1"; | |
174 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f1/db/27ad7116db129724984cf6da8e7cdf9a20a2f8cb4dab50469329c5e1aa22/Flask-Classful-0.14.1.tar.gz"; sha256 = "f5250d2908e94cf5530d6e4cfd199b9c846b3ef571742a7a211405aee2ec1736"; }; | |
175 | doCheck = commonDoCheck; | |
176 | buildInputs = commonBuildInputs; | |
177 | propagatedBuildInputs = [ | |
178 | self."Flask" | |
179 | ]; | |
180 | meta = with pkgs.stdenv.lib; { | |
181 | homepage = "https://github.com/teracyhq/flask-classful"; | |
182 | license = licenses.bsdOriginal; | |
183 | description = "Class based views for Flask"; | |
184 | }; | |
185 | }; | |
186 | ||
187 | "Flask-Login" = python.mkDerivation { | |
188 | name = "Flask-Login-0.4.1"; | |
189 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/c1/ff/bd9a4d2d81bf0c07d9e53e8cd3d675c56553719bbefd372df69bf1b3c1e4/Flask-Login-0.4.1.tar.gz"; sha256 = "c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"; }; | |
190 | doCheck = commonDoCheck; | |
191 | buildInputs = commonBuildInputs; | |
192 | propagatedBuildInputs = [ | |
193 | self."Flask" | |
194 | ]; | |
195 | meta = with pkgs.stdenv.lib; { | |
196 | homepage = "https://github.com/maxcountryman/flask-login"; | |
197 | license = licenses.mit; | |
198 | description = "User session management for Flask"; | |
199 | }; | |
200 | }; | |
201 | ||
202 | "Flask-Mail" = python.mkDerivation { | |
203 | name = "Flask-Mail-0.9.1"; | |
204 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/05/2f/6a545452040c2556559779db87148d2a85e78a26f90326647b51dc5e81e9/Flask-Mail-0.9.1.tar.gz"; sha256 = "22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"; }; | |
205 | doCheck = commonDoCheck; | |
206 | buildInputs = commonBuildInputs; | |
207 | propagatedBuildInputs = [ | |
208 | self."Flask" | |
209 | self."blinker" | |
210 | ]; | |
211 | meta = with pkgs.stdenv.lib; { | |
212 | homepage = "https://github.com/rduplain/flask-mail"; | |
213 | license = licenses.bsdOriginal; | |
214 | description = "Flask extension for sending email"; | |
215 | }; | |
216 | }; | |
217 | ||
218 | "Flask-Principal" = python.mkDerivation { | |
219 | name = "Flask-Principal-0.4.0"; | |
220 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/14/c7/2531aca6ab7baa3774fde2dfc9c9dd6d5a42576a1013a93701bfdc402fdd/Flask-Principal-0.4.0.tar.gz"; sha256 = "f5d6134b5caebfdbb86f32d56d18ee44b080876a27269560a96ea35f75c99453"; }; | |
221 | doCheck = commonDoCheck; | |
222 | buildInputs = commonBuildInputs; | |
223 | propagatedBuildInputs = [ | |
224 | self."Flask" | |
225 | self."blinker" | |
226 | ]; | |
227 | meta = with pkgs.stdenv.lib; { | |
228 | homepage = "http://packages.python.org/Flask-Principal/"; | |
229 | license = licenses.mit; | |
230 | description = "Identity management for flask"; | |
231 | }; | |
232 | }; | |
233 | ||
234 | "Flask-SQLAlchemy" = python.mkDerivation { | |
235 | name = "Flask-SQLAlchemy-2.3.2"; | |
236 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/3a/66/f5ace276517c075f102457dd2f7d8645b033758f9c6effb4e0970a90fec1/Flask-SQLAlchemy-2.3.2.tar.gz"; sha256 = "5971b9852b5888655f11db634e87725a9031e170f37c0ce7851cf83497f56e53"; }; | |
237 | doCheck = commonDoCheck; | |
238 | buildInputs = commonBuildInputs; | |
239 | propagatedBuildInputs = [ | |
240 | self."Flask" | |
241 | self."SQLAlchemy" | |
242 | ]; | |
243 | meta = with pkgs.stdenv.lib; { | |
244 | homepage = "http://github.com/mitsuhiko/flask-sqlalchemy"; | |
245 | license = licenses.bsdOriginal; | |
246 | description = "Adds SQLAlchemy support to your Flask application"; | |
247 | }; | |
248 | }; | |
249 | ||
250 | "Flask-Security" = python.mkDerivation { | |
251 | name = "Flask-Security-3.0.0"; | |
252 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ba/c1/16e460fec7961509b10aaf8cc986fa7a1df5dced2844f42cd46732621211/Flask-Security-3.0.0.tar.gz"; sha256 = "d61daa5f5a48f89f30f50555872bdf581b2c65804668b0313345cd7beff26432"; }; | |
253 | doCheck = commonDoCheck; | |
254 | buildInputs = commonBuildInputs; | |
255 | propagatedBuildInputs = [ | |
256 | self."Flask" | |
257 | self."Flask-BabelEx" | |
258 | self."Flask-Login" | |
259 | self."Flask-Mail" | |
260 | self."Flask-Principal" | |
261 | self."Flask-SQLAlchemy" | |
262 | self."Flask-WTF" | |
263 | self."SQLAlchemy" | |
264 | self."bcrypt" | |
265 | self."coverage" | |
266 | self."itsdangerous" | |
267 | self."mock" | |
268 | self."passlib" | |
269 | self."pytest" | |
270 | ]; | |
271 | meta = with pkgs.stdenv.lib; { | |
272 | homepage = "https://github.com/mattupstate/flask-security"; | |
273 | license = licenses.mit; | |
274 | description = "Simple security for Flask apps."; | |
275 | }; | |
276 | }; | |
277 | ||
278 | "Flask-Session" = python.mkDerivation { | |
279 | name = "Flask-Session-0.3.1"; | |
280 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/2e/9f/b138521d0416b001469bcdc79a3619f013c0563204f7251ba978eb3e69d5/Flask-Session-0.3.1.tar.gz"; sha256 = "a31c27e0c3287f00c825b3d9625aba585f4df4cccedb1e7dd5a69a215881a731"; }; | |
281 | doCheck = commonDoCheck; | |
282 | buildInputs = commonBuildInputs; | |
283 | propagatedBuildInputs = [ | |
284 | self."Flask" | |
285 | ]; | |
286 | meta = with pkgs.stdenv.lib; { | |
287 | homepage = "https://github.com/fengsp/flask-session"; | |
288 | license = licenses.bsdOriginal; | |
289 | description = "Adds server-side session support to your Flask application"; | |
290 | }; | |
291 | }; | |
292 | ||
293 | "Flask-WTF" = python.mkDerivation { | |
294 | name = "Flask-WTF-0.14.2"; | |
295 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ba/15/00a9693180f214225a2c0b1bb9077f3b0b21f2e86522cbba22e8ad6e570c/Flask-WTF-0.14.2.tar.gz"; sha256 = "5d14d55cfd35f613d99ee7cba0fc3fbbe63ba02f544d349158c14ca15561cc36"; }; | |
296 | doCheck = commonDoCheck; | |
297 | buildInputs = commonBuildInputs; | |
298 | propagatedBuildInputs = [ | |
299 | self."Flask" | |
300 | self."WTForms" | |
301 | ]; | |
302 | meta = with pkgs.stdenv.lib; { | |
303 | homepage = "https://github.com/lepture/flask-wtf"; | |
304 | license = licenses.bsdOriginal; | |
305 | description = "Simple integration of Flask and WTForms."; | |
306 | }; | |
307 | }; | |
308 | ||
309 | "IPy" = python.mkDerivation { | |
310 | name = "IPy-0.83"; | |
311 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/88/28/79162bfc351a3f1ab44d663ab3f03fb495806fdb592170990a1568ffbf63/IPy-0.83.tar.gz"; sha256 = "61da5a532b159b387176f6eabf11946e7458b6df8fb8b91ff1d345ca7a6edab8"; }; | |
312 | doCheck = commonDoCheck; | |
313 | buildInputs = commonBuildInputs; | |
314 | propagatedBuildInputs = [ ]; | |
315 | meta = with pkgs.stdenv.lib; { | |
316 | homepage = "https://github.com/autocracy/python-ipy"; | |
317 | license = licenses.bsdOriginal; | |
318 | description = "Class and tools for handling of IPv4 and IPv6 addresses and networks"; | |
319 | }; | |
320 | }; | |
321 | ||
322 | "Jinja2" = python.mkDerivation { | |
323 | name = "Jinja2-2.10"; | |
324 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz"; sha256 = "f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"; }; | |
325 | doCheck = commonDoCheck; | |
326 | buildInputs = commonBuildInputs; | |
327 | propagatedBuildInputs = [ | |
328 | self."Babel" | |
329 | self."MarkupSafe" | |
330 | ]; | |
331 | meta = with pkgs.stdenv.lib; { | |
332 | homepage = "http://jinja.pocoo.org/"; | |
333 | license = licenses.bsdOriginal; | |
334 | description = "A small but fast and easy to use stand-alone template engine written in pure python."; | |
335 | }; | |
336 | }; | |
337 | ||
338 | "Mako" = python.mkDerivation { | |
339 | name = "Mako-1.0.7"; | |
340 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/eb/f3/67579bb486517c0d49547f9697e36582cd19dafb5df9e687ed8e22de57fa/Mako-1.0.7.tar.gz"; sha256 = "4e02fde57bd4abb5ec400181e4c314f56ac3e49ba4fb8b0d50bba18cb27d25ae"; }; | |
341 | doCheck = commonDoCheck; | |
342 | buildInputs = commonBuildInputs; | |
343 | propagatedBuildInputs = [ | |
344 | self."MarkupSafe" | |
345 | ]; | |
346 | meta = with pkgs.stdenv.lib; { | |
347 | homepage = "http://www.makotemplates.org/"; | |
348 | license = licenses.mit; | |
349 | description = "A super-fast templating language that borrows the best ideas from the existing templating languages."; | |
350 | }; | |
351 | }; | |
352 | ||
353 | "MarkupSafe" = python.mkDerivation { | |
354 | name = "MarkupSafe-1.0"; | |
355 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz"; sha256 = "a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665"; }; | |
356 | doCheck = commonDoCheck; | |
357 | buildInputs = commonBuildInputs; | |
358 | propagatedBuildInputs = [ ]; | |
359 | meta = with pkgs.stdenv.lib; { | |
360 | homepage = "http://github.com/pallets/markupsafe"; | |
361 | license = licenses.bsdOriginal; | |
362 | description = "Implements a XML/HTML/XHTML Markup safe string for Python"; | |
363 | }; | |
364 | }; | |
365 | ||
366 | "Pillow" = python.mkDerivation { | |
367 | name = "Pillow-5.1.0"; | |
368 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/89/b8/2f49bf71cbd0e9485bb36f72d438421b69b7356180695ae10bd4fd3066f5/Pillow-5.1.0.tar.gz"; sha256 = "cee9bc75bff455d317b6947081df0824a8f118de2786dc3d74a3503fd631f4ef"; }; | |
369 | doCheck = commonDoCheck; | |
370 | buildInputs = commonBuildInputs; | |
371 | propagatedBuildInputs = [ ]; | |
372 | meta = with pkgs.stdenv.lib; { | |
373 | homepage = "https://python-pillow.org"; | |
374 | license = "License :: Other/Proprietary License"; | |
375 | description = "Python Imaging Library (Fork)"; | |
376 | }; | |
377 | }; | |
378 | ||
379 | "Pygments" = python.mkDerivation { | |
380 | name = "Pygments-2.2.0"; | |
381 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz"; sha256 = "dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"; }; | |
382 | doCheck = commonDoCheck; | |
383 | buildInputs = commonBuildInputs; | |
384 | propagatedBuildInputs = [ ]; | |
385 | meta = with pkgs.stdenv.lib; { | |
386 | homepage = "http://pygments.org/"; | |
387 | license = licenses.bsdOriginal; | |
388 | description = "Pygments is a syntax highlighting package written in Python."; | |
389 | }; | |
390 | }; | |
391 | ||
392 | "SQLAlchemy" = python.mkDerivation { | |
393 | name = "SQLAlchemy-1.2.8"; | |
394 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/b4/9c/411a9bac1a471bed54ec447dc183aeed12a75c1b648307e18b56e3829363/SQLAlchemy-1.2.8.tar.gz"; sha256 = "2d5f08f714a886a1382c18be501e614bce50d362384dc089474019ce0768151c"; }; | |
395 | doCheck = commonDoCheck; | |
396 | buildInputs = commonBuildInputs; | |
397 | propagatedBuildInputs = [ | |
398 | self."psycopg2" | |
399 | ]; | |
400 | meta = with pkgs.stdenv.lib; { | |
401 | homepage = "http://www.sqlalchemy.org"; | |
402 | license = licenses.mit; | |
403 | description = "Database Abstraction Library"; | |
404 | }; | |
405 | }; | |
406 | ||
407 | "Twisted" = python.mkDerivation { | |
408 | name = "Twisted-18.4.0"; | |
409 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/12/2a/e9e4fb2e6b2f7a75577e0614926819a472934b0b85f205ba5d5d2add54d0/Twisted-18.4.0.tar.bz2"; sha256 = "a4cc164a781859c74de47f17f0e85f4bce8a3321a9d0892c015c8f80c4158ad9"; }; | |
410 | doCheck = commonDoCheck; | |
411 | buildInputs = commonBuildInputs; | |
412 | propagatedBuildInputs = [ | |
413 | self."Automat" | |
414 | self."constantly" | |
415 | self."cryptography" | |
416 | self."hyperlink" | |
417 | self."idna" | |
418 | self."incremental" | |
419 | self."pyOpenSSL" | |
420 | self."pyasn1" | |
421 | self."service-identity" | |
422 | self."zope.interface" | |
423 | ]; | |
424 | meta = with pkgs.stdenv.lib; { | |
425 | homepage = "http://twistedmatrix.com/"; | |
426 | license = licenses.mit; | |
427 | description = "An asynchronous networking framework written in Python"; | |
428 | }; | |
429 | }; | |
430 | ||
431 | "Unidecode" = python.mkDerivation { | |
432 | name = "Unidecode-1.0.22"; | |
433 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9d/36/49d0ee152b6a1631f03a541532c6201942430060aa97fe011cf01a2cce64/Unidecode-1.0.22.tar.gz"; sha256 = "8c33dd588e0c9bc22a76eaa0c715a5434851f726131bd44a6c26471746efabf5"; }; | |
434 | doCheck = commonDoCheck; | |
435 | buildInputs = commonBuildInputs; | |
436 | propagatedBuildInputs = [ ]; | |
437 | meta = with pkgs.stdenv.lib; { | |
438 | homepage = ""; | |
439 | license = licenses.gpl2Plus; | |
440 | description = "ASCII transliterations of Unicode text"; | |
441 | }; | |
442 | }; | |
443 | ||
444 | "WTForms" = python.mkDerivation { | |
445 | name = "WTForms-2.2.1"; | |
446 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/cd/1d/7221354ebfc32b868740d02e44225c2ce00769b0d3dc370e463e2bc4b446/WTForms-2.2.1.tar.gz"; sha256 = "0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61"; }; | |
447 | doCheck = commonDoCheck; | |
448 | buildInputs = commonBuildInputs; | |
449 | propagatedBuildInputs = [ | |
450 | self."Babel" | |
451 | ]; | |
452 | meta = with pkgs.stdenv.lib; { | |
453 | homepage = "https://wtforms.readthedocs.io/"; | |
454 | license = licenses.bsdOriginal; | |
455 | description = "A flexible forms validation and rendering library for Python web development."; | |
456 | }; | |
457 | }; | |
458 | ||
459 | "Werkzeug" = python.mkDerivation { | |
460 | name = "Werkzeug-0.14.1"; | |
461 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9f/08/a3bb1c045ec602dc680906fc0261c267bed6b3bb4609430aff92c3888ec8/Werkzeug-0.14.1.tar.gz"; sha256 = "c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c"; }; | |
462 | doCheck = commonDoCheck; | |
463 | buildInputs = commonBuildInputs; | |
464 | propagatedBuildInputs = [ | |
465 | self."coverage" | |
466 | self."pytest" | |
467 | ]; | |
468 | meta = with pkgs.stdenv.lib; { | |
469 | homepage = "https://www.palletsprojects.org/p/werkzeug/"; | |
470 | license = licenses.bsdOriginal; | |
471 | description = "The comprehensive WSGI web application library."; | |
472 | }; | |
473 | }; | |
474 | ||
475 | "alembic" = python.mkDerivation { | |
476 | name = "alembic-0.9.9"; | |
477 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/89/03/756d5b8e1c90bf283c3f435766aa3f20208d1c3887579dd8f2122e01d5f4/alembic-0.9.9.tar.gz"; sha256 = "85bd3ea7633024e4930900bc64fb58f9742dedbc6ebb6ecf25be2ea9a3c1b32e"; }; | |
478 | doCheck = commonDoCheck; | |
479 | buildInputs = commonBuildInputs; | |
480 | propagatedBuildInputs = [ | |
481 | self."Mako" | |
482 | self."SQLAlchemy" | |
483 | self."python-dateutil" | |
484 | self."python-editor" | |
485 | ]; | |
486 | meta = with pkgs.stdenv.lib; { | |
487 | homepage = "http://bitbucket.org/zzzeek/alembic"; | |
488 | license = licenses.mit; | |
489 | description = "A database migration tool for SQLAlchemy."; | |
490 | }; | |
491 | }; | |
492 | ||
493 | "asn1crypto" = python.mkDerivation { | |
494 | name = "asn1crypto-0.24.0"; | |
495 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/fc/f1/8db7daa71f414ddabfa056c4ef792e1461ff655c2ae2928a2b675bfed6b4/asn1crypto-0.24.0.tar.gz"; sha256 = "9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"; }; | |
496 | doCheck = commonDoCheck; | |
497 | buildInputs = commonBuildInputs; | |
498 | propagatedBuildInputs = [ ]; | |
499 | meta = with pkgs.stdenv.lib; { | |
500 | homepage = "https://github.com/wbond/asn1crypto"; | |
501 | license = licenses.mit; | |
502 | description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP"; | |
503 | }; | |
504 | }; | |
505 | ||
506 | "atomicwrites" = python.mkDerivation { | |
507 | name = "atomicwrites-1.1.5"; | |
508 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz"; sha256 = "240831ea22da9ab882b551b31d4225591e5e447a68c5e188db5b89ca1d487585"; }; | |
509 | doCheck = commonDoCheck; | |
510 | buildInputs = commonBuildInputs; | |
511 | propagatedBuildInputs = [ ]; | |
512 | meta = with pkgs.stdenv.lib; { | |
513 | homepage = "https://github.com/untitaker/python-atomicwrites"; | |
514 | license = licenses.mit; | |
515 | description = "Atomic file writes."; | |
516 | }; | |
517 | }; | |
518 | ||
519 | "attrs" = python.mkDerivation { | |
520 | name = "attrs-18.1.0"; | |
521 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/e4/ac/a04671e118b57bee87dabca1e0f2d3bda816b7a551036012d0ca24190e71/attrs-18.1.0.tar.gz"; sha256 = "e0d0eb91441a3b53dab4d9b743eafc1ac44476296a2053b6ca3af0b139faf87b"; }; | |
522 | doCheck = commonDoCheck; | |
523 | buildInputs = commonBuildInputs; | |
524 | propagatedBuildInputs = [ | |
525 | self."coverage" | |
526 | self."hypothesis" | |
527 | self."pytest" | |
528 | self."six" | |
529 | self."zope.interface" | |
530 | ]; | |
531 | meta = with pkgs.stdenv.lib; { | |
532 | homepage = "http://www.attrs.org/"; | |
533 | license = licenses.mit; | |
534 | description = "Classes Without Boilerplate"; | |
535 | }; | |
536 | }; | |
537 | ||
538 | "autobahn" = python.mkDerivation { | |
539 | name = "autobahn-18.6.1"; | |
540 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/e0/a4/ca655f7fc8cc28274f7415a304e73c525b203828c164cea22e60207afea0/autobahn-18.6.1.tar.gz"; sha256 = "2f41bfc512ec482044fa8cfa74182118dedd87e03b3494472d9ff1b5a1e27d24"; }; | |
541 | doCheck = commonDoCheck; | |
542 | buildInputs = commonBuildInputs; | |
543 | propagatedBuildInputs = [ | |
544 | self."Twisted" | |
545 | self."cffi" | |
546 | self."mock" | |
547 | self."passlib" | |
548 | self."pyOpenSSL" | |
549 | self."pytest" | |
550 | self."service-identity" | |
551 | self."six" | |
552 | self."txaio" | |
553 | self."zope.interface" | |
554 | ]; | |
555 | meta = with pkgs.stdenv.lib; { | |
556 | homepage = "http://crossbar.io/autobahn"; | |
557 | license = licenses.mit; | |
558 | description = "WebSocket client & server library, WAMP real-time framework"; | |
559 | }; | |
560 | }; | |
561 | ||
562 | "backports.csv" = python.mkDerivation { | |
563 | name = "backports.csv-1.0.6"; | |
564 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/c5/d2/6adc8e81e57a847fbe63b7967223aa13e340875a273be218ef15f162037d/backports.csv-1.0.6.tar.gz"; sha256 = "bed884eeb967c8d6f517dfcf672914324180f1e9ceeb0376fde2c4c32fd7008d"; }; | |
565 | doCheck = commonDoCheck; | |
566 | buildInputs = commonBuildInputs; | |
567 | propagatedBuildInputs = [ ]; | |
568 | meta = with pkgs.stdenv.lib; { | |
569 | homepage = "https://github.com/ryanhiebert/backports.csv"; | |
570 | license = ""; | |
571 | description = "Backport of Python 3 csv module"; | |
572 | }; | |
573 | }; | |
574 | ||
575 | "bcrypt" = python.mkDerivation { | |
576 | name = "bcrypt-3.1.4"; | |
577 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f3/ec/bb6b384b5134fd881b91b6aa3a88ccddaad0103857760711a5ab8c799358/bcrypt-3.1.4.tar.gz"; sha256 = "67ed1a374c9155ec0840214ce804616de49c3df9c5bc66740687c1c9b1cd9e8d"; }; | |
578 | doCheck = commonDoCheck; | |
579 | buildInputs = commonBuildInputs; | |
580 | propagatedBuildInputs = [ | |
581 | self."cffi" | |
582 | self."pytest" | |
583 | self."six" | |
584 | ]; | |
585 | meta = with pkgs.stdenv.lib; { | |
586 | homepage = "https://github.com/pyca/bcrypt/"; | |
587 | license = licenses.asl20; | |
588 | description = "Modern password hashing for your software and your servers"; | |
589 | }; | |
590 | }; | |
591 | ||
592 | "beautifulsoup4" = python.mkDerivation { | |
593 | name = "beautifulsoup4-4.6.0"; | |
594 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/fa/8d/1d14391fdaed5abada4e0f63543fef49b8331a34ca60c88bd521bcf7f782/beautifulsoup4-4.6.0.tar.gz"; sha256 = "808b6ac932dccb0a4126558f7dfdcf41710dd44a4ef497a0bb59a77f9f078e89"; }; | |
595 | doCheck = commonDoCheck; | |
596 | buildInputs = commonBuildInputs; | |
597 | propagatedBuildInputs = [ ]; | |
598 | meta = with pkgs.stdenv.lib; { | |
599 | homepage = "http://www.crummy.com/software/BeautifulSoup/bs4/"; | |
600 | license = licenses.mit; | |
601 | description = "Screen-scraping library"; | |
602 | }; | |
603 | }; | |
604 | ||
605 | "blinker" = python.mkDerivation { | |
606 | name = "blinker-1.4"; | |
607 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/1b/51/e2a9f3b757eb802f61dc1f2b09c8c99f6eb01cf06416c0671253536517b6/blinker-1.4.tar.gz"; sha256 = "471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"; }; | |
608 | doCheck = commonDoCheck; | |
609 | buildInputs = commonBuildInputs; | |
610 | propagatedBuildInputs = [ ]; | |
611 | meta = with pkgs.stdenv.lib; { | |
612 | homepage = "http://pythonhosted.org/blinker/"; | |
613 | license = licenses.mit; | |
614 | description = "Fast, simple object-to-object and broadcast signaling"; | |
615 | }; | |
616 | }; | |
617 | ||
618 | "certifi" = python.mkDerivation { | |
619 | name = "certifi-2018.4.16"; | |
620 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/4d/9c/46e950a6f4d6b4be571ddcae21e7bc846fcbb88f1de3eff0f6dd0a6be55d/certifi-2018.4.16.tar.gz"; sha256 = "13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7"; }; | |
621 | doCheck = commonDoCheck; | |
622 | buildInputs = commonBuildInputs; | |
623 | propagatedBuildInputs = [ ]; | |
624 | meta = with pkgs.stdenv.lib; { | |
625 | homepage = "http://certifi.io/"; | |
626 | license = licenses.mpl20; | |
627 | description = "Python package for providing Mozilla's CA Bundle."; | |
628 | }; | |
629 | }; | |
630 | ||
631 | "cffi" = python.mkDerivation { | |
632 | name = "cffi-1.11.5"; | |
633 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/e7/a7/4cd50e57cc6f436f1cc3a7e8fa700ff9b8b4d471620629074913e3735fb2/cffi-1.11.5.tar.gz"; sha256 = "e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4"; }; | |
634 | doCheck = commonDoCheck; | |
635 | buildInputs = commonBuildInputs; | |
636 | propagatedBuildInputs = [ | |
637 | self."pycparser" | |
638 | ]; | |
639 | meta = with pkgs.stdenv.lib; { | |
640 | homepage = "http://cffi.readthedocs.org"; | |
641 | license = licenses.mit; | |
642 | description = "Foreign Function Interface for Python calling C code."; | |
643 | }; | |
644 | }; | |
645 | ||
646 | "chardet" = python.mkDerivation { | |
647 | name = "chardet-3.0.4"; | |
648 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz"; sha256 = "84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"; }; | |
649 | doCheck = commonDoCheck; | |
650 | buildInputs = commonBuildInputs; | |
651 | propagatedBuildInputs = [ ]; | |
652 | meta = with pkgs.stdenv.lib; { | |
653 | homepage = "https://github.com/chardet/chardet"; | |
654 | license = licenses.lgpl2; | |
655 | description = "Universal encoding detector for Python 2 and 3"; | |
656 | }; | |
657 | }; | |
658 | ||
659 | "cli-helpers" = python.mkDerivation { | |
660 | name = "cli-helpers-1.0.2"; | |
661 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d5/13/3783ef3fa23ab76b56d4b8f96ee90808d2c167bafc5eaa4ad3c78b75abe6/cli_helpers-1.0.2.tar.gz"; sha256 = "f77837c5fbcbea39e0cb782506515459a0da75465489bae35e46da7f51c5b9fc"; }; | |
662 | doCheck = commonDoCheck; | |
663 | buildInputs = commonBuildInputs; | |
664 | propagatedBuildInputs = [ | |
665 | self."Pygments" | |
666 | self."backports.csv" | |
667 | self."tabulate" | |
668 | self."terminaltables" | |
669 | ]; | |
670 | meta = with pkgs.stdenv.lib; { | |
671 | homepage = "https://github.com/dbcli/cli_helpers"; | |
672 | license = licenses.bsdOriginal; | |
673 | description = "Helpers for building command-line apps"; | |
674 | }; | |
675 | }; | |
676 | ||
677 | "click" = python.mkDerivation { | |
678 | name = "click-6.7"; | |
679 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/95/d9/c3336b6b5711c3ab9d1d3a80f1a3e2afeb9d8c02a7166462f6cc96570897/click-6.7.tar.gz"; sha256 = "f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"; }; | |
680 | doCheck = commonDoCheck; | |
681 | buildInputs = commonBuildInputs; | |
682 | propagatedBuildInputs = [ ]; | |
683 | meta = with pkgs.stdenv.lib; { | |
684 | homepage = "http://github.com/mitsuhiko/click"; | |
685 | license = licenses.bsdOriginal; | |
686 | description = "A simple wrapper around optparse for powerful command line utilities."; | |
687 | }; | |
688 | }; | |
689 | ||
690 | "colorama" = python.mkDerivation { | |
691 | name = "colorama-0.3.9"; | |
692 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz"; sha256 = "48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"; }; | |
693 | doCheck = commonDoCheck; | |
694 | buildInputs = commonBuildInputs; | |
695 | propagatedBuildInputs = [ ]; | |
696 | meta = with pkgs.stdenv.lib; { | |
697 | homepage = "https://github.com/tartley/colorama"; | |
698 | license = licenses.bsdOriginal; | |
699 | description = "Cross-platform colored terminal text."; | |
700 | }; | |
701 | }; | |
702 | ||
703 | "configobj" = python.mkDerivation { | |
704 | name = "configobj-5.0.6"; | |
705 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz"; sha256 = "a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"; }; | |
706 | doCheck = commonDoCheck; | |
707 | buildInputs = commonBuildInputs; | |
708 | propagatedBuildInputs = [ | |
709 | self."six" | |
710 | ]; | |
711 | meta = with pkgs.stdenv.lib; { | |
712 | homepage = "https://github.com/DiffSK/configobj"; | |
713 | license = licenses.bsdOriginal; | |
714 | description = "Config file reading, writing and validation."; | |
715 | }; | |
716 | }; | |
717 | ||
718 | "constantly" = python.mkDerivation { | |
719 | name = "constantly-15.1.0"; | |
720 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/95/f1/207a0a478c4bb34b1b49d5915e2db574cadc415c9ac3a7ef17e29b2e8951/constantly-15.1.0.tar.gz"; sha256 = "586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"; }; | |
721 | doCheck = commonDoCheck; | |
722 | buildInputs = commonBuildInputs; | |
723 | propagatedBuildInputs = [ ]; | |
724 | meta = with pkgs.stdenv.lib; { | |
725 | homepage = "https://github.com/twisted/constantly"; | |
726 | license = licenses.mit; | |
727 | description = "Symbolic constants in Python"; | |
728 | }; | |
729 | }; | |
730 | ||
731 | "cookies" = python.mkDerivation { | |
732 | name = "cookies-2.2.1"; | |
733 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f3/95/b66a0ca09c5ec9509d8729e0510e4b078d2451c5e33f47bd6fc33c01517c/cookies-2.2.1.tar.gz"; sha256 = "d6b698788cae4cfa4e62ef8643a9ca332b79bd96cb314294b864ae8d7eb3ee8e"; }; | |
734 | doCheck = commonDoCheck; | |
735 | buildInputs = commonBuildInputs; | |
736 | propagatedBuildInputs = [ ]; | |
737 | meta = with pkgs.stdenv.lib; { | |
738 | homepage = "https://github.com/sashahart/cookies"; | |
739 | license = licenses.mit; | |
740 | description = "Friendlier RFC 6265-compliant cookie parser/renderer"; | |
741 | }; | |
742 | }; | |
743 | ||
744 | "couchdbkit" = python.mkDerivation { | |
745 | name = "couchdbkit-0.6.5"; | |
746 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/a1/13/9e9ff695a385c44f62b4766341b97f2bd8b596962df2a0beabf358468b70/couchdbkit-0.6.5.tar.gz"; sha256 = "9b607f509727e6ada2dbd576a4120c214b1c54f3bb8bf6e2e0eb2cfbb11a0e00"; }; | |
747 | doCheck = commonDoCheck; | |
748 | buildInputs = commonBuildInputs; | |
749 | propagatedBuildInputs = [ | |
750 | self."restkit" | |
751 | ]; | |
752 | meta = with pkgs.stdenv.lib; { | |
753 | homepage = "http://couchdbkit.org"; | |
754 | license = "License :: OSI Approved :: Apache Software License"; | |
755 | description = "Python couchdb kit"; | |
756 | }; | |
757 | }; | |
758 | ||
759 | "coverage" = python.mkDerivation { | |
760 | name = "coverage-4.5.1"; | |
761 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/35/fe/e7df7289d717426093c68d156e0fd9117c8f4872b6588e8a8928a0f68424/coverage-4.5.1.tar.gz"; sha256 = "56e448f051a201c5ebbaa86a5efd0ca90d327204d8b059ab25ad0f35fbfd79f1"; }; | |
762 | doCheck = commonDoCheck; | |
763 | buildInputs = commonBuildInputs; | |
764 | propagatedBuildInputs = [ ]; | |
765 | meta = with pkgs.stdenv.lib; { | |
766 | homepage = "https://bitbucket.org/ned/coveragepy"; | |
767 | license = licenses.asl20; | |
768 | description = "Code coverage measurement for Python"; | |
769 | }; | |
770 | }; | |
771 | ||
772 | "cryptography" = python.mkDerivation { | |
773 | name = "cryptography-2.2.2"; | |
774 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ec/b2/faa78c1ab928d2b2c634c8b41ff1181f0abdd9adf9193211bd606ffa57e2/cryptography-2.2.2.tar.gz"; sha256 = "9fc295bf69130a342e7a19a39d7bbeb15c0bcaabc7382ec33ef3b2b7d18d2f63"; }; | |
775 | doCheck = commonDoCheck; | |
776 | buildInputs = commonBuildInputs; | |
777 | propagatedBuildInputs = [ | |
778 | self."asn1crypto" | |
779 | self."cffi" | |
780 | self."enum34" | |
781 | self."hypothesis" | |
782 | self."idna" | |
783 | self."ipaddress" | |
784 | self."pytest" | |
785 | self."pytz" | |
786 | self."six" | |
787 | ]; | |
788 | meta = with pkgs.stdenv.lib; { | |
789 | homepage = "https://github.com/pyca/cryptography"; | |
790 | license = licenses.bsdOriginal; | |
791 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."; | |
792 | }; | |
793 | }; | |
794 | ||
795 | "deprecation" = python.mkDerivation { | |
796 | name = "deprecation-2.0.2"; | |
797 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d1/98/caa4171c9ad4bb046b18bef84cc6e5d0ae0427baeee920eef53da83fae09/deprecation-2.0.2.tar.gz"; sha256 = "e8d0dc5a17d7d551730e5f23ff3a53fc9e438364b9efb47d41c3e9b05522eabe"; }; | |
798 | doCheck = commonDoCheck; | |
799 | buildInputs = commonBuildInputs; | |
800 | propagatedBuildInputs = [ | |
801 | self."packaging" | |
802 | ]; | |
803 | meta = with pkgs.stdenv.lib; { | |
804 | homepage = "http://deprecation.readthedocs.io/"; | |
805 | license = licenses.asl20; | |
806 | description = "A library to handle automated deprecations"; | |
807 | }; | |
808 | }; | |
809 | ||
810 | "docutils" = python.mkDerivation { | |
811 | name = "docutils-0.14"; | |
812 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz"; sha256 = "51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274"; }; | |
813 | doCheck = commonDoCheck; | |
814 | buildInputs = commonBuildInputs; | |
815 | propagatedBuildInputs = [ ]; | |
816 | meta = with pkgs.stdenv.lib; { | |
817 | homepage = "http://docutils.sourceforge.net/"; | |
818 | license = licenses.publicDomain; | |
819 | description = "Docutils -- Python Documentation Utilities"; | |
820 | }; | |
821 | }; | |
822 | ||
823 | "enum34" = python.mkDerivation { | |
824 | name = "enum34-1.1.6"; | |
825 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz"; sha256 = "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"; }; | |
826 | doCheck = commonDoCheck; | |
827 | buildInputs = commonBuildInputs; | |
828 | propagatedBuildInputs = [ ]; | |
829 | meta = with pkgs.stdenv.lib; { | |
830 | homepage = "https://bitbucket.org/stoneleaf/enum34"; | |
831 | license = licenses.bsdOriginal; | |
832 | description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4"; | |
833 | }; | |
834 | }; | |
835 | ||
836 | "factory-boy" = python.mkDerivation { | |
837 | name = "factory-boy-2.11.1"; | |
838 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d5/b4/649fc4bfd0daf308b5cd10bfa51c50bfa4c4c79e091ed301aca69ef6780e/factory_boy-2.11.1.tar.gz"; sha256 = "6f25cc4761ac109efd503f096e2ad99421b1159f01a29dbb917359dcd68e08ca"; }; | |
839 | doCheck = commonDoCheck; | |
840 | buildInputs = commonBuildInputs; | |
841 | propagatedBuildInputs = [ | |
842 | self."Faker" | |
843 | ]; | |
844 | meta = with pkgs.stdenv.lib; { | |
845 | homepage = "https://github.com/FactoryBoy/factory_boy"; | |
846 | license = licenses.mit; | |
847 | description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby."; | |
848 | }; | |
849 | }; | |
850 | ||
851 | "filedepot" = python.mkDerivation { | |
852 | name = "filedepot-0.5.2"; | |
853 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/8d/73/60668c2e6545d995a97c86086f5d83ed7cd80a70ba282fe485e126114fec/filedepot-0.5.2.tar.gz"; sha256 = "30ff9cb968137253e8d6260ce8b575feb15cb23b44a316dad2aee39de2c6bbfa"; }; | |
854 | doCheck = commonDoCheck; | |
855 | buildInputs = commonBuildInputs; | |
856 | propagatedBuildInputs = [ | |
857 | self."Pillow" | |
858 | self."SQLAlchemy" | |
859 | self."Unidecode" | |
860 | self."coverage" | |
861 | self."mock" | |
862 | self."requests" | |
863 | ]; | |
864 | meta = with pkgs.stdenv.lib; { | |
865 | homepage = "https://github.com/amol-/depot"; | |
866 | license = licenses.mit; | |
867 | description = "Toolkit for storing files and attachments in web applications"; | |
868 | }; | |
869 | }; | |
870 | ||
871 | "filteralchemy" = python.mkDerivation { | |
872 | name = "filteralchemy-0.1.0"; | |
873 | src = pkgs.fetchgit { url = "https://github.com/infobyte/filteralchemy"; sha256 = "0zq1hnnsbvm004r4gq44c2ld2axzh0k4692vzxf74ip5g9fq4kka"; rev = "9ecc951c74786a8174a1d1c278a2c932945e1906"; }; | |
874 | doCheck = commonDoCheck; | |
875 | buildInputs = commonBuildInputs; | |
876 | propagatedBuildInputs = [ | |
877 | self."marshmallow-sqlalchemy" | |
878 | self."six" | |
879 | self."webargs" | |
880 | ]; | |
881 | meta = with pkgs.stdenv.lib; { | |
882 | homepage = "https://github.com/jmcarp/filteralchemy"; | |
883 | license = "Copyright 2015 Joshua Carp"; | |
884 | description = "Declarative query builder for SQLAlchemy"; | |
885 | }; | |
886 | }; | |
887 | ||
888 | "funcsigs" = python.mkDerivation { | |
889 | name = "funcsigs-1.0.2"; | |
890 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz"; sha256 = "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"; }; | |
891 | doCheck = commonDoCheck; | |
892 | buildInputs = commonBuildInputs; | |
893 | propagatedBuildInputs = [ ]; | |
894 | meta = with pkgs.stdenv.lib; { | |
895 | homepage = "http://funcsigs.readthedocs.org"; | |
896 | license = "License :: OSI Approved :: Apache Software License"; | |
897 | description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+"; | |
898 | }; | |
899 | }; | |
900 | ||
901 | "http-parser" = python.mkDerivation { | |
902 | name = "http-parser-0.8.3"; | |
903 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/07/c4/22e3c76c2313c26dd5f84f1205b916ff38ea951aab0c4544b6e2f5920d64/http-parser-0.8.3.tar.gz"; sha256 = "e2aff90a60def3e476bd71694d8757c0f95ebf2fedf0a8ae34ee306e0b20db83"; }; | |
904 | doCheck = commonDoCheck; | |
905 | buildInputs = commonBuildInputs; | |
906 | propagatedBuildInputs = [ ]; | |
907 | meta = with pkgs.stdenv.lib; { | |
908 | homepage = "http://github.com/benoitc/http-parser"; | |
909 | license = licenses.mit; | |
910 | description = "http request/response parser"; | |
911 | }; | |
912 | }; | |
913 | ||
914 | "humanize" = python.mkDerivation { | |
915 | name = "humanize-0.5.1"; | |
916 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/8c/e0/e512e4ac6d091fc990bbe13f9e0378f34cf6eecd1c6c268c9e598dcf5bb9/humanize-0.5.1.tar.gz"; sha256 = "a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19"; }; | |
917 | doCheck = commonDoCheck; | |
918 | buildInputs = commonBuildInputs; | |
919 | propagatedBuildInputs = [ ]; | |
920 | meta = with pkgs.stdenv.lib; { | |
921 | homepage = "http://github.com/jmoiron/humanize"; | |
922 | license = licenses.mit; | |
923 | description = "python humanize utilities"; | |
924 | }; | |
925 | }; | |
926 | ||
927 | "hyperlink" = python.mkDerivation { | |
928 | name = "hyperlink-18.0.0"; | |
929 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/41/e1/0abd4b480ec04892b1db714560f8c855d43df81895c98506442babf3652f/hyperlink-18.0.0.tar.gz"; sha256 = "f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306"; }; | |
930 | doCheck = commonDoCheck; | |
931 | buildInputs = commonBuildInputs; | |
932 | propagatedBuildInputs = [ | |
933 | self."idna" | |
934 | ]; | |
935 | meta = with pkgs.stdenv.lib; { | |
936 | homepage = "https://github.com/python-hyper/hyperlink"; | |
937 | license = licenses.mit; | |
938 | description = "A featureful, immutable, and correct URL for Python."; | |
939 | }; | |
940 | }; | |
941 | ||
942 | "hypothesis" = python.mkDerivation { | |
943 | name = "hypothesis-3.57.0"; | |
944 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d4/77/48d20486e524884ef372fa11c1875f3b67766e5bef3055a6621f6760ce12/hypothesis-3.57.0.tar.gz"; sha256 = "ceb4d9b582184b041adc5647121fbafe3fcf49b7fbd218195d903c3fc6bc7916"; }; | |
945 | doCheck = commonDoCheck; | |
946 | buildInputs = commonBuildInputs; | |
947 | propagatedBuildInputs = [ | |
948 | self."Faker" | |
949 | self."attrs" | |
950 | self."coverage" | |
951 | self."enum34" | |
952 | self."pytest" | |
953 | self."pytz" | |
954 | ]; | |
955 | meta = with pkgs.stdenv.lib; { | |
956 | homepage = "https://github.com/HypothesisWorks/hypothesis/tree/master/hypothesis-python"; | |
957 | license = licenses.mpl20; | |
958 | description = "A library for property based testing"; | |
959 | }; | |
960 | }; | |
961 | ||
962 | "idna" = python.mkDerivation { | |
963 | name = "idna-2.6"; | |
964 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f4/bd/0467d62790828c23c47fc1dfa1b1f052b24efdf5290f071c7a91d0d82fd3/idna-2.6.tar.gz"; sha256 = "2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"; }; | |
965 | doCheck = commonDoCheck; | |
966 | buildInputs = commonBuildInputs; | |
967 | propagatedBuildInputs = [ ]; | |
968 | meta = with pkgs.stdenv.lib; { | |
969 | homepage = "https://github.com/kjd/idna"; | |
970 | license = licenses.bsdOriginal; | |
971 | description = "Internationalized Domain Names in Applications (IDNA)"; | |
972 | }; | |
973 | }; | |
974 | ||
975 | "incremental" = python.mkDerivation { | |
976 | name = "incremental-17.5.0"; | |
977 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/8f/26/02c4016aa95f45479eea37c90c34f8fab6775732ae62587a874b619ca097/incremental-17.5.0.tar.gz"; sha256 = "7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"; }; | |
978 | doCheck = commonDoCheck; | |
979 | buildInputs = commonBuildInputs; | |
980 | propagatedBuildInputs = [ | |
981 | self."Twisted" | |
982 | self."click" | |
983 | ]; | |
984 | meta = with pkgs.stdenv.lib; { | |
985 | homepage = "https://github.com/twisted/incremental"; | |
986 | license = licenses.mit; | |
987 | description = "UNKNOWN"; | |
988 | }; | |
989 | }; | |
990 | ||
991 | "inflection" = python.mkDerivation { | |
992 | name = "inflection-0.3.1"; | |
993 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d5/35/a6eb45b4e2356fe688b21570864d4aa0d0a880ce387defe9c589112077f8/inflection-0.3.1.tar.gz"; sha256 = "18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca"; }; | |
994 | doCheck = commonDoCheck; | |
995 | buildInputs = commonBuildInputs; | |
996 | propagatedBuildInputs = [ ]; | |
997 | meta = with pkgs.stdenv.lib; { | |
998 | homepage = "http://github.com/jpvanhal/inflection"; | |
999 | license = licenses.mit; | |
1000 | description = "A port of Ruby on Rails inflector to Python"; | |
1001 | }; | |
1002 | }; | |
1003 | ||
1004 | "ipaddress" = python.mkDerivation { | |
1005 | name = "ipaddress-1.0.22"; | |
1006 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/97/8d/77b8cedcfbf93676148518036c6b1ce7f8e14bf07e95d7fd4ddcb8cc052f/ipaddress-1.0.22.tar.gz"; sha256 = "b146c751ea45cad6188dd6cf2d9b757f6f4f8d6ffb96a023e6f2e26eea02a72c"; }; | |
1007 | doCheck = commonDoCheck; | |
1008 | buildInputs = commonBuildInputs; | |
1009 | propagatedBuildInputs = [ ]; | |
1010 | meta = with pkgs.stdenv.lib; { | |
1011 | homepage = "https://github.com/phihag/ipaddress"; | |
1012 | license = licenses.psfl; | |
1013 | description = "IPv4/IPv6 manipulation library"; | |
1014 | }; | |
1015 | }; | |
1016 | ||
1017 | "itsdangerous" = python.mkDerivation { | |
1018 | name = "itsdangerous-0.24"; | |
1019 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz"; sha256 = "cbb3fcf8d3e33df861709ecaf89d9e6629cff0a217bc2848f1b41cd30d360519"; }; | |
1020 | doCheck = commonDoCheck; | |
1021 | buildInputs = commonBuildInputs; | |
1022 | propagatedBuildInputs = [ ]; | |
1023 | meta = with pkgs.stdenv.lib; { | |
1024 | homepage = "http://github.com/mitsuhiko/itsdangerous"; | |
1025 | license = licenses.bsdOriginal; | |
1026 | description = "Various helpers to pass trusted data to untrusted environments and back."; | |
1027 | }; | |
1028 | }; | |
1029 | ||
1030 | "m2r" = python.mkDerivation { | |
1031 | name = "m2r-0.1.14"; | |
1032 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/af/5d/23146b34b38632a04ec6a176e8d2b7d138dce373a1af5efd91ea1515d858/m2r-0.1.14.tar.gz"; sha256 = "a14635cdeedb125f0f85e014eb5898fd634e2da358a160c124818e9c9f851add"; }; | |
1033 | doCheck = commonDoCheck; | |
1034 | buildInputs = commonBuildInputs; | |
1035 | propagatedBuildInputs = [ | |
1036 | self."docutils" | |
1037 | self."mistune" | |
1038 | ]; | |
1039 | meta = with pkgs.stdenv.lib; { | |
1040 | homepage = "https://github.com/miyakogi/m2r"; | |
1041 | license = licenses.mit; | |
1042 | description = "Markdown and reStructuredText in a single file."; | |
1043 | }; | |
1044 | }; | |
1045 | ||
1046 | "marshmallow" = python.mkDerivation { | |
1047 | name = "marshmallow-2.15.3"; | |
1048 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/97/e5/03fdf9acc5f8524a95563e7aae15e7a295fc869f4ab1671cb38cb439606e/marshmallow-2.15.3.tar.gz"; sha256 = "171f409d48b44786b7df2793cbd7f1a9062f0fe2c14d547da536b5010f671ade"; }; | |
1049 | doCheck = commonDoCheck; | |
1050 | buildInputs = commonBuildInputs; | |
1051 | propagatedBuildInputs = [ | |
1052 | self."python-dateutil" | |
1053 | ]; | |
1054 | meta = with pkgs.stdenv.lib; { | |
1055 | homepage = "https://github.com/marshmallow-code/marshmallow"; | |
1056 | license = licenses.mit; | |
1057 | description = "A lightweight library for converting complex datatypes to and from native Python datatypes."; | |
1058 | }; | |
1059 | }; | |
1060 | ||
1061 | "marshmallow-sqlalchemy" = python.mkDerivation { | |
1062 | name = "marshmallow-sqlalchemy-0.14.0"; | |
1063 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/79/e3/b55e62620d975e8b62b58674cad7c774c3425790745137b2771f5ed18bc3/marshmallow-sqlalchemy-0.14.0.tar.gz"; sha256 = "32ff19350a8892b3e8dc954eeeac796576bb89356512f9e1ccd33da63f856930"; }; | |
1064 | doCheck = commonDoCheck; | |
1065 | buildInputs = commonBuildInputs; | |
1066 | propagatedBuildInputs = [ | |
1067 | self."SQLAlchemy" | |
1068 | self."marshmallow" | |
1069 | ]; | |
1070 | meta = with pkgs.stdenv.lib; { | |
1071 | homepage = "https://github.com/marshmallow-code/marshmallow-sqlalchemy"; | |
1072 | license = licenses.mit; | |
1073 | description = "SQLAlchemy integration with the marshmallow (de)serialization library"; | |
1074 | }; | |
1075 | }; | |
1076 | ||
1077 | "mistune" = python.mkDerivation { | |
1078 | name = "mistune-0.8.3"; | |
1079 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9d/be/e06d4346cc608a01dec6bf770d7d0303a4fd6db588b318ced18f5f257145/mistune-0.8.3.tar.gz"; sha256 = "bc10c33bfdcaa4e749b779f62f60d6e12f8215c46a292d05e486b869ae306619"; }; | |
1080 | doCheck = commonDoCheck; | |
1081 | buildInputs = commonBuildInputs; | |
1082 | propagatedBuildInputs = [ ]; | |
1083 | meta = with pkgs.stdenv.lib; { | |
1084 | homepage = "https://github.com/lepture/mistune"; | |
1085 | license = licenses.bsdOriginal; | |
1086 | description = "The fastest markdown parser in pure Python"; | |
1087 | }; | |
1088 | }; | |
1089 | ||
1090 | "mock" = python.mkDerivation { | |
1091 | name = "mock-2.0.0"; | |
1092 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/0c/53/014354fc93c591ccc4abff12c473ad565a2eb24dcd82490fae33dbf2539f/mock-2.0.0.tar.gz"; sha256 = "b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba"; }; | |
1093 | doCheck = commonDoCheck; | |
1094 | buildInputs = commonBuildInputs; | |
1095 | propagatedBuildInputs = [ | |
1096 | self."Jinja2" | |
1097 | self."Pygments" | |
1098 | self."funcsigs" | |
1099 | self."pbr" | |
1100 | self."six" | |
1101 | ]; | |
1102 | meta = with pkgs.stdenv.lib; { | |
1103 | homepage = "https://github.com/testing-cabal/mock"; | |
1104 | license = licenses.bsdOriginal; | |
1105 | description = "Rolling backport of unittest.mock for all Pythons"; | |
1106 | }; | |
1107 | }; | |
1108 | ||
1109 | "more-itertools" = python.mkDerivation { | |
1110 | name = "more-itertools-4.2.0"; | |
1111 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/c0/2f/6773347277d76c5ade4414a6c3f785ef27e7f5c4b0870ec7e888e66a8d83/more-itertools-4.2.0.tar.gz"; sha256 = "2b6b9893337bfd9166bee6a62c2b0c9fe7735dcf85948b387ec8cba30e85d8e8"; }; | |
1112 | doCheck = commonDoCheck; | |
1113 | buildInputs = commonBuildInputs; | |
1114 | propagatedBuildInputs = [ | |
1115 | self."six" | |
1116 | ]; | |
1117 | meta = with pkgs.stdenv.lib; { | |
1118 | homepage = "https://github.com/erikrose/more-itertools"; | |
1119 | license = licenses.mit; | |
1120 | description = "More routines for operating on iterables, beyond itertools"; | |
1121 | }; | |
1122 | }; | |
1123 | ||
1124 | "nplusone" = python.mkDerivation { | |
1125 | name = "nplusone-1.0.0"; | |
1126 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/26/da/663f551cdda166eaf75a564f64d022c6eb03c710ba83c3fb0f4ac664ebde/nplusone-1.0.0.tar.gz"; sha256 = "1726c0a10c0aa7eabb04e24db2882ff97b6b7ee29d729a8d97dcbd12ef5a5651"; }; | |
1127 | doCheck = commonDoCheck; | |
1128 | buildInputs = commonBuildInputs; | |
1129 | propagatedBuildInputs = [ | |
1130 | self."blinker" | |
1131 | self."six" | |
1132 | ]; | |
1133 | meta = with pkgs.stdenv.lib; { | |
1134 | homepage = "https://github.com/jmcarp/nplusone"; | |
1135 | license = "Copyright 2016 Joshua Carp"; | |
1136 | description = "Detecting the n+1 queries problem in Python"; | |
1137 | }; | |
1138 | }; | |
1139 | ||
1140 | "packaging" = python.mkDerivation { | |
1141 | name = "packaging-17.1"; | |
1142 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/77/32/439f47be99809c12ef2da8b60a2c47987786d2c6c9205549dd6ef95df8bd/packaging-17.1.tar.gz"; sha256 = "f019b770dd64e585a99714f1fd5e01c7a8f11b45635aa953fd41c689a657375b"; }; | |
1143 | doCheck = commonDoCheck; | |
1144 | buildInputs = commonBuildInputs; | |
1145 | propagatedBuildInputs = [ | |
1146 | self."pyparsing" | |
1147 | self."six" | |
1148 | ]; | |
1149 | meta = with pkgs.stdenv.lib; { | |
1150 | homepage = "https://github.com/pypa/packaging"; | |
1151 | license = licenses.bsdOriginal; | |
1152 | description = "Core utilities for Python packages"; | |
1153 | }; | |
1154 | }; | |
1155 | ||
1156 | "passlib" = python.mkDerivation { | |
1157 | name = "passlib-1.7.1"; | |
1158 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/25/4b/6fbfc66aabb3017cd8c3bd97b37f769d7503ead2899bf76e570eb91270de/passlib-1.7.1.tar.gz"; sha256 = "3d948f64138c25633613f303bcc471126eae67c04d5e3f6b7b8ce6242f8653e0"; }; | |
1159 | doCheck = commonDoCheck; | |
1160 | buildInputs = commonBuildInputs; | |
1161 | propagatedBuildInputs = [ | |
1162 | self."bcrypt" | |
1163 | self."cryptography" | |
1164 | ]; | |
1165 | meta = with pkgs.stdenv.lib; { | |
1166 | homepage = "https://bitbucket.org/ecollins/passlib"; | |
1167 | license = licenses.bsdOriginal; | |
1168 | description = "comprehensive password hashing framework supporting over 30 schemes"; | |
1169 | }; | |
1170 | }; | |
1171 | ||
1172 | "pbr" = python.mkDerivation { | |
1173 | name = "pbr-4.0.4"; | |
1174 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/cd/9f/8f14a51b522c47a315dd969fbdf39233e41f0bfa8b996b4ff0ad852ff43d/pbr-4.0.4.tar.gz"; sha256 = "a9c27eb8f0e24e786e544b2dbaedb729c9d8546342b5a6818d8eda098ad4340d"; }; | |
1175 | doCheck = commonDoCheck; | |
1176 | buildInputs = commonBuildInputs; | |
1177 | propagatedBuildInputs = [ ]; | |
1178 | meta = with pkgs.stdenv.lib; { | |
1179 | homepage = "https://docs.openstack.org/pbr/latest/"; | |
1180 | license = "License :: OSI Approved :: Apache Software License"; | |
1181 | description = "Python Build Reasonableness"; | |
1182 | }; | |
1183 | }; | |
1184 | ||
1185 | "pgcli" = python.mkDerivation { | |
1186 | name = "pgcli-1.9.1"; | |
1187 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/75/3c/901421409520be8145c08d1a24c8e9717f6df871299045602421f1e9436b/pgcli-1.9.1.tar.gz"; sha256 = "8274dca13407b2904453018488d02302bce01df21ac3f3bf30a21b1880ce0ce8"; }; | |
1188 | doCheck = commonDoCheck; | |
1189 | buildInputs = commonBuildInputs; | |
1190 | propagatedBuildInputs = [ | |
1191 | self."Pygments" | |
1192 | self."cli-helpers" | |
1193 | self."click" | |
1194 | self."configobj" | |
1195 | self."humanize" | |
1196 | self."pgspecial" | |
1197 | self."prompt-toolkit" | |
1198 | self."psycopg2" | |
1199 | self."setproctitle" | |
1200 | self."sqlparse" | |
1201 | ]; | |
1202 | meta = with pkgs.stdenv.lib; { | |
1203 | homepage = "http://pgcli.com"; | |
1204 | license = licenses.bsdOriginal; | |
1205 | description = "CLI for Postgres Database. With auto-completion and syntax highlighting."; | |
1206 | }; | |
1207 | }; | |
1208 | ||
1209 | "pgspecial" = python.mkDerivation { | |
1210 | name = "pgspecial-1.11.0"; | |
1211 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/0f/07/847815d9effa367ac045a8d8b2ef62058a348f3dea41b98f98d1a33c71f9/pgspecial-1.11.0.tar.gz"; sha256 = "a4511ba8b65b1f68eb2f8242f052b431534aa4b343788d17aa58cdd864d18d7c"; }; | |
1212 | doCheck = commonDoCheck; | |
1213 | buildInputs = commonBuildInputs; | |
1214 | propagatedBuildInputs = [ | |
1215 | self."click" | |
1216 | self."sqlparse" | |
1217 | ]; | |
1218 | meta = with pkgs.stdenv.lib; { | |
1219 | homepage = "https://www.dbcli.com"; | |
1220 | license = licenses.bsdOriginal; | |
1221 | description = "Meta-commands handler for Postgres Database."; | |
1222 | }; | |
1223 | }; | |
1224 | ||
1225 | "pluggy" = python.mkDerivation { | |
1226 | name = "pluggy-0.6.0"; | |
1227 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz"; sha256 = "7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff"; }; | |
1228 | doCheck = commonDoCheck; | |
1229 | buildInputs = commonBuildInputs; | |
1230 | propagatedBuildInputs = [ ]; | |
1231 | meta = with pkgs.stdenv.lib; { | |
1232 | homepage = "https://github.com/pytest-dev/pluggy"; | |
1233 | license = licenses.mit; | |
1234 | description = "plugin and hook calling mechanisms for python"; | |
1235 | }; | |
1236 | }; | |
1237 | ||
1238 | "prompt-toolkit" = python.mkDerivation { | |
1239 | name = "prompt-toolkit-1.0.15"; | |
1240 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/8a/ad/cf6b128866e78ad6d7f1dc5b7f99885fb813393d9860778b2984582e81b5/prompt_toolkit-1.0.15.tar.gz"; sha256 = "858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"; }; | |
1241 | doCheck = commonDoCheck; | |
1242 | buildInputs = commonBuildInputs; | |
1243 | propagatedBuildInputs = [ | |
1244 | self."six" | |
1245 | self."wcwidth" | |
1246 | ]; | |
1247 | meta = with pkgs.stdenv.lib; { | |
1248 | homepage = "https://github.com/jonathanslenders/python-prompt-toolkit"; | |
1249 | license = licenses.bsdOriginal; | |
1250 | description = "Library for building powerful interactive command lines in Python"; | |
1251 | }; | |
1252 | }; | |
1253 | ||
1254 | "psycopg2" = python.mkDerivation { | |
1255 | name = "psycopg2-2.7.4"; | |
1256 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz"; sha256 = "8bf51191d60f6987482ef0cfe8511bbf4877a5aa7f313d7b488b53189cf26209"; }; | |
1257 | doCheck = commonDoCheck; | |
1258 | buildInputs = commonBuildInputs; | |
1259 | propagatedBuildInputs = [ ]; | |
1260 | meta = with pkgs.stdenv.lib; { | |
1261 | homepage = "http://initd.org/psycopg/"; | |
1262 | license = licenses.lgpl2; | |
1263 | description = "psycopg2 - Python-PostgreSQL Database Adapter"; | |
1264 | }; | |
1265 | }; | |
1266 | ||
1267 | "py" = python.mkDerivation { | |
1268 | name = "py-1.5.3"; | |
1269 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz"; sha256 = "29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881"; }; | |
1270 | doCheck = commonDoCheck; | |
1271 | buildInputs = commonBuildInputs; | |
1272 | propagatedBuildInputs = [ ]; | |
1273 | meta = with pkgs.stdenv.lib; { | |
1274 | homepage = "http://py.readthedocs.io/"; | |
1275 | license = licenses.mit; | |
1276 | description = "library with cross-python path, ini-parsing, io, code, log facilities"; | |
1277 | }; | |
1278 | }; | |
1279 | ||
1280 | "pyOpenSSL" = python.mkDerivation { | |
1281 | name = "pyOpenSSL-18.0.0"; | |
1282 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9b/7c/ee600b2a9304d260d96044ab5c5e57aa489755b92bbeb4c0803f9504f480/pyOpenSSL-18.0.0.tar.gz"; sha256 = "6488f1423b00f73b7ad5167885312bb0ce410d3312eb212393795b53c8caa580"; }; | |
1283 | doCheck = commonDoCheck; | |
1284 | buildInputs = commonBuildInputs; | |
1285 | propagatedBuildInputs = [ | |
1286 | self."cryptography" | |
1287 | self."pytest" | |
1288 | self."six" | |
1289 | ]; | |
1290 | meta = with pkgs.stdenv.lib; { | |
1291 | homepage = "https://pyopenssl.org/"; | |
1292 | license = licenses.asl20; | |
1293 | description = "Python wrapper module around the OpenSSL library"; | |
1294 | }; | |
1295 | }; | |
1296 | ||
1297 | "pyasn1" = python.mkDerivation { | |
1298 | name = "pyasn1-0.4.3"; | |
1299 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/0d/33/3466a3210321a02040e3ab2cd1ffc6f44664301a5d650a7e44be1dc341f2/pyasn1-0.4.3.tar.gz"; sha256 = "fb81622d8f3509f0026b0683fe90fea27be7284d3826a5f2edf97f69151ab0fc"; }; | |
1300 | doCheck = commonDoCheck; | |
1301 | buildInputs = commonBuildInputs; | |
1302 | propagatedBuildInputs = [ ]; | |
1303 | meta = with pkgs.stdenv.lib; { | |
1304 | homepage = "https://github.com/etingof/pyasn1"; | |
1305 | license = licenses.bsdOriginal; | |
1306 | description = "ASN.1 types and codecs"; | |
1307 | }; | |
1308 | }; | |
1309 | ||
1310 | "pyasn1-modules" = python.mkDerivation { | |
1311 | name = "pyasn1-modules-0.2.1"; | |
1312 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ab/76/36ab0e099e6bd27ed95b70c2c86c326d3affa59b9b535c63a2f892ac9f45/pyasn1-modules-0.2.1.tar.gz"; sha256 = "af00ea8f2022b6287dc375b2c70f31ab5af83989fc6fe9eacd4976ce26cd7ccc"; }; | |
1313 | doCheck = commonDoCheck; | |
1314 | buildInputs = commonBuildInputs; | |
1315 | propagatedBuildInputs = [ | |
1316 | self."pyasn1" | |
1317 | ]; | |
1318 | meta = with pkgs.stdenv.lib; { | |
1319 | homepage = "https://github.com/etingof/pyasn1-modules"; | |
1320 | license = licenses.bsdOriginal; | |
1321 | description = "A collection of ASN.1-based protocols modules."; | |
1322 | }; | |
1323 | }; | |
1324 | ||
1325 | "pycparser" = python.mkDerivation { | |
1326 | name = "pycparser-2.18"; | |
1327 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/8c/2d/aad7f16146f4197a11f8e91fb81df177adcc2073d36a17b1491fd09df6ed/pycparser-2.18.tar.gz"; sha256 = "99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"; }; | |
1328 | doCheck = commonDoCheck; | |
1329 | buildInputs = commonBuildInputs; | |
1330 | propagatedBuildInputs = [ ]; | |
1331 | meta = with pkgs.stdenv.lib; { | |
1332 | homepage = "https://github.com/eliben/pycparser"; | |
1333 | license = licenses.bsdOriginal; | |
1334 | description = "C parser in Python"; | |
1335 | }; | |
1336 | }; | |
1337 | ||
1338 | "pydot" = python.mkDerivation { | |
1339 | name = "pydot-1.2.4"; | |
1340 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/c3/f1/e61d6dfe6c1768ed2529761a68f70939e2569da043e9f15a8d84bf56cadf/pydot-1.2.4.tar.gz"; sha256 = "92d2e2d15531d00710f2d6fb5540d2acabc5399d464f2f20d5d21073af241eb6"; }; | |
1341 | doCheck = commonDoCheck; | |
1342 | buildInputs = commonBuildInputs; | |
1343 | propagatedBuildInputs = [ | |
1344 | self."pyparsing" | |
1345 | ]; | |
1346 | meta = with pkgs.stdenv.lib; { | |
1347 | homepage = "https://github.com/erocarrera/pydot"; | |
1348 | license = licenses.mit; | |
1349 | description = "Python interface to Graphviz's Dot"; | |
1350 | }; | |
1351 | }; | |
1352 | ||
1353 | "pyparsing" = python.mkDerivation { | |
1354 | name = "pyparsing-2.2.0"; | |
1355 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/3c/ec/a94f8cf7274ea60b5413df054f82a8980523efd712ec55a59e7c3357cf7c/pyparsing-2.2.0.tar.gz"; sha256 = "0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04"; }; | |
1356 | doCheck = commonDoCheck; | |
1357 | buildInputs = commonBuildInputs; | |
1358 | propagatedBuildInputs = [ ]; | |
1359 | meta = with pkgs.stdenv.lib; { | |
1360 | homepage = "http://pyparsing.wikispaces.com/"; | |
1361 | license = licenses.mit; | |
1362 | description = "Python parsing module"; | |
1363 | }; | |
1364 | }; | |
1365 | ||
1366 | "pytest" = python.mkDerivation { | |
1367 | name = "pytest-3.6.1"; | |
1368 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/46/0e/d06d37d546bd181358eb3fb24b9c097609dae9a8cc0ed5756eefddd47841/pytest-3.6.1.tar.gz"; sha256 = "32c49a69566aa7c333188149ad48b58ac11a426d5352ea3d8f6ce843f88199cb"; }; | |
1369 | doCheck = commonDoCheck; | |
1370 | buildInputs = commonBuildInputs; | |
1371 | propagatedBuildInputs = [ | |
1372 | self."atomicwrites" | |
1373 | self."attrs" | |
1374 | self."colorama" | |
1375 | self."funcsigs" | |
1376 | self."more-itertools" | |
1377 | self."pluggy" | |
1378 | self."py" | |
1379 | self."six" | |
1380 | ]; | |
1381 | meta = with pkgs.stdenv.lib; { | |
1382 | homepage = "http://pytest.org"; | |
1383 | license = licenses.mit; | |
1384 | description = "pytest: simple powerful testing with Python"; | |
1385 | }; | |
1386 | }; | |
1387 | ||
1388 | "pytest-factoryboy" = python.mkDerivation { | |
1389 | name = "pytest-factoryboy-2.0.1"; | |
1390 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/80/15/294f84a4d3159f6be5524b8f02b70aae82c86e2341c27ac00fdd26b0d44f/pytest-factoryboy-2.0.1.tar.gz"; sha256 = "ad438d191d2b2a0f26956d437c1963875db573147a84ffd85d7bbeaefae22458"; }; | |
1391 | doCheck = commonDoCheck; | |
1392 | buildInputs = commonBuildInputs; | |
1393 | propagatedBuildInputs = [ | |
1394 | self."factory-boy" | |
1395 | self."inflection" | |
1396 | self."pytest" | |
1397 | ]; | |
1398 | meta = with pkgs.stdenv.lib; { | |
1399 | homepage = "https://github.com/pytest-dev/pytest-factoryboy"; | |
1400 | license = licenses.mit; | |
1401 | description = "Factory Boy support for pytest."; | |
1402 | }; | |
1403 | }; | |
1404 | ||
1405 | "pytest-runner" = python.mkDerivation { | |
1406 | name = "pytest-runner-4.2"; | |
1407 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9e/b7/fe6e8f87f9a756fd06722216f1b6698ccba4d269eac6329d9f0c441d0f93/pytest-runner-4.2.tar.gz"; sha256 = "d23f117be39919f00dd91bffeb4f15e031ec797501b717a245e377aee0f577be"; }; | |
1408 | doCheck = commonDoCheck; | |
1409 | buildInputs = commonBuildInputs; | |
1410 | propagatedBuildInputs = [ | |
1411 | self."pytest" | |
1412 | ]; | |
1413 | meta = with pkgs.stdenv.lib; { | |
1414 | homepage = "https://github.com/pytest-dev/pytest-runner"; | |
1415 | license = licenses.mit; | |
1416 | description = "Invoke py.test as distutils command with dependency resolution"; | |
1417 | }; | |
1418 | }; | |
1419 | ||
1420 | "python-dateutil" = python.mkDerivation { | |
1421 | name = "python-dateutil-2.7.3"; | |
1422 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/a0/b0/a4e3241d2dee665fea11baec21389aec6886655cd4db7647ddf96c3fad15/python-dateutil-2.7.3.tar.gz"; sha256 = "e27001de32f627c22380a688bcc43ce83504a7bc5da472209b4c70f02829f0b8"; }; | |
1423 | doCheck = commonDoCheck; | |
1424 | buildInputs = commonBuildInputs; | |
1425 | propagatedBuildInputs = [ | |
1426 | self."six" | |
1427 | ]; | |
1428 | meta = with pkgs.stdenv.lib; { | |
1429 | homepage = "https://dateutil.readthedocs.io"; | |
1430 | license = licenses.bsdOriginal; | |
1431 | description = "Extensions to the standard Python datetime module"; | |
1432 | }; | |
1433 | }; | |
1434 | ||
1435 | "python-editor" = python.mkDerivation { | |
1436 | name = "python-editor-1.0.3"; | |
1437 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/65/1e/adf6e000ea5dc909aa420352d6ba37f16434c8a3c2fa030445411a1ed545/python-editor-1.0.3.tar.gz"; sha256 = "a3c066acee22a1c94f63938341d4fb374e3fdd69366ed6603d7b24bed1efc565"; }; | |
1438 | doCheck = commonDoCheck; | |
1439 | buildInputs = commonBuildInputs; | |
1440 | propagatedBuildInputs = [ ]; | |
1441 | meta = with pkgs.stdenv.lib; { | |
1442 | homepage = "https://github.com/fmoo/python-editor"; | |
1443 | license = "License :: OSI Approved :: Apache Software License"; | |
1444 | description = "Programmatically open an editor, capture the result."; | |
1445 | }; | |
1446 | }; | |
1447 | ||
1448 | "python-slugify" = python.mkDerivation { | |
1449 | name = "python-slugify-1.2.5"; | |
1450 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/70/c1/98bfb2c981787dcec4613c5da2c17d6f54613935b0e3a877e87a9fa974e4/python-slugify-1.2.5.tar.gz"; sha256 = "5dbb360b882b2dabe0471a1a92f604504d83c2a73c71f2098d004ab62e695534"; }; | |
1451 | doCheck = commonDoCheck; | |
1452 | buildInputs = commonBuildInputs; | |
1453 | propagatedBuildInputs = [ | |
1454 | self."Unidecode" | |
1455 | ]; | |
1456 | meta = with pkgs.stdenv.lib; { | |
1457 | homepage = "https://github.com/un33k/python-slugify"; | |
1458 | license = licenses.mit; | |
1459 | description = "A Python Slugify application that handles Unicode"; | |
1460 | }; | |
1461 | }; | |
1462 | ||
1463 | "pytz" = python.mkDerivation { | |
1464 | name = "pytz-2018.4"; | |
1465 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/10/76/52efda4ef98e7544321fd8d5d512e11739c1df18b0649551aeccfb1c8376/pytz-2018.4.tar.gz"; sha256 = "c06425302f2cf668f1bba7a0a03f3c1d34d4ebeef2c72003da308b3947c7f749"; }; | |
1466 | doCheck = commonDoCheck; | |
1467 | buildInputs = commonBuildInputs; | |
1468 | propagatedBuildInputs = [ ]; | |
1469 | meta = with pkgs.stdenv.lib; { | |
1470 | homepage = "http://pythonhosted.org/pytz"; | |
1471 | license = licenses.mit; | |
1472 | description = "World timezone definitions, modern and historical"; | |
1473 | }; | |
1474 | }; | |
1475 | ||
1476 | "requests" = python.mkDerivation { | |
1477 | name = "requests-2.18.4"; | |
1478 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz"; sha256 = "9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"; }; | |
1479 | doCheck = commonDoCheck; | |
1480 | buildInputs = commonBuildInputs; | |
1481 | propagatedBuildInputs = [ | |
1482 | self."certifi" | |
1483 | self."chardet" | |
1484 | self."cryptography" | |
1485 | self."idna" | |
1486 | self."pyOpenSSL" | |
1487 | self."urllib3" | |
1488 | ]; | |
1489 | meta = with pkgs.stdenv.lib; { | |
1490 | homepage = "http://python-requests.org"; | |
1491 | license = licenses.asl20; | |
1492 | description = "Python HTTP for Humans."; | |
1493 | }; | |
1494 | }; | |
1495 | ||
1496 | "responses" = python.mkDerivation { | |
1497 | name = "responses-0.9.0"; | |
1498 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/67/cb/0a5390f7b8944cfa7e4079a839adba964d858d27a60af7b2683248148339/responses-0.9.0.tar.gz"; sha256 = "c6082710f4abfb60793899ca5f21e7ceb25aabf321560cc0726f8b59006811c9"; }; | |
1499 | doCheck = commonDoCheck; | |
1500 | buildInputs = commonBuildInputs; | |
1501 | propagatedBuildInputs = [ | |
1502 | self."cookies" | |
1503 | self."coverage" | |
1504 | self."mock" | |
1505 | self."pytest" | |
1506 | self."requests" | |
1507 | self."six" | |
1508 | ]; | |
1509 | meta = with pkgs.stdenv.lib; { | |
1510 | homepage = "https://github.com/getsentry/responses"; | |
1511 | license = licenses.asl20; | |
1512 | description = "A utility library for mocking out the `requests` Python library."; | |
1513 | }; | |
1514 | }; | |
1515 | ||
1516 | "restkit" = python.mkDerivation { | |
1517 | name = "restkit-4.2.2"; | |
1518 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/76/b9/d90120add1be718f853c53008cf5b62d74abad1d32bd1e7097dd913ae053/restkit-4.2.2.tar.gz"; sha256 = "c0bda8eb7c643b5e818b612dab49121393abc8589c6cbe9b84085079d598599d"; }; | |
1519 | doCheck = commonDoCheck; | |
1520 | buildInputs = commonBuildInputs; | |
1521 | propagatedBuildInputs = [ | |
1522 | self."http-parser" | |
1523 | self."socketpool" | |
1524 | ]; | |
1525 | meta = with pkgs.stdenv.lib; { | |
1526 | homepage = "http://benoitc.github.com/restkit"; | |
1527 | license = licenses.mit; | |
1528 | description = "Python REST kit"; | |
1529 | }; | |
1530 | }; | |
1531 | ||
1532 | "service-identity" = python.mkDerivation { | |
1533 | name = "service-identity-17.0.0"; | |
1534 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/de/2a/cab6e30be82c8fcd2339ef618036720eda954cf05daef514e386661c9221/service_identity-17.0.0.tar.gz"; sha256 = "4001fbb3da19e0df22c47a06d29681a398473af4aa9d745eca525b3b2c2302ab"; }; | |
1535 | doCheck = commonDoCheck; | |
1536 | buildInputs = commonBuildInputs; | |
1537 | propagatedBuildInputs = [ | |
1538 | self."attrs" | |
1539 | self."idna" | |
1540 | self."pyOpenSSL" | |
1541 | self."pyasn1" | |
1542 | self."pyasn1-modules" | |
1543 | ]; | |
1544 | meta = with pkgs.stdenv.lib; { | |
1545 | homepage = "https://service-identity.readthedocs.io/"; | |
1546 | license = licenses.mit; | |
1547 | description = "Service identity verification for pyOpenSSL."; | |
1548 | }; | |
1549 | }; | |
1550 | ||
1551 | "setproctitle" = python.mkDerivation { | |
1552 | name = "setproctitle-1.1.10"; | |
1553 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/5a/0d/dc0d2234aacba6cf1a729964383e3452c52096dc695581248b548786f2b3/setproctitle-1.1.10.tar.gz"; sha256 = "6283b7a58477dd8478fbb9e76defb37968ee4ba47b05ec1c053cb39638bd7398"; }; | |
1554 | doCheck = commonDoCheck; | |
1555 | buildInputs = commonBuildInputs; | |
1556 | propagatedBuildInputs = [ ]; | |
1557 | meta = with pkgs.stdenv.lib; { | |
1558 | homepage = "https://github.com/dvarrazzo/py-setproctitle"; | |
1559 | license = licenses.bsdOriginal; | |
1560 | description = "A Python module to customize the process title"; | |
1561 | }; | |
1562 | }; | |
1563 | ||
1564 | "setuptools-scm" = python.mkDerivation { | |
1565 | name = "setuptools-scm-2.1.0"; | |
1566 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/e5/62/f9e1ac314464eb5945c97542acb6bf6f3381dfa5d7a658de7730c36f31a1/setuptools_scm-2.1.0.tar.gz"; sha256 = "a767141fecdab1c0b3c8e4c788ac912d7c94a0d6c452d40777ba84f918316379"; }; | |
1567 | doCheck = commonDoCheck; | |
1568 | buildInputs = commonBuildInputs; | |
1569 | propagatedBuildInputs = [ ]; | |
1570 | meta = with pkgs.stdenv.lib; { | |
1571 | homepage = "https://github.com/pypa/setuptools_scm/"; | |
1572 | license = licenses.mit; | |
1573 | description = "the blessed package to manage your versions by scm tags"; | |
1574 | }; | |
1575 | }; | |
1576 | ||
1577 | "six" = python.mkDerivation { | |
1578 | name = "six-1.11.0"; | |
1579 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz"; sha256 = "70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"; }; | |
1580 | doCheck = commonDoCheck; | |
1581 | buildInputs = commonBuildInputs; | |
1582 | propagatedBuildInputs = [ ]; | |
1583 | meta = with pkgs.stdenv.lib; { | |
1584 | homepage = "http://pypi.python.org/pypi/six/"; | |
1585 | license = licenses.mit; | |
1586 | description = "Python 2 and 3 compatibility utilities"; | |
1587 | }; | |
1588 | }; | |
1589 | ||
1590 | "socketpool" = python.mkDerivation { | |
1591 | name = "socketpool-0.5.3"; | |
1592 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/d1/39/fae99a735227234ffec389b252c6de2bc7816bf627f56b4c558dc46c85aa/socketpool-0.5.3.tar.gz"; sha256 = "a06733434a56c4b60b8fcaa168102d2386253d36425804d55532a6bbbda6e2ec"; }; | |
1593 | doCheck = commonDoCheck; | |
1594 | buildInputs = commonBuildInputs; | |
1595 | propagatedBuildInputs = [ ]; | |
1596 | meta = with pkgs.stdenv.lib; { | |
1597 | homepage = "http://github.com/benoitc/socketpool"; | |
1598 | license = licenses.mit; | |
1599 | description = "Python socket pool"; | |
1600 | }; | |
1601 | }; | |
1602 | ||
1603 | "speaklater" = python.mkDerivation { | |
1604 | name = "speaklater-1.3"; | |
1605 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/11/92/5ae1effe0ccb8561c034a0111d53c8788660ddb7ed4992f0da1bb5c525e5/speaklater-1.3.tar.gz"; sha256 = "59fea336d0eed38c1f0bf3181ee1222d0ef45f3a9dd34ebe65e6bfffdd6a65a9"; }; | |
1606 | doCheck = commonDoCheck; | |
1607 | buildInputs = commonBuildInputs; | |
1608 | propagatedBuildInputs = [ ]; | |
1609 | meta = with pkgs.stdenv.lib; { | |
1610 | homepage = "http://github.com/mitsuhiko/speaklater"; | |
1611 | license = licenses.bsdOriginal; | |
1612 | description = "implements a lazy string for python useful for use with gettext"; | |
1613 | }; | |
1614 | }; | |
1615 | ||
1616 | "sqlalchemy-schemadisplay" = python.mkDerivation { | |
1617 | name = "sqlalchemy-schemadisplay-1.3"; | |
1618 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ac/6a/de5911b2837278f3cf89b99b0fd94461f789b8f083537ff14ff9aa6d3397/sqlalchemy_schemadisplay-1.3.tar.gz"; sha256 = "0a9f26d77be9d92c9564d87cc17668fe141a816036c5f5d7c8cb053b253957e0"; }; | |
1619 | doCheck = commonDoCheck; | |
1620 | buildInputs = commonBuildInputs; | |
1621 | propagatedBuildInputs = [ | |
1622 | self."pydot" | |
1623 | ]; | |
1624 | meta = with pkgs.stdenv.lib; { | |
1625 | homepage = "https://github.com/fschulze/sqlalchemy_schemadisplay"; | |
1626 | license = licenses.mit; | |
1627 | description = "Turn SQLAlchemy DB Model into a graph"; | |
1628 | }; | |
1629 | }; | |
1630 | ||
1631 | "sqlparse" = python.mkDerivation { | |
1632 | name = "sqlparse-0.2.4"; | |
1633 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/79/3c/2ad76ba49f9e3d88d2b58e135b7821d93741856d1fe49970171f73529303/sqlparse-0.2.4.tar.gz"; sha256 = "ce028444cfab83be538752a2ffdb56bc417b7784ff35bb9a3062413717807dec"; }; | |
1634 | doCheck = commonDoCheck; | |
1635 | buildInputs = commonBuildInputs; | |
1636 | propagatedBuildInputs = [ ]; | |
1637 | meta = with pkgs.stdenv.lib; { | |
1638 | homepage = "https://github.com/andialbrecht/sqlparse"; | |
1639 | license = licenses.bsdOriginal; | |
1640 | description = "Non-validating SQL parser"; | |
1641 | }; | |
1642 | }; | |
1643 | ||
1644 | "tabulate" = python.mkDerivation { | |
1645 | name = "tabulate-0.8.2"; | |
1646 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/12/c2/11d6845db5edf1295bc08b2f488cf5937806586afe42936c3f34c097ebdc/tabulate-0.8.2.tar.gz"; sha256 = "e4ca13f26d0a6be2a2915428dc21e732f1e44dad7f76d7030b2ef1ec251cf7f2"; }; | |
1647 | doCheck = commonDoCheck; | |
1648 | buildInputs = commonBuildInputs; | |
1649 | propagatedBuildInputs = [ | |
1650 | self."wcwidth" | |
1651 | ]; | |
1652 | meta = with pkgs.stdenv.lib; { | |
1653 | homepage = "https://bitbucket.org/astanin/python-tabulate"; | |
1654 | license = licenses.mit; | |
1655 | description = "Pretty-print tabular data"; | |
1656 | }; | |
1657 | }; | |
1658 | ||
1659 | "terminaltables" = python.mkDerivation { | |
1660 | name = "terminaltables-3.1.0"; | |
1661 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/9b/c4/4a21174f32f8a7e1104798c445dacdc1d4df86f2f26722767034e4de4bff/terminaltables-3.1.0.tar.gz"; sha256 = "f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81"; }; | |
1662 | doCheck = commonDoCheck; | |
1663 | buildInputs = commonBuildInputs; | |
1664 | propagatedBuildInputs = [ ]; | |
1665 | meta = with pkgs.stdenv.lib; { | |
1666 | homepage = "https://github.com/Robpol86/terminaltables"; | |
1667 | license = licenses.mit; | |
1668 | description = "Generate simple tables in terminals from a nested list of strings."; | |
1669 | }; | |
1670 | }; | |
1671 | ||
1672 | "text-unidecode" = python.mkDerivation { | |
1673 | name = "text-unidecode-1.2"; | |
1674 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/f0/a2/40adaae7cbdd007fb12777e550b5ce344b56189921b9f70f37084c021ca4/text-unidecode-1.2.tar.gz"; sha256 = "5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d"; }; | |
1675 | doCheck = commonDoCheck; | |
1676 | buildInputs = commonBuildInputs; | |
1677 | propagatedBuildInputs = [ ]; | |
1678 | meta = with pkgs.stdenv.lib; { | |
1679 | homepage = "https://github.com/kmike/text-unidecode/"; | |
1680 | license = licenses.artistic2; | |
1681 | description = "The most basic Text::Unidecode port"; | |
1682 | }; | |
1683 | }; | |
1684 | ||
1685 | "tqdm" = python.mkDerivation { | |
1686 | name = "tqdm-4.23.4"; | |
1687 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/41/61/d36ff28878ca73bb3932dfa6bab36ff872e6dac18c9ace328879b1798279/tqdm-4.23.4.tar.gz"; sha256 = "77b8424d41b31e68f437c6dd9cd567aebc9a860507cb42fbd880a5f822d966fe"; }; | |
1688 | doCheck = commonDoCheck; | |
1689 | buildInputs = commonBuildInputs; | |
1690 | propagatedBuildInputs = [ ]; | |
1691 | meta = with pkgs.stdenv.lib; { | |
1692 | homepage = "https://github.com/tqdm/tqdm"; | |
1693 | license = licenses.mit; | |
1694 | description = "Fast, Extensible Progress Meter"; | |
1695 | }; | |
1696 | }; | |
1697 | ||
1698 | "txaio" = python.mkDerivation { | |
1699 | name = "txaio-2.10.0"; | |
1700 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/b8/87/efcae4040c2a0af9c871116a6dbf02ee582b396e6de3797fb30cdcc4a7e4/txaio-2.10.0.tar.gz"; sha256 = "4797f9f6a9866fe887c96abc0110a226dd5744c894dc3630870542597ad30853"; }; | |
1701 | doCheck = commonDoCheck; | |
1702 | buildInputs = commonBuildInputs; | |
1703 | propagatedBuildInputs = [ | |
1704 | self."Twisted" | |
1705 | self."mock" | |
1706 | self."pytest" | |
1707 | self."six" | |
1708 | self."zope.interface" | |
1709 | ]; | |
1710 | meta = with pkgs.stdenv.lib; { | |
1711 | homepage = "https://github.com/crossbario/txaio"; | |
1712 | license = licenses.mit; | |
1713 | description = "Compatibility API between asyncio/Twisted/Trollius"; | |
1714 | }; | |
1715 | }; | |
1716 | ||
1717 | "urllib3" = python.mkDerivation { | |
1718 | name = "urllib3-1.22"; | |
1719 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ee/11/7c59620aceedcc1ef65e156cc5ce5a24ef87be4107c2b74458464e437a5d/urllib3-1.22.tar.gz"; sha256 = "cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"; }; | |
1720 | doCheck = commonDoCheck; | |
1721 | buildInputs = commonBuildInputs; | |
1722 | propagatedBuildInputs = [ | |
1723 | self."certifi" | |
1724 | self."cryptography" | |
1725 | self."idna" | |
1726 | self."ipaddress" | |
1727 | self."pyOpenSSL" | |
1728 | ]; | |
1729 | meta = with pkgs.stdenv.lib; { | |
1730 | homepage = "https://urllib3.readthedocs.io/"; | |
1731 | license = licenses.mit; | |
1732 | description = "HTTP library with thread-safe connection pooling, file post, and more."; | |
1733 | }; | |
1734 | }; | |
1735 | ||
1736 | "wcwidth" = python.mkDerivation { | |
1737 | name = "wcwidth-0.1.7"; | |
1738 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz"; sha256 = "3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"; }; | |
1739 | doCheck = commonDoCheck; | |
1740 | buildInputs = commonBuildInputs; | |
1741 | propagatedBuildInputs = [ ]; | |
1742 | meta = with pkgs.stdenv.lib; { | |
1743 | homepage = "https://github.com/jquast/wcwidth"; | |
1744 | license = licenses.mit; | |
1745 | description = "Measures number of Terminal column cells of wide-character codes"; | |
1746 | }; | |
1747 | }; | |
1748 | ||
1749 | "webargs" = python.mkDerivation { | |
1750 | name = "webargs-3.0.1"; | |
1751 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/15/11/f1adb1253d81375db494378e5c9f74ed057a6453cdf0f75de0aac3454599/webargs-3.0.1.tar.gz"; sha256 = "2482d3cb3a09893f7a1a30fa3bc34f47d78418cd1331de63c106ddd34be5bc72"; }; | |
1752 | doCheck = commonDoCheck; | |
1753 | buildInputs = commonBuildInputs; | |
1754 | propagatedBuildInputs = [ | |
1755 | self."marshmallow" | |
1756 | ]; | |
1757 | meta = with pkgs.stdenv.lib; { | |
1758 | homepage = "https://github.com/sloria/webargs"; | |
1759 | license = licenses.mit; | |
1760 | description = "A friendly library for parsing and validating HTTP request arguments, with built-in support for popular web frameworks, including Flask, Django, Bottle, Tornado, Pyramid, webapp2, Falcon, and aiohttp."; | |
1761 | }; | |
1762 | }; | |
1763 | ||
1764 | "websocket-client" = python.mkDerivation { | |
1765 | name = "websocket-client-0.48.0"; | |
1766 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/28/85/df04ec21c622728316b591c2852fd20a0e74324eeb6ca26f351844ba815f/websocket_client-0.48.0.tar.gz"; sha256 = "18f1170e6a1b5463986739d9fd45c4308b0d025c1b2f9b88788d8f69e8a5eb4a"; }; | |
1767 | doCheck = commonDoCheck; | |
1768 | buildInputs = commonBuildInputs; | |
1769 | propagatedBuildInputs = [ | |
1770 | self."six" | |
1771 | ]; | |
1772 | meta = with pkgs.stdenv.lib; { | |
1773 | homepage = "https://github.com/websocket-client/websocket-client.git"; | |
1774 | license = licenses.lgpl2; | |
1775 | description = "WebSocket client for python. hybi13 is supported."; | |
1776 | }; | |
1777 | }; | |
1778 | ||
1779 | "zope.interface" = python.mkDerivation { | |
1780 | name = "zope.interface-4.5.0"; | |
1781 | src = pkgs.fetchurl { url = "https://files.pythonhosted.org/packages/ac/8a/657532df378c2cd2a1fe6b12be3b4097521570769d4852ec02c24bd3594e/zope.interface-4.5.0.tar.gz"; sha256 = "57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c"; }; | |
1782 | doCheck = commonDoCheck; | |
1783 | buildInputs = commonBuildInputs; | |
1784 | propagatedBuildInputs = [ | |
1785 | self."coverage" | |
1786 | ]; | |
1787 | meta = with pkgs.stdenv.lib; { | |
1788 | homepage = "https://github.com/zopefoundation/zope.interface"; | |
1789 | license = licenses.zpl21; | |
1790 | description = "Interfaces for Python"; | |
1791 | }; | |
1792 | }; | |
1793 | }; | |
1794 | localOverridesFile = ./requirements_override.nix; | |
1795 | overrides = import localOverridesFile { inherit pkgs python; }; | |
1796 | commonOverrides = [ | |
1797 | ||
1798 | ]; | |
1799 | allOverrides = | |
1800 | (if (builtins.pathExists localOverridesFile) | |
1801 | then [overrides] else [] ) ++ commonOverrides; | |
1802 | ||
1803 | in python.withPackages | |
1804 | (fix' (pkgs.lib.fold | |
1805 | extends | |
1806 | generated | |
1807 | allOverrides | |
1808 | ) | |
1809 | )⏎ |
0 | alembic==0.9.9 | |
1 | asn1crypto==0.24.0 | |
2 | atomicwrites==1.1.5 | |
3 | attrs==18.1.0 | |
4 | autobahn==18.6.1 | |
5 | Automat==0.6.0 | |
6 | Babel==2.6.0 | |
7 | backports.csv==1.0.6 | |
8 | bcrypt==3.1.4 | |
9 | beautifulsoup4==4.6.0 | |
10 | blinker==1.4 | |
11 | certifi==2018.4.16 | |
12 | cffi==1.11.5 | |
13 | chardet==3.0.4 | |
14 | cli-helpers==1.0.2 | |
15 | click==6.7 | |
16 | colorama==0.3.9 | |
17 | configobj==5.0.6 | |
18 | constantly==15.1.0 | |
19 | cookies==2.2.1 | |
20 | couchdbkit==0.6.5 | |
21 | coverage==4.5.1 | |
22 | cryptography==2.2.2 | |
23 | deprecation==2.0.2 | |
24 | docutils==0.14 | |
25 | enum34==1.1.6 | |
26 | factory-boy==2.11.1 | |
27 | Faker==0.8.15 | |
28 | filedepot==0.5.2 | |
29 | filteralchemy==0.1.0 | |
30 | Flask==0.12.4 | |
31 | Flask-BabelEx==0.9.3 | |
32 | Flask-Classful==0.14.1 | |
33 | Flask-Login==0.4.1 | |
34 | Flask-Mail==0.9.1 | |
35 | Flask-Principal==0.4.0 | |
36 | Flask-Security==3.0.0 | |
37 | Flask-Session==0.3.1 | |
38 | Flask-SQLAlchemy==2.3.2 | |
39 | Flask-WTF==0.14.2 | |
40 | funcsigs==1.0.2 | |
41 | http-parser==0.8.3 | |
42 | humanize==0.5.1 | |
43 | hyperlink==18.0.0 | |
44 | hypothesis==3.57.0 | |
45 | idna==2.6 | |
46 | incremental==17.5.0 | |
47 | inflection==0.3.1 | |
48 | ipaddress==1.0.22 | |
49 | IPy==0.83 | |
50 | itsdangerous==0.24 | |
51 | Jinja2==2.10 | |
52 | m2r==0.1.14 | |
53 | Mako==1.0.7 | |
54 | MarkupSafe==1.0 | |
55 | marshmallow==2.15.3 | |
56 | marshmallow-sqlalchemy==0.14.0 | |
57 | mistune==0.8.3 | |
58 | mock==2.0.0 | |
59 | more-itertools==4.2.0 | |
60 | nplusone==1.0.0 | |
61 | packaging==17.1 | |
62 | passlib==1.7.1 | |
63 | pbr==4.0.4 | |
64 | pgcli==1.9.1 | |
65 | pgspecial==1.11.0 | |
66 | Pillow==5.1.0 | |
67 | pluggy==0.6.0 | |
68 | prompt-toolkit==1.0.15 | |
69 | psycopg2==2.7.4 | |
70 | py==1.5.3 | |
71 | pyasn1==0.4.3 | |
72 | pyasn1-modules==0.2.1 | |
73 | pycparser==2.18 | |
74 | pydot==1.2.4 | |
75 | Pygments==2.2.0 | |
76 | pyOpenSSL==18.0.0 | |
77 | pyparsing==2.2.0 | |
78 | pytest==3.6.1 | |
79 | pytest-factoryboy==2.0.1 | |
80 | pytest-runner==4.2 | |
81 | python-dateutil==2.7.3 | |
82 | python-editor==1.0.3 | |
83 | python-slugify==1.2.5 | |
84 | pytz==2018.4 | |
85 | requests==2.18.4 | |
86 | responses==0.9.0 | |
87 | restkit==4.2.2 | |
88 | service-identity==17.0.0 | |
89 | setproctitle==1.1.10 | |
90 | setuptools-scm==2.1.0 | |
91 | six==1.11.0 | |
92 | socketpool==0.5.3 | |
93 | speaklater==1.3 | |
94 | SQLAlchemy==1.2.8 | |
95 | sqlalchemy-schemadisplay==1.3 | |
96 | sqlparse==0.2.4 | |
97 | tabulate==0.8.2 | |
98 | terminaltables==3.1.0 | |
99 | text-unidecode==1.2 | |
100 | tqdm==4.23.4 | |
101 | Twisted==18.4.0 | |
102 | txaio==2.10.0 | |
103 | Unidecode==1.0.22 | |
104 | urllib3==1.22 | |
105 | wcwidth==0.1.7 | |
106 | webargs==3.0.1 | |
107 | websocket-client==0.48.0 | |
108 | Werkzeug==0.14.1 | |
109 | WTForms==2.2.1 | |
110 | zope.interface==4.5.0 |
0 | { pkgs, python }: | |
1 | ||
2 | self: super: { | |
3 | # Twisted = python.overrideDerivation super.Twisted (old: { | |
4 | # propagatedBuildInputs = (builtins.filter | |
5 | # (drv: drv.name != self.Automat.name && drv.name != self.incremental.name) | |
6 | # old.propagatedBuildInputs); | |
7 | # }); | |
8 | Automat = python.overrideDerivation super.Automat (old: { | |
9 | propagatedBuildInputs = (builtins.filter | |
10 | (drv: drv.name != self.Twisted.name) | |
11 | old.propagatedBuildInputs); | |
12 | buildInputs = old.buildInputs ++ [ self.m2r self."setuptools-scm" ]; | |
13 | }); | |
14 | incremental = python.overrideDerivation super.incremental (old: { | |
15 | propagatedBuildInputs = (builtins.filter | |
16 | (drv: drv.name != self.Twisted.name) | |
17 | old.propagatedBuildInputs); | |
18 | }); | |
19 | hypothesis = python.overrideDerivation super.hypothesis (old: { | |
20 | propagatedBuildInputs = (builtins.filter | |
21 | (drv: drv.name != self.attrs.name) | |
22 | old.propagatedBuildInputs); | |
23 | }); | |
24 | attrs = python.overrideDerivation super.attrs (old: { | |
25 | propagatedBuildInputs = (builtins.filter | |
26 | (drv: drv.name != self.hypothesis.name && drv.name != self.pytest.name) | |
27 | old.propagatedBuildInputs); | |
28 | }); | |
29 | "python-dateutil" = python.overrideDerivation super."python-dateutil" (old: { | |
30 | buildInputs = old.buildInputs ++ [ self."setuptools-scm" ]; | |
31 | }); | |
32 | "pytest" = python.overrideDerivation super."pytest" (old: { | |
33 | buildInputs = old.buildInputs ++ [ self."setuptools-scm" ]; | |
34 | }); | |
35 | "Flask-Security" = python.overrideDerivation super."Flask-Security" (old: { | |
36 | buildInputs = old.buildInputs ++ [ self."pytest-runner" ]; | |
37 | }); | |
38 | "pytest-runner" = python.overrideDerivation super."pytest-runner" (old: { | |
39 | buildInputs = old.buildInputs ++ [ self."setuptools-scm" ]; | |
40 | }); | |
41 | } |
0 | {pkgs ? (import <nixpkgs> {})}: | |
1 | let | |
2 | python = (pkgs.python27.buildEnv.override { | |
3 | ignoreCollisions = true; | |
4 | extraLibs = with pkgs.python27Packages; | |
5 | [virtualenv pillow pyopenssl psycopg2]; | |
6 | }); | |
7 | virtualenv = pkgs.stdenv.mkDerivation { | |
8 | name = "faraday-virtualenv"; | |
9 | buildInputs = [python]; | |
10 | requirements = [../requirements_dev.txt ../requirements_server.txt]; | |
11 | unpackPhase = "true"; | |
12 | pathPhase = "true"; | |
13 | configurePhase = "true"; | |
14 | buildPhase = '' | |
15 | ${python.env}/bin/virtualenv --system-site-packages $out | |
16 | source $out/bin/activate | |
17 | for req in $requirements do | |
18 | pip install -r $req | |
19 | done | |
20 | ''; | |
21 | installPhase = "true"; | |
22 | }; | |
23 | in | |
24 | { inherit virtualenv; | |
25 | env = python.env; | |
26 | } |
6 | 6 | |
7 | 7 | ''' |
8 | 8 | import json |
9 | import logging | |
9 | 10 | import threading |
10 | from Queue import Queue, Empty | |
11 | ||
11 | try: | |
12 | from Queue import Queue, Empty | |
13 | except ImportError: | |
14 | from queue import Queue, Empty | |
12 | 15 | import requests |
13 | 16 | import websocket |
14 | 17 | |
15 | 18 | from persistence.server.server_io_exceptions import ( |
16 | 19 | ChangesStreamStoppedAbruptly |
17 | 20 | ) |
21 | logger = logging.getLogger(__name__) | |
18 | 22 | |
19 | 23 | |
20 | 24 | class ChangesStream(object): |
90 | 94 | self.ws.close() |
91 | 95 | super(WebsocketsChangesStream, self).stop() |
92 | 96 | |
93 | def on_open(self, ws): | |
97 | def on_open(self): | |
94 | 98 | from persistence.server.server import _create_server_api_url, _post |
95 | r = _post( | |
99 | response = _post( | |
96 | 100 | _create_server_api_url() + |
97 | 101 | '/ws/{}/websocket_token/'.format(self.workspace_name), |
98 | 102 | expected_response=200) |
99 | token = r['token'] | |
103 | token = response['token'] | |
100 | 104 | self.ws.send(json.dumps({ |
101 | 105 | 'action': 'JOIN_WORKSPACE', |
102 | 106 | 'workspace': self.workspace_name, |
103 | 107 | 'token': token, |
104 | 108 | })) |
105 | 109 | |
106 | def on_message(self, ws, message): | |
110 | def on_message(self, message): | |
111 | logger.debug('New message {0}'.format(message)) | |
107 | 112 | self.changes_queue.put(message) |
108 | 113 | |
109 | 114 | def on_error(self, ws, error): |
110 | print error | |
115 | print(error) | |
111 | 116 | |
112 | def on_close(selg, ws): | |
117 | def on_close(self): | |
113 | 118 | pass |
114 | 119 | |
115 | 120 | def __enter__(self): |
858 | 858 | self.vuln_amount = int(host.get('vulns', 0)) |
859 | 859 | self.ip = host.get('ip', self.name) |
860 | 860 | self.hostnames = host.get('hostnames', []) if host.get('hostnames') else [] |
861 | self.mac = host.get('mac', '') if host.get('mac') else '' | |
861 | 862 | |
862 | 863 | def getName(self): |
863 | 864 | return self.ip |
894 | 895 | def getHostnames(self): |
895 | 896 | return self.hostnames |
896 | 897 | |
898 | def getMac(self): | |
899 | return self.mac | |
900 | ||
897 | 901 | def setHostnames(self, hostnames): |
898 | 902 | self.hostnames = hostnames |
903 | ||
904 | def setMac(self, mac): | |
905 | self.mac = mac | |
899 | 906 | |
900 | 907 | def getVulns(self): |
901 | 908 | """ |
886 | 886 | |
887 | 887 | def create_host(workspace_name, command_id, ip, os, default_gateway=None, |
888 | 888 | description="", metadata=None, owned=False, owner="", |
889 | parent=None, hostnames=None): | |
889 | parent=None, hostnames=None, mac=None): | |
890 | 890 | """Create a host. |
891 | 891 | |
892 | 892 | Args: |
916 | 916 | parent=parent, |
917 | 917 | description=description, |
918 | 918 | hostnames=hostnames, |
919 | mac=mac, | |
919 | 920 | type="Host") |
920 | 921 | |
921 | 922 | def update_host(workspace_name, command_id, id, ip, os, default_gateway="", |
922 | 923 | description="", metadata=None, owned=False, owner="", |
923 | parent=None, hostnames=None): | |
924 | parent=None, hostnames=None, mac=None): | |
924 | 925 | """Updates a host. |
925 | 926 | |
926 | 927 | Args: |
951 | 952 | parent=parent, |
952 | 953 | description=description, |
953 | 954 | hostnames=hostnames, |
955 | mac=mac, | |
954 | 956 | type="Host") |
955 | 957 | |
956 | 958 |
46 | 46 | def get_host_properties(host): |
47 | 47 | host_dict = { |
48 | 48 | 'os': host.getOS(), |
49 | 'hostnames': host.getHostnames() | |
49 | 'hostnames': host.getHostnames(), | |
50 | 'mac': host.getMac() | |
50 | 51 | } |
51 | 52 | if host.getDefaultGateway(): |
52 | 53 | host_dict['default_gateway'] = host.getDefaultGateway() |
144 | 144 | return self._plugins |
145 | 145 | |
146 | 146 | def stop(self): |
147 | self.plugin_process.stop() | |
147 | 148 | self.stop = True |
148 | 149 | |
149 | 150 | def processOutput(self, plugin, output, command, isReport=False): |
161 | 162 | output_queue = JoinableQueue() |
162 | 163 | plugin.set_actions_queue(self.pending_actions) |
163 | 164 | |
164 | plugin_process = PluginProcess( | |
165 | self.plugin_process = PluginProcess( | |
165 | 166 | plugin, output_queue, isReport) |
166 | 167 | |
167 | 168 | getLogger(self).debug( |
168 | 169 | "Created plugin_process (%d) for plugin instance (%d)" % |
169 | (id(plugin_process), id(plugin))) | |
170 | (id(self.plugin_process), id(plugin))) | |
170 | 171 | |
171 | 172 | self.pending_actions.put((Modelactions.PLUGINSTART, plugin.id, command.getID())) |
172 | 173 | output_queue.put((output, command.getID())) |
181 | 182 | ) |
182 | 183 | plugin_commiter.start() |
183 | 184 | # This process is stopped when plugin commiter joins output queue |
184 | plugin_process.start() | |
185 | self.plugin_process.start() | |
185 | 186 | |
186 | 187 | def _processAction(self, action, parameters): |
187 | 188 | """ |
255 | 256 | return None, None |
256 | 257 | |
257 | 258 | def onCommandFinished(self, pid, exit_code, term_output): |
258 | ||
259 | 259 | if pid not in self._active_plugins.keys(): |
260 | 260 | return False |
261 | 261 | if exit_code != 0: |
272 | 272 | return True |
273 | 273 | |
274 | 274 | def processReport(self, plugin, filepath, ws_name=None): |
275 | ||
275 | 276 | if not ws_name: |
276 | 277 | ws_name = model.api.getActiveWorkspace().name |
278 | ||
277 | 279 | cmd_info = CommandRunInformation( |
278 | 280 | **{'workspace': ws_name, |
279 | 'itime': time.time(), | |
280 | 'import_source': 'report', | |
281 | 'command': plugin, | |
282 | 'params': filepath, | |
281 | 'itime': time.time(), | |
282 | 'import_source': 'report', | |
283 | 'command': plugin, | |
284 | 'params': filepath, | |
283 | 285 | }) |
286 | ||
284 | 287 | self._mapper_manager.createMappers(ws_name) |
285 | 288 | command_id = self._mapper_manager.save(cmd_info) |
286 | 289 | cmd_info.setID(command_id) |
290 | ||
287 | 291 | if plugin in self._plugins: |
288 | 292 | logger.info('Processing report with plugin {0}'.format(plugin)) |
289 | 293 | self._plugins[plugin].workspace = ws_name |
290 | 294 | with open(filepath, 'rb') as output: |
291 | 295 | self.processOutput(self._plugins[plugin], output.read(), cmd_info, True) |
292 | 296 | return command_id |
297 | ||
298 | # Plugin to process this report not found, update duration of plugin process | |
299 | cmd_info.duration = time.time() - cmd_info.itime | |
300 | self._mapper_manager.update(cmd_info) | |
293 | 301 | return False |
294 | 302 | |
295 | 303 | def clearActivePlugins(self): |
10 | 10 | |
11 | 11 | import os |
12 | 12 | import re |
13 | import time | |
13 | 14 | import logging |
14 | 15 | import traceback |
15 | 16 | import deprecation |
171 | 172 | logger.debug('AddPendingAction', args) |
172 | 173 | self._pending_actions.put(args) |
173 | 174 | |
174 | def createAndAddHost(self, name, os="unknown", hostnames=None): | |
175 | def createAndAddHost(self, name, os="unknown", hostnames=None, mac=None): | |
175 | 176 | |
176 | 177 | host_obj = factory.createModelObject( |
177 | 178 | Host.class_signature, |
179 | 180 | os=os, |
180 | 181 | parent_id=None, |
181 | 182 | workspace_name=self.workspace, |
182 | hostnames=hostnames) | |
183 | hostnames=hostnames, | |
184 | mac=mac) | |
183 | 185 | |
184 | 186 | host_obj._metadata.creatoserverr = self.id |
185 | 187 | self.__addPendingAction(Modelactions.ADDHOST, host_obj) |
202 | 204 | # SHRUG |
203 | 205 | try: |
204 | 206 | host = get_host(self.workspace, host_id=host_id) |
205 | host.hostnames = hostname_resolution | |
207 | host.hostnames += hostname_resolution | |
208 | host.mac = mac | |
206 | 209 | update_host(self.workspace, host, command_id=self.command_id) |
207 | 210 | except: |
208 | 211 | logger.info("Error updating Host with right hostname resolution...") |
383 | 386 | self.plugin = plugin_instance |
384 | 387 | self.isReport = isReport |
385 | 388 | self.setDaemon(True) |
389 | self.stop = False | |
386 | 390 | |
387 | 391 | def run(self): |
388 | 392 | proc_name = self.name |
393 | 397 | model.api.devlog('process id: %s' % os.getpid()) |
394 | 398 | model.api.devlog("-" * 40) |
395 | 399 | done = False |
396 | while not done: | |
400 | while not done and not self.stop: | |
397 | 401 | output, command_id = self.output_queue.get() |
398 | 402 | self.plugin.setCommandID(command_id) |
399 | 403 | if output is not None: |
408 | 412 | model.api.devlog('%s: Exiting' % proc_name) |
409 | 413 | |
410 | 414 | self.output_queue.task_done() |
415 | time.sleep(0.1) | |
411 | 416 | |
412 | 417 | return |
418 | ||
419 | def stop(self): | |
420 | self.stop = True⏎ |
0 | ''' | |
1 | Faraday Penetration Test IDE | |
2 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
3 | See the file 'doc/LICENSE' for the license information | |
4 | ||
5 | ''' | |
6 | ||
7 | import os | |
8 | ||
9 | from faraday import FARADAY_BASE | |
10 | ||
11 | def filter_services(): | |
12 | open_file = open(os.path.join(FARADAY_BASE,'plugins/port_mapper.txt'),"r") | |
13 | mapper = open_file.read() | |
14 | filtering = mapper.split('\n') | |
15 | services = [] | |
16 | ||
17 | for item in filtering: | |
18 | tup = () | |
19 | filt = filter(len,item.split('\t')) | |
20 | tup = (filt[0],filt[1]) | |
21 | services.append(tup) | |
22 | ||
23 | return services⏎ |
0 | 1/tcp tcpmux | |
1 | 7/tcp echo | |
2 | 7/udp echo | |
3 | 9/tcp discard | |
4 | 9/udp discard | |
5 | 11/tcp systat | |
6 | 13/tcp daytime | |
7 | 13/udp daytime | |
8 | 15/tcp netstat | |
9 | 17/tcp qotd | |
10 | 18/tcp msp | |
11 | 18/udp msp | |
12 | 19/tcp chargen | |
13 | 19/udp chargen | |
14 | 20/tcp ftp-data | |
15 | 21/tcp ftp | |
16 | 21/udp fsp | |
17 | 22/tcp ssh | |
18 | 22/udp ssh | |
19 | 23/tcp telnet | |
20 | 25/tcp smtp | |
21 | 37/tcp time | |
22 | 37/udp time | |
23 | 39/udp rlp | |
24 | 42/tcp nameserver | |
25 | 43/tcp whois | |
26 | 49/tcp tacacs | |
27 | 49/udp tacacs | |
28 | 50/tcp re-mail-ck | |
29 | 50/udp re-mail-ck | |
30 | 53/tcp domain | |
31 | 53/udp domain | |
32 | 57/tcp mtp | |
33 | 65/tcp tacacs-ds | |
34 | 65/udp tacacs-ds | |
35 | 67/tcp bootps | |
36 | 67/udp bootps | |
37 | 68/tcp bootpc | |
38 | 68/udp bootpc | |
39 | 69/udp tftp | |
40 | 70/tcp gopher | |
41 | 70/udp gopher | |
42 | 77/tcp rje | |
43 | 79/tcp finger | |
44 | 80/tcp http | |
45 | 80/udp http | |
46 | 87/tcp link | |
47 | 88/tcp kerberos | |
48 | 88/udp kerberos | |
49 | 95/tcp supdup | |
50 | 101/tcp hostnames | |
51 | 102/tcp iso-tsap | |
52 | 104/tcp acr-nema | |
53 | 104/udp acr-nema | |
54 | 105/tcp csnet-ns | |
55 | 105/udp csnet-ns | |
56 | 107/tcp rtelnet | |
57 | 107/udp rtelnet | |
58 | 109/tcp pop2 | |
59 | 109/udp pop2 | |
60 | 110/tcp pop3 | |
61 | 110/udp pop3 | |
62 | 111/tcp sunrpc | |
63 | 111/udp sunrpc | |
64 | 113/tcp auth | |
65 | 115/tcp sftp | |
66 | 117/tcp uucp-path | |
67 | 119/tcp nntp | |
68 | 123/tcp ntp | |
69 | 123/udp ntp | |
70 | 129/tcp pwdgen | |
71 | 129/udp pwdgen | |
72 | 135/tcp loc-srv | |
73 | 135/udp loc-srv | |
74 | 137/tcp netbios-ns | |
75 | 137/udp netbios-ns | |
76 | 138/tcp netbios-dgm | |
77 | 138/udp netbios-dgm | |
78 | 139/tcp netbios-ssn | |
79 | 139/udp netbios-ssn | |
80 | 143/tcp imap2 | |
81 | 143/udp imap2 | |
82 | 161/tcp snmp | |
83 | 161/udp snmp | |
84 | 162/tcp snmp-trap | |
85 | 162/udp snmp-trap | |
86 | 163/tcp cmip-man | |
87 | 163/udp cmip-man | |
88 | 164/tcp cmip-agent | |
89 | 164/udp cmip-agent | |
90 | 174/tcp mailq | |
91 | 174/udp mailq | |
92 | 177/tcp xdmcp | |
93 | 177/udp xdmcp | |
94 | 178/tcp nextstep | |
95 | 178/udp nextstep | |
96 | 179/tcp bgp | |
97 | 179/udp bgp | |
98 | 191/tcp prospero | |
99 | 191/udp prospero | |
100 | 194/tcp irc | |
101 | 194/udp irc | |
102 | 199/tcp smux | |
103 | 199/udp smux | |
104 | 201/tcp at-rtmp | |
105 | 201/udp at-rtmp | |
106 | 202/tcp at-nbp | |
107 | 202/udp at-nbp | |
108 | 204/tcp at-echo | |
109 | 204/udp at-echo | |
110 | 206/tcp at-zis | |
111 | 206/udp at-zis | |
112 | 209/tcp qmtp | |
113 | 209/udp qmtp | |
114 | 210/tcp z3950 | |
115 | 210/udp z3950 | |
116 | 213/tcp ipx | |
117 | 213/udp ipx | |
118 | 220/tcp imap3 | |
119 | 220/udp imap3 | |
120 | 345/tcp pawserv | |
121 | 345/udp pawserv | |
122 | 346/tcp zserv | |
123 | 346/udp zserv | |
124 | 347/tcp fatserv | |
125 | 347/udp fatserv | |
126 | 369/tcp rpc2portmap | |
127 | 369/udp rpc2portmap | |
128 | 370/tcp codaauth2 | |
129 | 370/udp codaauth2 | |
130 | 371/tcp clearcase | |
131 | 371/udp clearcase | |
132 | 372/tcp ulistserv | |
133 | 372/udp ulistserv | |
134 | 389/tcp ldap | |
135 | 389/udp ldap | |
136 | 406/tcp imsp | |
137 | 406/udp imsp | |
138 | 427/tcp svrloc | |
139 | 427/udp svrloc | |
140 | 443/tcp https | |
141 | 443/udp https | |
142 | 444/tcp snpp | |
143 | 444/udp snpp | |
144 | 445/tcp microsoft-ds | |
145 | 445/udp microsoft-ds | |
146 | 464/tcp kpasswd | |
147 | 464/udp kpasswd | |
148 | 465/tcp urd | |
149 | 487/tcp saft | |
150 | 487/udp saft | |
151 | 500/tcp isakmp | |
152 | 500/udp isakmp | |
153 | 554/tcp rtsp | |
154 | 554/udp rtsp | |
155 | 607/tcp nqs | |
156 | 607/udp nqs | |
157 | 610/tcp npmp-local | |
158 | 610/udp npmp-local | |
159 | 611/tcp npmp-gui | |
160 | 611/udp npmp-gui | |
161 | 612/tcp hmmp-ind | |
162 | 612/udp hmmp-ind | |
163 | 623/udp asf-rmcp | |
164 | 628/tcp qmqp | |
165 | 628/udp qmqp | |
166 | 631/tcp ipp | |
167 | 631/udp ipp | |
168 | 512/tcp exec | |
169 | 512/udp biff | |
170 | 513/tcp login | |
171 | 513/udp who | |
172 | 514/tcp shell | |
173 | 514/udp syslog | |
174 | 515/tcp printer | |
175 | 517/udp talk | |
176 | 518/udp ntalk | |
177 | 520/udp route | |
178 | 525/udp timed | |
179 | 526/tcp tempo | |
180 | 530/tcp courier | |
181 | 531/tcp conference | |
182 | 532/tcp netnews | |
183 | 533/udp netwall | |
184 | 538/tcp gdomap | |
185 | 538/udp gdomap | |
186 | 540/tcp uucp | |
187 | 543/tcp klogin | |
188 | 544/tcp kshell | |
189 | 546/tcp dhcpv6-client | |
190 | 546/udp dhcpv6-client | |
191 | 547/tcp dhcpv6-server | |
192 | 547/udp dhcpv6-server | |
193 | 548/tcp afpovertcp | |
194 | 548/udp afpovertcp | |
195 | 549/tcp idfp | |
196 | 549/udp idfp | |
197 | 556/tcp remotefs | |
198 | 563/tcp nntps | |
199 | 563/udp nntps | |
200 | 587/tcp submission | |
201 | 587/udp submission | |
202 | 636/tcp ldaps | |
203 | 636/udp ldaps | |
204 | 655/tcp tinc | |
205 | 655/udp tinc | |
206 | 706/tcp silc | |
207 | 706/udp silc | |
208 | 749/tcp kerberos-adm | |
209 | 765/tcp webster | |
210 | 765/udp webster | |
211 | 873/tcp rsync | |
212 | 873/udp rsync | |
213 | 989/tcp ftps-data | |
214 | 990/tcp ftps | |
215 | 992/tcp telnets | |
216 | 992/udp telnets | |
217 | 993/tcp imaps | |
218 | 993/udp imaps | |
219 | 994/tcp ircs | |
220 | 994/udp ircs | |
221 | 995/tcp pop3s | |
222 | 995/udp pop3s | |
223 | 1080/tcp socks | |
224 | 1080/udp socks | |
225 | 1093/tcp proofd | |
226 | 1093/udp proofd | |
227 | 1094/tcp rootd | |
228 | 1094/udp rootd | |
229 | 1194/tcp openvpn | |
230 | 1194/udp openvpn | |
231 | 1099/tcp rmiregistry | |
232 | 1099/udp rmiregistry | |
233 | 1214/tcp kazaa | |
234 | 1214/udp kazaa | |
235 | 1241/tcp nessus | |
236 | 1241/udp nessus | |
237 | 1352/tcp lotusnote | |
238 | 1352/udp lotusnote | |
239 | 1433/tcp ms-sql-s | |
240 | 1433/udp ms-sql-s | |
241 | 1434/tcp ms-sql-m | |
242 | 1434/udp ms-sql-m | |
243 | 1524/tcp ingreslock | |
244 | 1524/udp ingreslock | |
245 | 1525/tcp prospero-np | |
246 | 1525/udp prospero-np | |
247 | 1645/tcp datametrics | |
248 | 1645/udp datametrics | |
249 | 1646/tcp sa-msg-port | |
250 | 1646/udp sa-msg-port | |
251 | 1649/tcp kermit | |
252 | 1649/udp kermit | |
253 | 1677/tcp groupwise | |
254 | 1677/udp groupwise | |
255 | 1701/tcp l2f | |
256 | 1701/udp l2f | |
257 | 1812/tcp radius | |
258 | 1812/udp radius | |
259 | 1813/tcp radius-acct | |
260 | 1813/udp radius-acct | |
261 | 1863/tcp msnp | |
262 | 1863/udp msnp | |
263 | 1957/tcp unix-status | |
264 | 1958/tcp log-server | |
265 | 1959/tcp remoteping | |
266 | 2000/tcp cisco-sccp | |
267 | 2000/udp cisco-sccp | |
268 | 2010/tcp search | |
269 | 2010/tcp pipe-server | |
270 | 2049/tcp nfs | |
271 | 2049/udp nfs | |
272 | 2086/tcp gnunet | |
273 | 2086/udp gnunet | |
274 | 2101/tcp rtcm-sc104 | |
275 | 2101/udp rtcm-sc104 | |
276 | 2119/tcp gsigatekeeper | |
277 | 2119/udp gsigatekeeper | |
278 | 2135/tcp gris | |
279 | 2135/udp gris | |
280 | 2401/tcp cvspserver | |
281 | 2401/udp cvspserver | |
282 | 2430/tcp venus | |
283 | 2430/udp venus | |
284 | 2431/tcp venus-se | |
285 | 2431/udp venus-se | |
286 | 2432/tcp codasrv | |
287 | 2432/udp codasrv | |
288 | 2433/tcp codasrv-se | |
289 | 2433/udp codasrv-se | |
290 | 2583/tcp mon | |
291 | 2583/udp mon | |
292 | 2628/tcp dict | |
293 | 2628/udp dict | |
294 | 2792/tcp f5-globalsite | |
295 | 2792/udp f5-globalsite | |
296 | 2811/tcp gsiftp | |
297 | 2811/udp gsiftp | |
298 | 2947/tcp gpsd | |
299 | 2947/udp gpsd | |
300 | 3050/tcp gds-db | |
301 | 3050/udp gds-db | |
302 | 3130/tcp icpv2 | |
303 | 3130/udp icpv2 | |
304 | 3260/tcp iscsi-target | |
305 | 3306/tcp mysql | |
306 | 3306/udp mysql | |
307 | 3493/tcp nut | |
308 | 3493/udp nut | |
309 | 3632/tcp distcc | |
310 | 3632/udp distcc | |
311 | 3689/tcp daap | |
312 | 3689/udp daap | |
313 | 3690/tcp svn | |
314 | 3690/udp svn | |
315 | 4031/tcp suucp | |
316 | 4031/udp suucp | |
317 | 4094/tcp sysrqd | |
318 | 4094/udp sysrqd | |
319 | 4190/tcp sieve | |
320 | 4369/tcp epmd | |
321 | 4369/udp epmd | |
322 | 4373/tcp remctl | |
323 | 4373/udp remctl | |
324 | 4353/tcp f5-iquery | |
325 | 4353/udp f5-iquery | |
326 | 4500/udp ipsec-nat-t | |
327 | 4569/tcp iax | |
328 | 4569/udp iax | |
329 | 4691/tcp mtn | |
330 | 4691/udp mtn | |
331 | 4899/tcp radmin-port | |
332 | 4899/udp radmin-port | |
333 | 5002/udp rfe | |
334 | 5002/tcp rfe | |
335 | 5050/tcp mmcc | |
336 | 5050/udp mmcc | |
337 | 5060/tcp sip | |
338 | 5060/udp sip | |
339 | 5061/tcp sip-tls | |
340 | 5061/udp sip-tls | |
341 | 5190/tcp aol | |
342 | 5190/udp aol | |
343 | 5222/tcp xmpp-client | |
344 | 5222/udp xmpp-client | |
345 | 5269/tcp xmpp-server | |
346 | 5269/udp xmpp-server | |
347 | 5308/tcp cfengine | |
348 | 5308/udp cfengine | |
349 | 5353/tcp mdns | |
350 | 5353/udp mdns | |
351 | 5432/tcp postgresql | |
352 | 5432/udp postgresql | |
353 | 5556/tcp freeciv | |
354 | 5556/udp freeciv | |
355 | 5671/tcp amqps | |
356 | 5672/tcp amqp | |
357 | 5672/udp amqp | |
358 | 5672/sctp amqp | |
359 | 5688/tcp ggz | |
360 | 5688/udp ggz | |
361 | 6000/tcp x11 | |
362 | 6000/udp x11 | |
363 | 6001/tcp x11-1 | |
364 | 6001/udp x11-1 | |
365 | 6002/tcp x11-2 | |
366 | 6002/udp x11-2 | |
367 | 6003/tcp x11-3 | |
368 | 6003/udp x11-3 | |
369 | 6004/tcp x11-4 | |
370 | 6004/udp x11-4 | |
371 | 6005/tcp x11-5 | |
372 | 6005/udp x11-5 | |
373 | 6006/tcp x11-6 | |
374 | 6006/udp x11-6 | |
375 | 6007/tcp x11-7 | |
376 | 6007/udp x11-7 | |
377 | 6346/tcp gnutella-svc | |
378 | 6346/udp gnutella-svc | |
379 | 6347/tcp gnutella-rtr | |
380 | 6347/udp gnutella-rtr | |
381 | 6444/tcp sge-qmaster | |
382 | 6444/udp sge-qmaster | |
383 | 6445/tcp sge-execd | |
384 | 6445/udp sge-execd | |
385 | 6446/tcp mysql-proxy | |
386 | 6446/udp mysql-proxy | |
387 | 7000/tcp afs3-fileserver | |
388 | 7000/udp afs3-fileserver | |
389 | 7001/tcp afs3-callback | |
390 | 7001/udp afs3-callback | |
391 | 7002/tcp afs3-prserver | |
392 | 7002/udp afs3-prserver | |
393 | 7003/tcp afs3-vlserver | |
394 | 7003/udp afs3-vlserver | |
395 | 7004/tcp afs3-kaserver | |
396 | 7004/udp afs3-kaserver | |
397 | 7005/tcp afs3-volser | |
398 | 7005/udp afs3-volser | |
399 | 7006/tcp afs3-errors | |
400 | 7006/udp afs3-errors | |
401 | 7007/tcp afs3-bos | |
402 | 7007/udp afs3-bos | |
403 | 7008/tcp afs3-update | |
404 | 7008/udp afs3-update | |
405 | 7009/tcp afs3-rmtsys | |
406 | 7009/udp afs3-rmtsys | |
407 | 7100/tcp font-service | |
408 | 7100/udp font-service | |
409 | 8080/tcp http-alt | |
410 | 8080/udp http-alt | |
411 | 9101/tcp bacula-dir | |
412 | 9101/udp bacula-dir | |
413 | 9102/tcp bacula-fd | |
414 | 9102/udp bacula-fd | |
415 | 9103/tcp bacula-sd | |
416 | 9103/udp bacula-sd | |
417 | 9667/tcp xmms2 | |
418 | 9667/udp xmms2 | |
419 | 10809/tcp nbd | |
420 | 10050/tcp zabbix-agent | |
421 | 10050/udp zabbix-agent | |
422 | 10051/tcp zabbix-trapper | |
423 | 10051/udp zabbix-trapper | |
424 | 10080/tcp amanda | |
425 | 10080/udp amanda | |
426 | 11112/tcp dicom | |
427 | 11371/tcp hkp | |
428 | 11371/udp hkp | |
429 | 13720/tcp bprd | |
430 | 13720/udp bprd | |
431 | 13721/tcp bpdbm | |
432 | 13721/udp bpdbm | |
433 | 13722/tcp bpjava-msvc | |
434 | 13722/udp bpjava-msvc | |
435 | 13724/tcp vnetd | |
436 | 13724/udp vnetd | |
437 | 13782/tcp bpcd | |
438 | 13782/udp bpcd | |
439 | 13783/tcp vopied | |
440 | 13783/udp vopied | |
441 | 17500/tcp db-lsp | |
442 | 22125/tcp dcap | |
443 | 22128/tcp gsidcap | |
444 | 22273/tcp wnn6 | |
445 | 22273/udp wnn6 | |
446 | 1/ddp rtmp | |
447 | 2/ddp nbp | |
448 | 4/ddp echo | |
449 | 6/ddp zip | |
450 | 750/udp kerberos4 | |
451 | 750/tcp kerberos4 | |
452 | 751/udp kerberos-master | |
453 | 751/tcp kerberos-master | |
454 | 752/udp passwd-server | |
455 | 754/tcp krb-prop | |
456 | 760/tcp krbupdate | |
457 | 901/tcp swat | |
458 | 1109/tcp kpop | |
459 | 2053/tcp knetd | |
460 | 2102/udp zephyr-srv | |
461 | 2103/udp zephyr-clt | |
462 | 2104/udp zephyr-hm | |
463 | 2105/tcp eklogin | |
464 | 2111/tcp kx | |
465 | 2121/tcp iprop | |
466 | 871/tcp supfilesrv | |
467 | 1127/tcp supfiledbg | |
468 | 98/tcp linuxconf | |
469 | 106/tcp poppassd | |
470 | 106/udp poppassd | |
471 | 775/tcp moira-db | |
472 | 777/tcp moira-update | |
473 | 779/udp moira-ureg | |
474 | 783/tcp spamd | |
475 | 808/tcp omirr | |
476 | 808/udp omirr | |
477 | 1001/tcp customs | |
478 | 1001/udp customs | |
479 | 1178/tcp skkserv | |
480 | 1210/udp predict | |
481 | 1236/tcp rmtcfg | |
482 | 1300/tcp wipld | |
483 | 1313/tcp xtel | |
484 | 1314/tcp xtelw | |
485 | 1529/tcp support | |
486 | 2003/tcp cfinger | |
487 | 2121/tcp frox | |
488 | 2150/tcp ninstall | |
489 | 2150/udp ninstall | |
490 | 2600/tcp zebrasrv | |
491 | 2601/tcp zebra | |
492 | 2602/tcp ripd | |
493 | 2603/tcp ripngd | |
494 | 2604/tcp ospfd | |
495 | 2605/tcp bgpd | |
496 | 2606/tcp ospf6d | |
497 | 2607/tcp ospfapi | |
498 | 2608/tcp isisd | |
499 | 2988/tcp afbackup | |
500 | 2988/udp afbackup | |
501 | 2989/tcp afmbackup | |
502 | 2989/udp afmbackup | |
503 | 4224/tcp xtell | |
504 | 4557/tcp fax | |
505 | 4559/tcp hylafax | |
506 | 4600/tcp distmp3 | |
507 | 4949/tcp munin | |
508 | 5051/tcp enbd-cstatd | |
509 | 5052/tcp enbd-sstatd | |
510 | 5151/tcp pcrd | |
511 | 5354/tcp noclog | |
512 | 5354/udp noclog | |
513 | 5355/tcp hostmon | |
514 | 5355/udp hostmon | |
515 | 5555/udp rplay | |
516 | 5666/tcp nrpe | |
517 | 5667/tcp nsca | |
518 | 5674/tcp mrtd | |
519 | 5675/tcp bgpsim | |
520 | 5680/tcp canna | |
521 | 6514/tcp syslog-tls | |
522 | 6566/tcp sane-port | |
523 | 6667/tcp ircd | |
524 | 8021/tcp zope-ftp | |
525 | 8081/tcp tproxy | |
526 | 8088/tcp omniorb | |
527 | 8088/udp omniorb | |
528 | 8990/tcp clc-build-daemon | |
529 | 9098/tcp xinetd | |
530 | 9359/udp mandelspawn | |
531 | 9418/tcp git | |
532 | 9673/tcp zope | |
533 | 10000/tcp webmin | |
534 | 10081/tcp kamanda | |
535 | 10081/udp kamanda | |
536 | 10082/tcp amandaidx | |
537 | 10083/tcp amidxtape | |
538 | 11201/tcp smsqp | |
539 | 11201/udp smsqp | |
540 | 15345/tcp xpilot | |
541 | 15345/udp xpilot | |
542 | 17001/udp sgi-cmsd | |
543 | 17002/udp sgi-crsd | |
544 | 17003/udp sgi-gcd | |
545 | 17004/tcp sgi-cad | |
546 | 20011/tcp isdnlog | |
547 | 20011/udp isdnlog | |
548 | 20012/tcp vboxd | |
549 | 20012/udp vboxd | |
550 | 24554/tcp binkp | |
551 | 27374/tcp asp | |
552 | 27374/udp asp | |
553 | 30865/tcp csync2 | |
554 | 57000/tcp dircproxy | |
555 | 60177/tcp tfido | |
556 | 60179/tcp fido | |
557 | 1027/udp Native IPv6 behind IPv4-to-IPv4 NAT Customer Premises Equipment (6a44) | |
558 | 1058/tcp nim, IBM AIX Network Installation Manager (NIM) | |
559 | 1058/udp nim, IBM AIX Network Installation Manager (NIM) | |
560 | 1059/tcp nimreg, IBM AIX Network Installation Manager (NIM) | |
561 | 1059/udp nimreg, IBM AIX Network Installation Manager (NIM) | |
562 | 1080/tcp SOCKS proxy | |
563 | 1080/udp SOCKS proxy | |
564 | 1085/tcp WebObjects | |
565 | 1085/udp WebObjects | |
566 | 1098/tcp rmiactivation, Java remote method invocation (RMI) activation | |
567 | 1098/udp rmiactivation, Java remote method invocation (RMI) activation | |
568 | 1099/tcp rmiregistry, Java remote method invocation (RMI) registry | |
569 | 1099/assigned rmiregistry, Java remote method invocation (RMI) registry | |
570 | 1119/tcp Battle.net chat/game protocol, used by Blizzard's games | |
571 | 1119/udp Battle.net chat/game protocol, used by Blizzard's games | |
572 | 1167/udp Cisco IP SLA (Service Assurance Agent) | |
573 | 1167/tcp Cisco IP SLA (Service Assurance Agent) | |
574 | 1194/udp OpenVPN | |
575 | 1194/tcp OpenVPN | |
576 | 1198/udp The cajo project Free dynamic transparent distributed computing in Java | |
577 | 1198/tcp The cajo project Free dynamic transparent distributed computing in Java | |
578 | 1214/udp Kazaa | |
579 | 1214/tcp Kazaa | |
580 | 1234/udp Infoseek search agent | |
581 | 1234/tcp Infoseek search agent | |
582 | 1241/udp Nessus Security Scanner | |
583 | 1241/tcp Nessus Security Scanner | |
584 | 1270/udp Microsoft System Center Operations Manager (SCOM) (formerly Microsoft Operations Manager (MOM)) agent | |
585 | 1270/tcp Microsoft System Center Operations Manager (SCOM) (formerly Microsoft Operations Manager (MOM)) agent | |
586 | 1293/udp Internet Protocol Security (IPSec) | |
587 | 1293/tcp Internet Protocol Security (IPSec) | |
588 | 1311/udp Windows RxMon.exe | |
589 | 1311/tcp Windows RxMon.exe | |
590 | 1341/udp Qubes (Manufacturing Execution System) | |
591 | 1341/tcp Qubes (Manufacturing Execution System) | |
592 | 1344/udp Internet Content Adaptation Protocol | |
593 | 1344/tcp Internet Content Adaptation Protocol | |
594 | 1352/udp IBM Lotus Notes/Domino (RPC) protocol | |
595 | 1352/tcp IBM Lotus Notes/Domino (RPC) protocol | |
596 | 1360/udp Mimer SQL | |
597 | 1360/tcp Mimer SQL | |
598 | 1414/udp IBM WebSphere MQ (formerly known as MQSeries) | |
599 | 1414/tcp IBM WebSphere MQ (formerly known as MQSeries) | |
600 | 1417/udp Timbuktu Service 1 Port | |
601 | 1417/tcp Timbuktu Service 1 Port | |
602 | 1418/udp Timbuktu Service 2 Port | |
603 | 1418/tcp Timbuktu Service 2 Port | |
604 | 1419/udp Timbuktu Service 3 Port | |
605 | 1419/tcp Timbuktu Service 3 Port | |
606 | 1420/udp Timbuktu Service 4 Port | |
607 | 1420/tcp Timbuktu Service 4 Port | |
608 | 1433/udp Microsoft SQL Server database management system (MSSQL) server | |
609 | 1433/tcp Microsoft SQL Server database management system (MSSQL) server | |
610 | 1434/udp Microsoft SQL Server database management system (MSSQL) monitor | |
611 | 1434/tcp Microsoft SQL Server database management system (MSSQL) monitor | |
612 | 1512/udp Microsoft's Windows Internet Name Service (WINS) | |
613 | 1512/tcp Microsoft's Windows Internet Name Service (WINS) | |
614 | 1521/udp nCUBE License Manager | |
615 | 1521/tcp nCUBE License Manager | |
616 | 1524/udp ingreslock, ingres | |
617 | 1524/tcp ingreslock, ingres | |
618 | 1527/udp Oracle Net Services, formerly known as SQL*Net | |
619 | 1527/tcp Oracle Net Services, formerly known as SQL*Net | |
620 | 1533/udp IBM Sametime Virtual Places Chat | |
621 | 1533/tcp IBM Sametime Virtual Places Chat | |
622 | 1547/udp Laplink | |
623 | 1547/tcp Laplink | |
624 | 1581/udp MIL STD 2045-47001 VMF | |
625 | 1581/tcp MIL STD 2045-47001 VMF | |
626 | 1589/udp Cisco VLAN Query Protocol (VQP) | |
627 | 1589/tcp Cisco VLAN Query Protocol (VQP) | |
628 | 1628/udp LonTalk normal | |
629 | 1628/tcp LonTalk normal | |
630 | 1629/udp LonTalk urgent | |
631 | 1629/tcp LonTalk urgent | |
632 | 1677/udp Novell GroupWise clients in client/server access mode | |
633 | 1677/tcp Novell GroupWise clients in client/server access mode | |
634 | 1701/udp Layer 2 Forwarding Protocol (L2F) | |
635 | 1701/tcp Layer 2 Forwarding Protocol (L2F) | |
636 | 1701/udp Layer 2 Tunneling Protocol (L2TP) | |
637 | 1701/assigned Layer 2 Tunneling Protocol (L2TP) | |
638 | 1707/udp Windward Studios games (vdmplay) | |
639 | 1707/tcp Windward Studios games (vdmplay) | |
640 | 1719/udp H.323 registration and alternate communication | |
641 | 1719/tcp H.323 registration and alternate communication | |
642 | 1720/udp H.323 call signaling | |
643 | 1720/tcp H.323 call signaling | |
644 | 1755/udp Microsoft Media Services (MMS, ms-streaming) | |
645 | 1755/tcp Microsoft Media Services (MMS, ms-streaming) | |
646 | 1801/udp Microsoft Message Queuing | |
647 | 1801/tcp Microsoft Message Queuing | |
648 | 1812/udp RADIUS authentication protocol, radius | |
649 | 1812/tcp RADIUS authentication protocol, radius | |
650 | 1813/udp RADIUS accounting protocol, radius-acct | |
651 | 1813/tcp RADIUS accounting protocol, radius-acct | |
652 | 1863/udp Microsoft Notification Protocol (MSNP), used by the Microsoft Messenger service and a number of instant messaging Messenger clients | |
653 | 1863/tcp Microsoft Notification Protocol (MSNP), used by the Microsoft Messenger service and a number of instant messaging Messenger clients | |
654 | 1883/udp MQTT (formerly MQ Telemetry Transport) | |
655 | 1883/tcp MQTT (formerly MQ Telemetry Transport) | |
656 | 1900/udp Simple Service Discovery Protocol (SSDP), discovery of UPnP devices | |
657 | 1900/assigned Simple Service Discovery Protocol (SSDP), discovery of UPnP devices | |
658 | 1935/udp Macromedia Flash Communications Server MX, the precursor to Adobe Flash Media Server before Macromedia's acquisition by Adobe on December 3, 2005 | |
659 | 1935/tcp Macromedia Flash Communications Server MX, the precursor to Adobe Flash Media Server before Macromedia's acquisition by Adobe on December 3, 2005 | |
660 | 1970/udp Netop Remote Control | |
661 | 1970/tcp Netop Remote Control | |
662 | 1972/udp InterSystems Caché | |
663 | 1972/tcp InterSystems Caché | |
664 | 1984/udp Big Brother | |
665 | 1984/tcp Big Brother | |
666 | 1985/udp Cisco Hot Standby Router Protocol (HSRP) | |
667 | 1985/assigned Cisco Hot Standby Router Protocol (HSRP) | |
668 | 1998/udp Cisco X.25 over TCP (XOT) service | |
669 | 1998/tcp Cisco X.25 over TCP (XOT) service | |
670 | 2000/udp Cisco Skinny Client Control Protocol (SCCP) | |
671 | 2000/tcp Cisco Skinny Client Control Protocol (SCCP) | |
672 | 2080/udp Autodesk NLM (FLEXlm) | |
673 | 2080/tcp Autodesk NLM (FLEXlm) | |
674 | 2083/udp Secure RADIUS Service (radsec) | |
675 | 2083/tcp Secure RADIUS Service (radsec) | |
676 | 2086/udp GNUnet | |
677 | 2086/tcp GNUnet | |
678 | 2102/udp Zephyr Notification Service server | |
679 | 2102/tcp Zephyr Notification Service server | |
680 | 2103/udp Zephyr Notification Service serv-hm connection | |
681 | 2103/tcp Zephyr Notification Service serv-hm connection | |
682 | 2104/udp Zephyr Notification Service hostmanager | |
683 | 2104/tcp Zephyr Notification Service hostmanager | |
684 | 2123/udp GTP control messages (GTP-C) | |
685 | 2123/tcp GTP control messages (GTP-C) | |
686 | 2142/udp TDMoIP (TDM over IP) | |
687 | 2142/tcp TDMoIP (TDM over IP) | |
688 | 2152/udp GTP user data messages (GTP-U) | |
689 | 2152/tcp GTP user data messages (GTP-U) | |
690 | 2159/udp GDB remote debug port | |
691 | 2159/tcp GDB remote debug port | |
692 | 2181/udp EForward-document transport system | |
693 | 2181/tcp EForward-document transport system | |
694 | 2210/udp NOAAPORT Broadcast Network | |
695 | 2210/tcp NOAAPORT Broadcast Network | |
696 | 2211/udp EMWIN | |
697 | 2211/tcp EMWIN | |
698 | 2222/udp EtherNet/IP implicit messaging for IO data | |
699 | 2222/tcp EtherNet/IP implicit messaging for IO data | |
700 | 2261/udp CoMotion master | |
701 | 2261/tcp CoMotion master | |
702 | 2262/udp CoMotion backup | |
703 | 2262/tcp CoMotion backup | |
704 | 2266/udp M-Files | |
705 | 2266/tcp M-Files | |
706 | 2399/udp FileMaker Data Access Layer (ODBC/JDBC) | |
707 | 2399/tcp FileMaker Data Access Layer (ODBC/JDBC) | |
708 | 2401/udp CVS version control system password-based server | |
709 | 2401/tcp CVS version control system password-based server | |
710 | 2404/udp IEC 60870-5-104, used to send electric power telecontrol messages between two systems via directly connected data circuits | |
711 | 2404/tcp IEC 60870-5-104, used to send electric power telecontrol messages between two systems via directly connected data circuits | |
712 | 2427/udp Media Gateway Control Protocol (MGCP) media gateway | |
713 | 2427/tcp Media Gateway Control Protocol (MGCP) media gateway | |
714 | 2447/udp ovwdb—OpenView Network Node Manager (NNM) daemon | |
715 | 2447/tcp ovwdb—OpenView Network Node Manager (NNM) daemon | |
716 | 2483/udp Oracle database listening for insecure client connections to the listener, replaces port 1521 | |
717 | 2483/tcp Oracle database listening for insecure client connections to the listener, replaces port 1521 | |
718 | 2484/udp Oracle database listening for SSL client connections to the listener | |
719 | 2484/tcp Oracle database listening for SSL client connections to the listener | |
720 | 2535/udp Multicast Address Dynamic Client Allocation Protocol (MADCAP). All standard messages are UDP datagrams. | |
721 | 2535/tcp Multicast Address Dynamic Client Allocation Protocol (MADCAP). All standard messages are UDP datagrams. | |
722 | 2541/udp LonTalk/IP | |
723 | 2541/tcp LonTalk/IP | |
724 | 2546/udp EVault data protection services | |
725 | 2546/tcp EVault data protection services | |
726 | 2547/udp EVault data protection services | |
727 | 2547/tcp EVault data protection services | |
728 | 2548/udp EVault data protection services | |
729 | 2548/tcp EVault data protection services | |
730 | 2638/udp SQL Anywhere database server | |
731 | 2638/tcp SQL Anywhere database server | |
732 | 2727/udp Media Gateway Control Protocol (MGCP) media gateway controller (call agent) | |
733 | 2727/tcp Media Gateway Control Protocol (MGCP) media gateway controller (call agent) | |
734 | 2809/udp corbaloc:iiop URL, per the CORBA 3.0.3 specification | |
735 | 2809/tcp corbaloc:iiop URL, per the CORBA 3.0.3 specification | |
736 | 2811/udp gsi ftp, per the GridFTP specification | |
737 | 2811/tcp gsi ftp, per the GridFTP specification | |
738 | 2944/udp Megaco text H.248 | |
739 | 2944/tcp Megaco text H.248 | |
740 | 2945/udp Megaco binary (ASN.1) H.248 | |
741 | 2945/tcp Megaco binary (ASN.1) H.248 | |
742 | 2947/udp gpsd, GPS daemon | |
743 | 2947/tcp gpsd, GPS daemon | |
744 | 2948/udp WAP push Multimedia Messaging Service (MMS) | |
745 | 2948/tcp WAP push Multimedia Messaging Service (MMS) | |
746 | 2949/udp WAP push secure (MMS) | |
747 | 2949/tcp WAP push secure (MMS) | |
748 | 2967/udp Symantec System Center agent (SSC-AGENT) | |
749 | 2967/tcp Symantec System Center agent (SSC-AGENT) | |
750 | 3020/udp Common Internet File System (CIFS). See also port 445 for Server Message Block (SMB), a dialect of CIFS. | |
751 | 3020/tcp Common Internet File System (CIFS). See also port 445 for Server Message Block (SMB), a dialect of CIFS. | |
752 | 3050/udp gds-db (Interbase/Firebird databases) | |
753 | 3050/tcp gds-db (Interbase/Firebird databases) | |
754 | 3052/udp APC PowerChute Network | |
755 | 3052/tcp APC PowerChute Network | |
756 | 3074/udp Xbox LIVE and Games for Windows – Live | |
757 | 3074/tcp Xbox LIVE and Games for Windows – Live | |
758 | 3225/udp Fibre Channel over IP (FCIP) | |
759 | 3225/tcp Fibre Channel over IP (FCIP) | |
760 | 3233/udp WhiskerControl research control protocol | |
761 | 3233/tcp WhiskerControl research control protocol | |
762 | 3260/udp iSCSI | |
763 | 3260/tcp iSCSI | |
764 | 3268/udp msft-gc, Microsoft Global Catalog (LDAP service which contains data from Active Directory forests) | |
765 | 3268/tcp msft-gc, Microsoft Global Catalog (LDAP service which contains data from Active Directory forests) | |
766 | 3269/udp msft-gc-ssl, Microsoft Global Catalog over SSL (similar to port 3268, LDAP over SSL) | |
767 | 3269/tcp msft-gc-ssl, Microsoft Global Catalog over SSL (similar to port 3268, LDAP over SSL) | |
768 | 3283/udp Net Assistant, a predecessor to Apple Remote Desktop | |
769 | 3283/tcp Net Assistant, a predecessor to Apple Remote Desktop | |
770 | 3305/udp Odette File Transfer Protocol (OFTP) | |
771 | 3305/tcp Odette File Transfer Protocol (OFTP) | |
772 | 3386/udp GTP' 3GPP GSM/UMTS CDR logging protocol | |
773 | 3386/tcp GTP' 3GPP GSM/UMTS CDR logging protocol | |
774 | 3389/udp Microsoft Terminal Server (RDP) officially registered as Windows Based Terminal (WBT) | |
775 | 3389/tcp Microsoft Terminal Server (RDP) officially registered as Windows Based Terminal (WBT) | |
776 | 3396/udp Novell NDPS Printer Agent | |
777 | 3396/tcp Novell NDPS Printer Agent | |
778 | 3412/udp xmlBlaster | |
779 | 3412/tcp xmlBlaster | |
780 | 3455/udp Resource Reservation Protocol (RSVP) | |
781 | 3455/tcp Resource Reservation Protocol (RSVP) | |
782 | 3478/udp STUN, a protocol for NAT traversal | |
783 | 3478/tcp STUN, a protocol for NAT traversal | |
784 | 3478/udp TURN, a protocol for NAT traversal (extension to STUN) | |
785 | 3478/tcp TURN, a protocol for NAT traversal (extension to STUN) | |
786 | 3478/udp STUN Behavior Discovery. See also port 5349. | |
787 | 3478/tcp STUN Behavior Discovery. See also port 5349. | |
788 | 3493/udp Network UPS Tools (NUT) | |
789 | 3493/tcp Network UPS Tools (NUT) | |
790 | 3516/udp Smartcard Port | |
791 | 3516/tcp Smartcard Port | |
792 | 3645/udp Cyc | |
793 | 3645/tcp Cyc | |
794 | 3659/udp Apple SASL, used by Mac OS X Server Password Server | |
795 | 3659/tcp Apple SASL, used by Mac OS X Server Password Server | |
796 | 3667/udp Information Exchange | |
797 | 3667/tcp Information Exchange | |
798 | 3690/udp Subversion (SVN) version control system | |
799 | 3690/tcp Subversion (SVN) version control system | |
800 | 3702/udp Web Services Dynamic Discovery (WS-Discovery), used by various components of Windows Vista and later | |
801 | 3702/tcp Web Services Dynamic Discovery (WS-Discovery), used by various components of Windows Vista and later | |
802 | 3724/udp Some Blizzard games | |
803 | 3724/tcp Some Blizzard games | |
804 | 3725/udp Netia NA-ER Port | |
805 | 3725/tcp Netia NA-ER Port | |
806 | 3768/udp RBLcheckd server daemon | |
807 | 3768/tcp RBLcheckd server daemon | |
808 | 3804/udp Harman Professional HiQnet protocol | |
809 | 3804/tcp Harman Professional HiQnet protocol | |
810 | 3826/udp WarMUX game server | |
811 | 3826/tcp WarMUX game server | |
812 | 3830/udp System Management Agent, developed and used by Cerner to monitor and manage solutions | |
813 | 3830/tcp System Management Agent, developed and used by Cerner to monitor and manage solutions | |
814 | 3880/udp IGRS | |
815 | 3880/tcp IGRS | |
816 | 3999/udp Norman distributed scanning service | |
817 | 3999/tcp Norman distributed scanning service | |
818 | 4018/udp Protocol information and warnings | |
819 | 4018/tcp Protocol information and warnings | |
820 | 4089/udp OpenCORE Remote Control Service | |
821 | 4089/tcp OpenCORE Remote Control Service | |
822 | 4090/udp Kerio | |
823 | 4090/tcp Kerio | |
824 | 4093/udp PxPlus Client server interface ProvideX | |
825 | 4093/tcp PxPlus Client server interface ProvideX | |
826 | 4096/udp Ascom Timeplex Bridge Relay Element (BRE) | |
827 | 4096/tcp Ascom Timeplex Bridge Relay Element (BRE) | |
828 | 4105/udp Shofar (ShofarNexus) | |
829 | 4105/tcp Shofar (ShofarNexus) | |
830 | 4116/udp Smartcard-TLS | |
831 | 4116/tcp Smartcard-TLS | |
832 | 4172/udp Teradici PCoIP | |
833 | 4172/tcp Teradici PCoIP | |
834 | 4303/udp Simple Railroad Command Protocol (SRCP) | |
835 | 4303/tcp Simple Railroad Command Protocol (SRCP) | |
836 | 4486/udp Integrated Client Message Service (ICMS) | |
837 | 4486/tcp Integrated Client Message Service (ICMS) | |
838 | 4500/udp IPSec NAT Traversal (RFC 3947, RFC 4306) | |
839 | 4500/assigned IPSec NAT Traversal (RFC 3947, RFC 4306) | |
840 | 4662/udp OrbitNet Message Service | |
841 | 4662/tcp OrbitNet Message Service | |
842 | 4730/udp Gearman's job server | |
843 | 4730/tcp Gearman's job server | |
844 | 4739/udp IP Flow Information Export | |
845 | 4739/tcp IP Flow Information Export | |
846 | 4753/udp SIMON (service and discovery) | |
847 | 4753/tcp SIMON (service and discovery) | |
848 | 4840/udp OPC UA Connection Protocol (TCP) and OPC UA Multicast Datagram Protocol (UDP) for OPC Unified Architecture from OPC Foundation | |
849 | 4840/tcp OPC UA Connection Protocol (TCP) and OPC UA Multicast Datagram Protocol (UDP) for OPC Unified Architecture from OPC Foundation | |
850 | 4843/udp OPC UA TCP Protocol over TLS/SSL for OPC Unified Architecture from OPC Foundation | |
851 | 4843/tcp OPC UA TCP Protocol over TLS/SSL for OPC Unified Architecture from OPC Foundation | |
852 | 4847/udp Web Fresh Communication, Quadrion Software & Odorless Entertainment | |
853 | 4847/tcp Web Fresh Communication, Quadrion Software & Odorless Entertainment | |
854 | 4894/udp LysKOM Protocol A | |
855 | 4894/tcp LysKOM Protocol A | |
856 | 4950/udp Cylon Controls UC32 Communications Port | |
857 | 4950/tcp Cylon Controls UC32 Communications Port | |
858 | 5010/udp Registered to: TelePath (the IBM FlowMark workflow-management system messaging platform). The TCP port is now used for: IBM WebSphere MQ Workflow | |
859 | 5010/tcp Registered to: TelePath (the IBM FlowMark workflow-management system messaging platform). The TCP port is now used for: IBM WebSphere MQ Workflow | |
860 | 5011/udp TelePath (the IBM FlowMark workflow-management system messaging platform) | |
861 | 5011/tcp TelePath (the IBM FlowMark workflow-management system messaging platform) | |
862 | 5025/udp scpi-raw Standard Commands for Programmable Instruments | |
863 | 5025/tcp scpi-raw Standard Commands for Programmable Instruments | |
864 | 5060/udp Session Initiation Protocol (SIP) | |
865 | 5060/tcp Session Initiation Protocol (SIP) | |
866 | 5062/udp Localisation access | |
867 | 5062/tcp Localisation access | |
868 | 5064/udp EPICS Channel Access server | |
869 | 5064/tcp EPICS Channel Access server | |
870 | 5065/udp EPICS Channel Access repeater beacon | |
871 | 5065/tcp EPICS Channel Access repeater beacon | |
872 | 5084/udp EPCglobal Low Level Reader Protocol (LLRP) | |
873 | 5084/tcp EPCglobal Low Level Reader Protocol (LLRP) | |
874 | 5085/udp EPCglobal Low Level Reader Protocol (LLRP) over TLS | |
875 | 5085/tcp EPCglobal Low Level Reader Protocol (LLRP) over TLS | |
876 | 5099/udp SafeNet, Inc Sentinel LM, Sentinel RMS, License Manager, server-to-server | |
877 | 5099/tcp SafeNet, Inc Sentinel LM, Sentinel RMS, License Manager, server-to-server | |
878 | 5150/udp ATMP Ascend Tunnel Management Protocol | |
879 | 5150/tcp ATMP Ascend Tunnel Management Protocol | |
880 | 5154/udp BZFlag | |
881 | 5154/tcp BZFlag | |
882 | 5190/udp AOL Instant Messenger protocol. The chat app is defunct as of 15 December 2017. | |
883 | 5190/tcp AOL Instant Messenger protocol. The chat app is defunct as of 15 December 2017. | |
884 | 5298/udp Extensible Messaging and Presence Protocol (XMPP) | |
885 | 5298/tcp Extensible Messaging and Presence Protocol (XMPP) | |
886 | 5310/udp Outlaws (1997 video game). Both UDP and TCP are reserved, but only UDP is used | |
887 | 5310/tcp Outlaws (1997 video game). Both UDP and TCP are reserved, but only UDP is used | |
888 | 5353/udp Multicast DNS (mDNS) | |
889 | 5353/assigned Multicast DNS (mDNS) | |
890 | 5355/udp Link-Local Multicast Name Resolution (LLMNR), allows hosts to perform name resolution for hosts on the same local link (only provided by Windows Vista and Server 2008) | |
891 | 5355/tcp Link-Local Multicast Name Resolution (LLMNR), allows hosts to perform name resolution for hosts on the same local link (only provided by Windows Vista and Server 2008) | |
892 | 5402/udp Multicast File Transfer Protocol (MFTP) | |
893 | 5402/tcp Multicast File Transfer Protocol (MFTP) | |
894 | 5405/udp NetSupport Manager | |
895 | 5405/tcp NetSupport Manager | |
896 | 5412/udp IBM Rational Synergy (Telelogic Synergy) (Continuus CM) Message Router | |
897 | 5412/tcp IBM Rational Synergy (Telelogic Synergy) (Continuus CM) Message Router | |
898 | 5413/udp Wonderware SuiteLink service | |
899 | 5413/tcp Wonderware SuiteLink service | |
900 | 5417/udp SNS Agent | |
901 | 5417/tcp SNS Agent | |
902 | 5421/udp NetSupport Manager | |
903 | 5421/tcp NetSupport Manager | |
904 | 5556/udp Freeciv, Oracle WebLogic Server Node Manager | |
905 | 5556/tcp Freeciv, Oracle WebLogic Server Node Manager | |
906 | 5568/udp Session Data Transport (SDT), a part of Architecture for Control Networks (ACN) | |
907 | 5568/tcp Session Data Transport (SDT), a part of Architecture for Control Networks (ACN) | |
908 | 5722/udp Microsoft RPC, DFSR (SYSVOL) Replication Service | |
909 | 5722/tcp Microsoft RPC, DFSR (SYSVOL) Replication Service | |
910 | 5741/udp IDA Discover Port 1 | |
911 | 5741/tcp IDA Discover Port 1 | |
912 | 5742/udp IDA Discover Port 2 | |
913 | 5742/tcp IDA Discover Port 2 | |
914 | 5900/udp Remote Frame Buffer protocol (RFB) | |
915 | 5900/tcp Remote Frame Buffer protocol (RFB) | |
916 | 5931/udp AMMYY admin Remote Control | |
917 | 5931/tcp AMMYY admin Remote Control | |
918 | 5984/udp CouchDB database server | |
919 | 5984/tcp CouchDB database server | |
920 | 6000/udp X11-used between an X client and server over the network | |
921 | 6000/tcp X11-used between an X client and server over the network | |
922 | 6001/udp X11-used between an X client and server over the network | |
923 | 6001/tcp X11-used between an X client and server over the network | |
924 | 6002/udp X11-used between an X client and server over the network | |
925 | 6002/tcp X11-used between an X client and server over the network | |
926 | 6003/udp X11-used between an X client and server over the network | |
927 | 6003/tcp X11-used between an X client and server over the network | |
928 | 6004/udp X11-used between an X client and server over the network | |
929 | 6004/tcp X11-used between an X client and server over the network | |
930 | 6005/udp X11-used between an X client and server over the network | |
931 | 6005/tcp X11-used between an X client and server over the network | |
932 | 6006/udp X11-used between an X client and server over the network | |
933 | 6006/tcp X11-used between an X client and server over the network | |
934 | 6007/udp X11-used between an X client and server over the network | |
935 | 6007/tcp X11-used between an X client and server over the network | |
936 | 6008/udp X11-used between an X client and server over the network | |
937 | 6008/tcp X11-used between an X client and server over the network | |
938 | 6009/udp X11-used between an X client and server over the network | |
939 | 6009/tcp X11-used between an X client and server over the network | |
940 | 6010/udp X11-used between an X client and server over the network | |
941 | 6010/tcp X11-used between an X client and server over the network | |
942 | 6011/udp X11-used between an X client and server over the network | |
943 | 6011/tcp X11-used between an X client and server over the network | |
944 | 6012/udp X11-used between an X client and server over the network | |
945 | 6012/tcp X11-used between an X client and server over the network | |
946 | 6013/udp X11-used between an X client and server over the network | |
947 | 6013/tcp X11-used between an X client and server over the network | |
948 | 6014/udp X11-used between an X client and server over the network | |
949 | 6014/tcp X11-used between an X client and server over the network | |
950 | 6015/udp X11-used between an X client and server over the network | |
951 | 6015/tcp X11-used between an X client and server over the network | |
952 | 6016/udp X11-used between an X client and server over the network | |
953 | 6016/tcp X11-used between an X client and server over the network | |
954 | 6017/udp X11-used between an X client and server over the network | |
955 | 6017/tcp X11-used between an X client and server over the network | |
956 | 6018/udp X11-used between an X client and server over the network | |
957 | 6018/tcp X11-used between an X client and server over the network | |
958 | 6019/udp X11-used between an X client and server over the network | |
959 | 6019/tcp X11-used between an X client and server over the network | |
960 | 6020/udp X11-used between an X client and server over the network | |
961 | 6020/tcp X11-used between an X client and server over the network | |
962 | 6021/udp X11-used between an X client and server over the network | |
963 | 6021/tcp X11-used between an X client and server over the network | |
964 | 6022/udp X11-used between an X client and server over the network | |
965 | 6022/tcp X11-used between an X client and server over the network | |
966 | 6023/udp X11-used between an X client and server over the network | |
967 | 6023/tcp X11-used between an X client and server over the network | |
968 | 6024/udp X11-used between an X client and server over the network | |
969 | 6024/tcp X11-used between an X client and server over the network | |
970 | 6025/udp X11-used between an X client and server over the network | |
971 | 6025/tcp X11-used between an X client and server over the network | |
972 | 6026/udp X11-used between an X client and server over the network | |
973 | 6026/tcp X11-used between an X client and server over the network | |
974 | 6027/udp X11-used between an X client and server over the network | |
975 | 6027/tcp X11-used between an X client and server over the network | |
976 | 6028/udp X11-used between an X client and server over the network | |
977 | 6028/tcp X11-used between an X client and server over the network | |
978 | 6029/udp X11-used between an X client and server over the network | |
979 | 6029/tcp X11-used between an X client and server over the network | |
980 | 6030/udp X11-used between an X client and server over the network | |
981 | 6030/tcp X11-used between an X client and server over the network | |
982 | 6031/udp X11-used between an X client and server over the network | |
983 | 6031/tcp X11-used between an X client and server over the network | |
984 | 6032/udp X11-used between an X client and server over the network | |
985 | 6032/tcp X11-used between an X client and server over the network | |
986 | 6033/udp X11-used between an X client and server over the network | |
987 | 6033/tcp X11-used between an X client and server over the network | |
988 | 6034/udp X11-used between an X client and server over the network | |
989 | 6034/tcp X11-used between an X client and server over the network | |
990 | 6035/udp X11-used between an X client and server over the network | |
991 | 6035/tcp X11-used between an X client and server over the network | |
992 | 6036/udp X11-used between an X client and server over the network | |
993 | 6036/tcp X11-used between an X client and server over the network | |
994 | 6037/udp X11-used between an X client and server over the network | |
995 | 6037/tcp X11-used between an X client and server over the network | |
996 | 6038/udp X11-used between an X client and server over the network | |
997 | 6038/tcp X11-used between an X client and server over the network | |
998 | 6039/udp X11-used between an X client and server over the network | |
999 | 6039/tcp X11-used between an X client and server over the network | |
1000 | 6040/udp X11-used between an X client and server over the network | |
1001 | 6040/tcp X11-used between an X client and server over the network | |
1002 | 6041/udp X11-used between an X client and server over the network | |
1003 | 6041/tcp X11-used between an X client and server over the network | |
1004 | 6042/udp X11-used between an X client and server over the network | |
1005 | 6042/tcp X11-used between an X client and server over the network | |
1006 | 6043/udp X11-used between an X client and server over the network | |
1007 | 6043/tcp X11-used between an X client and server over the network | |
1008 | 6044/udp X11-used between an X client and server over the network | |
1009 | 6044/tcp X11-used between an X client and server over the network | |
1010 | 6045/udp X11-used between an X client and server over the network | |
1011 | 6045/tcp X11-used between an X client and server over the network | |
1012 | 6046/udp X11-used between an X client and server over the network | |
1013 | 6046/tcp X11-used between an X client and server over the network | |
1014 | 6047/udp X11-used between an X client and server over the network | |
1015 | 6047/tcp X11-used between an X client and server over the network | |
1016 | 6048/udp X11-used between an X client and server over the network | |
1017 | 6048/tcp X11-used between an X client and server over the network | |
1018 | 6049/udp X11-used between an X client and server over the network | |
1019 | 6049/tcp X11-used between an X client and server over the network | |
1020 | 6050/udp X11-used between an X client and server over the network | |
1021 | 6050/tcp X11-used between an X client and server over the network | |
1022 | 6051/udp X11-used between an X client and server over the network | |
1023 | 6051/tcp X11-used between an X client and server over the network | |
1024 | 6052/udp X11-used between an X client and server over the network | |
1025 | 6052/tcp X11-used between an X client and server over the network | |
1026 | 6053/udp X11-used between an X client and server over the network | |
1027 | 6053/tcp X11-used between an X client and server over the network | |
1028 | 6054/udp X11-used between an X client and server over the network | |
1029 | 6054/tcp X11-used between an X client and server over the network | |
1030 | 6055/udp X11-used between an X client and server over the network | |
1031 | 6055/tcp X11-used between an X client and server over the network | |
1032 | 6056/udp X11-used between an X client and server over the network | |
1033 | 6056/tcp X11-used between an X client and server over the network | |
1034 | 6057/udp X11-used between an X client and server over the network | |
1035 | 6057/tcp X11-used between an X client and server over the network | |
1036 | 6058/udp X11-used between an X client and server over the network | |
1037 | 6058/tcp X11-used between an X client and server over the network | |
1038 | 6059/udp X11-used between an X client and server over the network | |
1039 | 6059/tcp X11-used between an X client and server over the network | |
1040 | 6060/udp X11-used between an X client and server over the network | |
1041 | 6060/tcp X11-used between an X client and server over the network | |
1042 | 6061/udp X11-used between an X client and server over the network | |
1043 | 6061/tcp X11-used between an X client and server over the network | |
1044 | 6062/udp X11-used between an X client and server over the network | |
1045 | 6062/tcp X11-used between an X client and server over the network | |
1046 | 6063/udp X11-used between an X client and server over the network | |
1047 | 6063/tcp X11-used between an X client and server over the network | |
1048 | 6110/udp softcm, HP Softbench CM | |
1049 | 6110/tcp softcm, HP Softbench CM | |
1050 | 6111/udp spc, HP Softbench Sub-Process Control | |
1051 | 6111/tcp spc, HP Softbench Sub-Process Control | |
1052 | 6112/udp dtspcd, execute commands and launch applications remotely | |
1053 | 6112/tcp dtspcd, execute commands and launch applications remotely | |
1054 | 6346/udp gnutella-svc, gnutella (FrostWire, Limewire, Shareaza, etc.) | |
1055 | 6346/tcp gnutella-svc, gnutella (FrostWire, Limewire, Shareaza, etc.) | |
1056 | 6347/udp gnutella-rtr, Gnutella alternate | |
1057 | 6347/tcp gnutella-rtr, Gnutella alternate | |
1058 | 6350/udp App Discovery and Access Protocol | |
1059 | 6350/tcp App Discovery and Access Protocol | |
1060 | 6444/udp Sun Grid Engine Qmaster Service | |
1061 | 6444/tcp Sun Grid Engine Qmaster Service | |
1062 | 6445/udp Sun Grid Engine Execution Service | |
1063 | 6445/tcp Sun Grid Engine Execution Service | |
1064 | 6464/udp Port assignment for medical device communication in accordance to IEEE 11073-20701 | |
1065 | 6464/tcp Port assignment for medical device communication in accordance to IEEE 11073-20701 | |
1066 | 6515/udp Elipse RPC Protocol (REC) | |
1067 | 6515/tcp Elipse RPC Protocol (REC) | |
1068 | 6619/udp odette-ftps, Odette File Transfer Protocol (OFTP) over TLS/SSL | |
1069 | 6619/tcp odette-ftps, Odette File Transfer Protocol (OFTP) over TLS/SSL | |
1070 | 6622/udp Multicast FTP | |
1071 | 6622/tcp Multicast FTP | |
1072 | 6679/udp Osorno Automation Protocol (OSAUT) | |
1073 | 6679/tcp Osorno Automation Protocol (OSAUT) | |
1074 | 6888/udp MUSE | |
1075 | 6888/tcp MUSE | |
1076 | 6969/udp acmsoda | |
1077 | 6969/tcp acmsoda | |
1078 | 7262/udp CNAP (Calypso Network Access Protocol) | |
1079 | 7262/tcp CNAP (Calypso Network Access Protocol) | |
1080 | 7272/udp WatchMe - WatchMe Monitoring | |
1081 | 7272/tcp WatchMe - WatchMe Monitoring | |
1082 | 7400/udp RTPS (Real Time Publish Subscribe) DDS Discovery | |
1083 | 7400/tcp RTPS (Real Time Publish Subscribe) DDS Discovery | |
1084 | 7401/udp RTPS (Real Time Publish Subscribe) DDS User-Traffic | |
1085 | 7401/tcp RTPS (Real Time Publish Subscribe) DDS User-Traffic | |
1086 | 7402/udp RTPS (Real Time Publish Subscribe) DDS Meta-Traffic | |
1087 | 7402/tcp RTPS (Real Time Publish Subscribe) DDS Meta-Traffic | |
1088 | 7542/udp Saratoga file transfer protocol | |
1089 | 7542/tcp Saratoga file transfer protocol | |
1090 | 7547/udp CPE WAN Management Protocol (CWMP) Technical Report 069 | |
1091 | 7547/tcp CPE WAN Management Protocol (CWMP) Technical Report 069 | |
1092 | 7624/udp Instrument Neutral Distributed Interface | |
1093 | 7624/tcp Instrument Neutral Distributed Interface | |
1094 | 8008/udp Alternative port for HTTP. See also ports 80 and 8080. | |
1095 | 8008/tcp Alternative port for HTTP. See also ports 80 and 8080. | |
1096 | 8074/udp Gadu-Gadu | |
1097 | 8074/tcp Gadu-Gadu | |
1098 | 8080/udp Alternative port for HTTP. See also ports 80 and 8008. | |
1099 | 8080/tcp Alternative port for HTTP. See also ports 80 and 8008. | |
1100 | 8243/udp HTTPS listener for Apache Synapse | |
1101 | 8243/tcp HTTPS listener for Apache Synapse | |
1102 | 8280/udp HTTP listener for Apache Synapse | |
1103 | 8280/tcp HTTP listener for Apache Synapse | |
1104 | 8883/udp Secure MQTT (MQTT over TLS) | |
1105 | 8883/tcp Secure MQTT (MQTT over TLS) | |
1106 | 9001/udp ETL Service Manager | |
1107 | 9001/tcp ETL Service Manager | |
1108 | 9080/udp glrpc, Groove Collaboration software GLRPC | |
1109 | 9080/tcp glrpc, Groove Collaboration software GLRPC | |
1110 | 9101/udp Bacula Director | |
1111 | 9101/tcp Bacula Director | |
1112 | 9102/udp Bacula File Daemon | |
1113 | 9102/tcp Bacula File Daemon | |
1114 | 9103/udp Bacula Storage Daemon | |
1115 | 9103/tcp Bacula Storage Daemon | |
1116 | 9119/udp MXit Instant Messenger | |
1117 | 9119/tcp MXit Instant Messenger | |
1118 | 9389/udp adws, Microsoft AD DS Web Services, Powershell uses this port | |
1119 | 9389/tcp adws, Microsoft AD DS Web Services, Powershell uses this port | |
1120 | 9418/udp git, Git pack transfer service | |
1121 | 9418/tcp git, Git pack transfer service | |
1122 | 9535/udp mngsuite, LANDesk Management Suite Remote Control | |
1123 | 9535/tcp mngsuite, LANDesk Management Suite Remote Control | |
1124 | 9536/udp laes-bf, IP Fabrics Surveillance buffering function | |
1125 | 9536/tcp laes-bf, IP Fabrics Surveillance buffering function | |
1126 | 9800/udp WebDAV Source | |
1127 | 9800/tcp WebDAV Source | |
1128 | 10000/udp Network Data Management Protocol | |
1129 | 10000/tcp Network Data Management Protocol | |
1130 | 10050/udp Zabbix agent | |
1131 | 10050/tcp Zabbix agent | |
1132 | 10051/udp Zabbix trapper | |
1133 | 10051/tcp Zabbix trapper | |
1134 | 10110/udp NMEA 0183 Navigational Data. Transport of NMEA 0183 sentences over TCP or UDP | |
1135 | 10110/tcp NMEA 0183 Navigational Data. Transport of NMEA 0183 sentences over TCP or UDP | |
1136 | 11001/udp metasys ( Johnson Controls Metasys java AC control environment ) | |
1137 | 11001/tcp metasys ( Johnson Controls Metasys java AC control environment ) | |
1138 | 11112/udp ACR/NEMA Digital Imaging and Communications in Medicine (DICOM) | |
1139 | 11112/tcp ACR/NEMA Digital Imaging and Communications in Medicine (DICOM) | |
1140 | 11371/udp OpenPGP HTTP key server | |
1141 | 11371/tcp OpenPGP HTTP key server | |
1142 | 13720/udp Symantec NetBackup—bprd (formerly VERITAS) | |
1143 | 13720/tcp Symantec NetBackup—bprd (formerly VERITAS) | |
1144 | 13721/udp Symantec NetBackup—bpdbm (formerly VERITAS) | |
1145 | 13721/tcp Symantec NetBackup—bpdbm (formerly VERITAS) | |
1146 | 13724/udp Symantec Network Utility—vnetd (formerly VERITAS) | |
1147 | 13724/tcp Symantec Network Utility—vnetd (formerly VERITAS) | |
1148 | 13782/udp Symantec NetBackup—bpcd (formerly VERITAS) | |
1149 | 13782/tcp Symantec NetBackup—bpcd (formerly VERITAS) | |
1150 | 13783/udp Symantec VOPIED protocol (formerly VERITAS) | |
1151 | 13783/tcp Symantec VOPIED protocol (formerly VERITAS) | |
1152 | 13785/udp Symantec NetBackup Database—nbdb (formerly VERITAS) | |
1153 | 13785/tcp Symantec NetBackup Database—nbdb (formerly VERITAS) | |
1154 | 13786/udp Symantec nomdb (formerly VERITAS) | |
1155 | 13786/tcp Symantec nomdb (formerly VERITAS) | |
1156 | 15345/udp XPilot Contact | |
1157 | 15345/tcp XPilot Contact | |
1158 | 17500/udp Dropbox LanSync Protocol (db-lsp); used to synchronize file catalogs between Dropbox clients on a local network. | |
1159 | 17500/tcp Dropbox LanSync Protocol (db-lsp); used to synchronize file catalogs between Dropbox clients on a local network. | |
1160 | 19813/udp 4D database Client Server Communication | |
1161 | 19813/tcp 4D database Client Server Communication | |
1162 | 24465/udp Tonido Directory Server for Tonido which is a Personal Web App and P2P platform | |
1163 | 24465/tcp Tonido Directory Server for Tonido which is a Personal Web App and P2P platform | |
1164 | 24554/udp BINKP, Fidonet mail transfers over TCP/IP | |
1165 | 24554/tcp BINKP, Fidonet mail transfers over TCP/IP | |
1166 | 26000/udp id Software's Quake server | |
1167 | 26000/tcp id Software's Quake server | |
1168 | 27000/udp FlexNet Publisher's License server (from the range of default ports) | |
1169 | 27000/tcp FlexNet Publisher's License server (from the range of default ports) | |
1170 | 27001/udp FlexNet Publisher's License server (from the range of default ports) | |
1171 | 27001/tcp FlexNet Publisher's License server (from the range of default ports) | |
1172 | 27002/udp FlexNet Publisher's License server (from the range of default ports) | |
1173 | 27002/tcp FlexNet Publisher's License server (from the range of default ports) | |
1174 | 27003/udp FlexNet Publisher's License server (from the range of default ports) | |
1175 | 27003/tcp FlexNet Publisher's License server (from the range of default ports) | |
1176 | 27004/udp FlexNet Publisher's License server (from the range of default ports) | |
1177 | 27004/tcp FlexNet Publisher's License server (from the range of default ports) | |
1178 | 27005/udp FlexNet Publisher's License server (from the range of default ports) | |
1179 | 27005/tcp FlexNet Publisher's License server (from the range of default ports) | |
1180 | 27006/udp FlexNet Publisher's License server (from the range of default ports) | |
1181 | 27006/tcp FlexNet Publisher's License server (from the range of default ports) | |
1182 | 27007/udp FlexNet Publisher's License server (from the range of default ports) | |
1183 | 27007/tcp FlexNet Publisher's License server (from the range of default ports) | |
1184 | 27008/udp FlexNet Publisher's License server (from the range of default ports) | |
1185 | 27008/tcp FlexNet Publisher's License server (from the range of default ports) | |
1186 | 27009/udp FlexNet Publisher's License server (from the range of default ports) | |
1187 | 27009/tcp FlexNet Publisher's License server (from the range of default ports) | |
1188 | 33434/udp traceroute | |
1189 | 33434/tcp traceroute | |
1190 | 40000/udp SafetyNET p – a real-time Industrial Ethernet protocol | |
1191 | 40000/tcp SafetyNET p – a real-time Industrial Ethernet protocol | |
1192 | 44818/udp EtherNet/IP explicit messaging | |
1193 | 44818/tcp EtherNet/IP explicit messaging | |
1194 | 47808/udp BACnet Building Automation and Control Networks (4780810 = BAC016) | |
1195 | 47808/tcp BACnet Building Automation and Control Networks (4780810 = BAC016) | |
1196 | 49151/udp Reserved | |
1197 | 49151/tcp Reserved⏎ |
30 | 30 | core.PluginBase.__init__(self) |
31 | 31 | self.id = "arp-scan" |
32 | 32 | self.name = "arp-scan network scanner" |
33 | self.plugin_version = "0.0.1" | |
33 | self.plugin_version = "0.0.2" | |
34 | 34 | self.version = "1.8.1" |
35 | 35 | self.framework_version = "1.0.0" |
36 | 36 | self.options = None |
38 | 38 | self._command_regex = re.compile( |
39 | 39 | r'^(sudo arp-scan|\.\/arp-scan|arp-scan).*?') |
40 | 40 | self._host_ip = None |
41 | self._port = "23" | |
42 | 41 | |
43 | 42 | def parseOutputString(self, output, debug=False): |
44 | 43 | |
46 | 45 | r"(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)", |
47 | 46 | output) |
48 | 47 | |
49 | host_mac_addr = re.search(r"([\dA-F]{2}(?:[-:][\dA-F]{2}){5})", output) | |
48 | host_mac_addr = re.search(r"([\dA-F]{2}(?:[-:][\dA-F]{2}){5})", output, re.IGNORECASE) | |
50 | 49 | |
51 | 50 | if host_info is None: |
52 | 51 | api.devlog("No hosts detected") |
14 | 14 | from collections import defaultdict |
15 | 15 | |
16 | 16 | from plugins import core |
17 | from plugins.plugins_utils import filter_services | |
17 | 18 | |
18 | 19 | |
19 | 20 | current_path = os.path.abspath(os.getcwd()) |
33 | 34 | self.services[ip].append({'port': port, 'protocol': protocol, 'name': name}) |
34 | 35 | |
35 | 36 | def hostname(self): |
36 | m = re.search('^hostname=(.+)$', self.rawcontents, re.MULTILINE) | |
37 | return(m.group(1).strip()) | |
37 | hostname_match = re.search('^hostname=(.+)$', self.rawcontents, re.MULTILINE) | |
38 | hostname = hostname_match.group(1).strip() | |
39 | domain_match = re.search('^domainname=(.+)$', self.rawcontents, re.MULTILINE) | |
40 | if domain_match: | |
41 | domain = domain_match.group(1).strip() | |
42 | return ".".join([hostname,domain]) | |
43 | else: | |
44 | return hostname | |
38 | 45 | |
39 | 46 | def osfullname(self): |
40 | m = re.search('^os_fullname=(.+)$', self.rawcontents, re.MULTILINE) | |
41 | return(m.group(1).strip()) | |
42 | ||
43 | def interfaces(self): | |
44 | interfaces = [] | |
45 | m = re.findall('^network_interface\[\]=(.+)$', | |
46 | self.rawcontents, re.MULTILINE) | |
47 | for iname in m: | |
48 | # Yeah, lynis doesnt relate interface to mac to ip... | |
49 | interfaces.append(iname) | |
50 | return(interfaces) | |
51 | ||
52 | def macs(self): | |
53 | macs = [] | |
54 | m = re.findall('^network_mac_address\[\]=(.+)$', | |
55 | self.rawcontents, re.MULTILINE) | |
56 | for mac in m: | |
57 | macs.append(mac) | |
58 | return(macs) | |
47 | name_match = re.search('^os_name=(.+)$', self.rawcontents, re.MULTILINE) | |
48 | name = name_match.group(1).strip() | |
49 | version_match = re.search('^os_version=(.+)$', self.rawcontents, re.MULTILINE) | |
50 | version = version_match.group(1).strip() | |
51 | return " ".join([name, version]) | |
59 | 52 | |
60 | 53 | def ipv4(self): |
61 | 54 | ipv4addrs = [] |
62 | m = re.findall('^network_ipv4_address\[\]=(.+)$', | |
55 | ipv4s = re.findall('^network_ipv4_address\[\]=(.+)$', | |
63 | 56 | self.rawcontents, re.MULTILINE) |
64 | for ipv4 in m: | |
65 | ipv4addrs.append(ipv4) | |
57 | ipv4addrs = self.ipv4_filter(ipv4s) | |
66 | 58 | return(ipv4addrs) |
67 | 59 | |
68 | 60 | def ipv6(self): |
69 | 61 | ipv6addrs = [] |
70 | m = re.findall('^network_ipv6_address\[\]=(.+)$', | |
62 | ipv6s = re.findall('^network_ipv6_address\[\]=(.+)$', | |
71 | 63 | self.rawcontents, re.MULTILINE) |
72 | for ipv6 in m: | |
73 | ipv6addrs.append(ipv6) | |
64 | ipv6addrs = self.ipv6_filter(ipv6s) | |
74 | 65 | return(ipv6addrs) |
75 | 66 | |
67 | def ipv4_filter(self, ips): | |
68 | ip_list = [] | |
69 | for ip in ips: | |
70 | if not ip == "127.0.0.1": | |
71 | ip_list.append(ip) | |
72 | ||
73 | return ip_list | |
74 | ||
75 | def ipv6_filter(self, ips): | |
76 | ip_list = [] | |
77 | for ip in ips: | |
78 | if not ip.startswith('fe80') and not ip.startswith('::1'): | |
79 | ip_list.append(ip) | |
80 | ||
81 | return ip_list | |
82 | ||
76 | 83 | def kernelVersion(self): |
77 | m = re.search('^os_kernel_version_full=(.+)$', | |
84 | versions_dict = {} | |
85 | ||
86 | version = re.search('^os_kernel_version=(.+)$', | |
78 | 87 | self.rawcontents, re.MULTILINE) |
79 | return(m.group(1).strip()) | |
88 | if version: | |
89 | versions_dict['Kernel Version'] = version.group(1).strip() | |
90 | ||
91 | version_full = re.search('^os_kernel_version_full=(.+)$', | |
92 | self.rawcontents, re.MULTILINE) | |
93 | if version_full: | |
94 | versions_dict['Kernel Version Full'] = version_full.group(1).strip() | |
95 | ||
96 | return versions_dict | |
80 | 97 | |
81 | 98 | def listeningservices(self): |
82 | ||
83 | 99 | line = re.findall('^network_listen_port\[\]=(.+)$', |
84 | 100 | self.rawcontents, re.MULTILINE) |
101 | # To avoid local services, we will create the following list | |
102 | local_services = ['*', 'localhost'] | |
85 | 103 | |
86 | 104 | for combo in line: |
87 | if combo.find("|") > 0: | |
88 | ||
89 | items_service = combo.split('|') | |
105 | elements = self.clean_services(combo, local_services) | |
106 | if elements is not None: | |
107 | self._svcHelper(elements['ip'], | |
108 | elements['port'], | |
109 | elements['protocol'], | |
110 | elements['name']) | |
111 | return self.services | |
112 | ||
113 | def clean_services(self, combo, local_services): | |
114 | add = False | |
115 | #if "localhost" in combo: | |
116 | if combo.count("|") > 1: | |
117 | items_service = combo.split('|') | |
118 | if not items_service[0] in local_services and not items_service[0].startswith(':'): | |
90 | 119 | elements_ip_port = items_service[0].split(':') |
91 | 120 | count = items_service[0].count(':') |
92 | 121 | protocol = items_service[1] |
93 | 122 | name = items_service[2] |
123 | add = True | |
94 | 124 | |
95 | 125 | if name == '-': |
96 | name = 'Unknown' | |
97 | ||
98 | else: | |
99 | items_service = combo | |
100 | count = items_service.count(':') | |
101 | elements_ip_port = items_service.split(':') | |
102 | protocol = "Unknown" | |
103 | name = "Unknown" | |
104 | ||
105 | #Ipv4 | |
106 | if count == 1: | |
107 | ip, port = elements_ip_port | |
108 | ||
109 | #Ipv6 | |
110 | elif count == 3: | |
111 | port = elements_ip_port[3] | |
112 | ip = '::' | |
113 | ||
114 | #Ipv6 | |
115 | elif count == 5: | |
116 | port = elements_ip_port[5] | |
117 | ip = items_service[0].replace(':{}'.format(port), '') | |
118 | ||
119 | self._svcHelper(ip, port, protocol, name) | |
120 | ||
121 | return self.services | |
122 | ||
123 | ||
124 | def suggestions(self): | |
126 | details = self.search_service(elements_ip_port[1]) | |
127 | name = details['name'] | |
128 | elif combo.count('|') == 1: | |
129 | items_service = combo.split('|') | |
130 | if not items_service[0] in local_services and not items_service[0].startswith(':'): | |
131 | count = items_service[0].count(':') | |
132 | elements_ip_port = items_service[0].split(':') | |
133 | details = self.search_service(elements_ip_port[1]) | |
134 | protocol = details['protocol'] | |
135 | name = details['name'] | |
136 | add = True | |
137 | else: | |
138 | items_service = combo | |
139 | count = items_service.count(':') | |
140 | elements_ip_port = items_service.split(':') | |
141 | details = self.search_service(elements_ip_port[1]) | |
142 | protocol = details['protocol'] | |
143 | name = details['name'] | |
144 | add = True | |
145 | ||
146 | if add == True: | |
147 | ip, port = self.colon_count(count, elements_ip_port, items_service) | |
148 | elements_dict = { | |
149 | "ip":ip, | |
150 | "port": port, | |
151 | "protocol": protocol, | |
152 | "name": name | |
153 | } | |
154 | return elements_dict | |
155 | else: | |
156 | return None | |
157 | ||
158 | def search_service(self, port): | |
159 | srv = filter_services() | |
160 | details_dict = { | |
161 | 'name' : 'Unknown', | |
162 | 'protocol' : 'Unknown' | |
163 | } | |
164 | for item in srv: | |
165 | service_tuple = item[0].split('/') | |
166 | parsed_port = service_tuple[0] | |
167 | if parsed_port == port: | |
168 | details_dict['name'] = item[1] | |
169 | details_dict['protocol'] = service_tuple[1] | |
170 | return details_dict | |
171 | return details_dict | |
172 | ||
173 | def colon_count(self, count, elements_ip_port, items_service): | |
174 | #Ipv4 | |
175 | if count == 1: | |
176 | ip, port = elements_ip_port | |
177 | ||
178 | #Ipv6 | |
179 | elif count == 3: | |
180 | port = elements_ip_port[3] | |
181 | ip = '::' | |
182 | ||
183 | #Ipv6 | |
184 | elif count == 5: | |
185 | port = elements_ip_port[5] | |
186 | ip = items_service[0].replace(':{}'.format(port), '') | |
187 | ||
188 | return ip, port | |
189 | ||
190 | def parse_suggestions(self): | |
125 | 191 | sugs = {} |
126 | 192 | m = re.findall('^suggestion\[\]=(.+)$', self.rawcontents, re.MULTILINE) |
127 | 193 | for combo in m: |
129 | 195 | sugs[x[0]] = x[1] |
130 | 196 | return(sugs) |
131 | 197 | |
132 | def warnings(self): | |
198 | def parse_warnings(self): | |
133 | 199 | warns = {} |
134 | 200 | m = re.findall('^warning\[\]=(.+)$', self.rawcontents, re.MULTILINE) |
135 | 201 | for combo in m: |
145 | 211 | core.PluginBase.__init__(self) |
146 | 212 | self.id = "Lynis" |
147 | 213 | self.name = "Lynis DAT Output Plugin" |
148 | self.plugin_version = "0.0.3" | |
149 | self.version = "2.5.5" | |
214 | self.plugin_version = "0.4" | |
215 | self.version = "2.7.1" | |
150 | 216 | self.options = None |
151 | 217 | self._current_output = None |
152 | 218 | rr = r'^(lynis|sudo lynis|\.\/lynis|sudo \.\/lynis).*?' |
162 | 228 | lde = LynisLogDataExtracter(datfile=datpath) |
163 | 229 | elif '# Lynis Report' in output: |
164 | 230 | lde = LynisLogDataExtracter(output=output) |
165 | ||
166 | 231 | hostname = lde.hostname() |
167 | try: | |
168 | ip = socket.gethostbyname(hostname) | |
169 | except socket.gaierror: | |
170 | ip = hostname | |
171 | h_id = self.createAndAddHost(name=ip, os=lde.osfullname(), hostnames=[hostname]) | |
172 | ||
173 | self.createAndAddVulnToHost( | |
174 | host_id=h_id, | |
175 | name="Kernel Version", | |
176 | severity='info', | |
177 | desc=lde.kernelVersion() | |
178 | ) | |
179 | ||
180 | interfaces = lde.interfaces() | |
181 | macs = lde.macs() | |
182 | 232 | ipv4s = lde.ipv4() |
183 | 233 | ipv6s = lde.ipv6() |
184 | svcs = lde.listeningservices() | |
234 | kernel_versions = lde.kernelVersion() | |
235 | services = lde.listeningservices() | |
236 | suggestions = lde.parse_suggestions() | |
237 | warnings = lde.parse_warnings() | |
185 | 238 | |
186 | 239 | for ipv4 in ipv4s: |
187 | i_id = self.createAndAddInterface(host_id=h_id, | |
188 | ipv4_address=ipv4) | |
189 | for service_data in svcs[ipv4]: | |
190 | self.createAndAddServiceToInterface(host_id=h_id, | |
191 | interface_id=i_id, | |
192 | name=service_data['name'], | |
193 | protocol=service_data['protocol'], | |
194 | ports=[service_data['port']]) | |
240 | h_id = self.createAndAddHost(name=ipv4, | |
241 | os=lde.osfullname(), | |
242 | hostnames=[hostname]) | |
243 | ||
244 | self.create_services(h_id, services, ipv4) | |
245 | self.create_vulns_with_kernel(h_id, kernel_versions) | |
246 | self.create_vulns_with_suggestions(h_id, suggestions) | |
247 | self.create_vulns_with_warns(h_id, warnings) | |
248 | ||
195 | 249 | for ipv6 in ipv6s: |
196 | i_id = self.createAndAddInterface(host_id=h_id, | |
197 | ipv6_address=ipv6) | |
198 | for service_data in svcs[ipv6]: | |
199 | self.createAndAddServiceToInterface(host_id=h_id, | |
200 | interface_id=i_id, | |
201 | name=service_data['name'], | |
202 | protocol=service_data['protocol'], | |
203 | ports=[service_data['port']]) | |
204 | sugs = lde.suggestions() | |
250 | h_id = self.createAndAddHost(name=ipv6, | |
251 | os=lde.osfullname(), | |
252 | hostnames=[hostname]) | |
253 | ||
254 | self.create_services(h_id, services, ipv6) | |
255 | self.create_vulns_with_kernel(h_id, kernel_versions) | |
256 | self.create_vulns_with_suggestions(h_id, suggestions) | |
257 | self.create_vulns_with_warns(h_id, warnings) | |
258 | ||
259 | def create_services(self, host_id, parsed_services, ip_version): | |
260 | for service_data in parsed_services[ip_version]: | |
261 | self.createAndAddServiceToHost(host_id=host_id, | |
262 | name=service_data['name'], | |
263 | protocol=service_data['protocol'], | |
264 | ports=[service_data['port']]) | |
265 | ||
266 | if '0.0.0.0' in parsed_services: | |
267 | for service_data in parsed_services['0.0.0.0']: | |
268 | self.createAndAddServiceToHost(host_id=host_id, | |
269 | name=service_data['name'], | |
270 | protocol=service_data['protocol'], | |
271 | ports=[service_data['port']]) | |
272 | ||
273 | def create_vulns_with_kernel(self, host_id, kernel_versions): | |
274 | for kernel, version in kernel_versions.iteritems(): | |
275 | self.createAndAddVulnToHost( | |
276 | host_id=host_id, | |
277 | name=kernel, | |
278 | severity='info', | |
279 | desc=version | |
280 | ) | |
281 | ||
282 | def create_vulns_with_suggestions(self, host_id, sugs): | |
205 | 283 | for sug in sugs: |
206 | 284 | self.createAndAddVulnToHost( |
207 | host_id=h_id, | |
285 | host_id=host_id, | |
208 | 286 | name=sug, |
209 | 287 | severity='med', |
210 | 288 | desc=sugs[sug] |
211 | 289 | ) |
212 | 290 | |
213 | warns = lde.warnings() | |
291 | def create_vulns_with_warns(self, host_id, warns): | |
214 | 292 | for warn in warns: |
215 | 293 | self.createAndAddVulnToHost( |
216 | host_id=h_id, | |
217 | name=sug, | |
294 | host_id=host_id, | |
295 | name=warn, | |
218 | 296 | severity='high', |
219 | 297 | desc=warns[warn] |
220 | 298 | ) |
59 | 59 | self.addSetting("Server", str, "localhost") |
60 | 60 | self.addSetting("Port", str, "5432") |
61 | 61 | ### NOTE: do _not_ correct the typo, it's used by the user.xml |
62 | self.addSetting("Workspace", str, "a_workspace") | |
62 | self.addSetting("Workspace", str, "default") | |
63 | 63 | self.addSetting("Enable", str, "0") |
64 | 64 | |
65 | 65 | self._sdate = "" |
82 | 82 | host=self.getSetting("Server"), |
83 | 83 | port=self.getSetting("Port")) |
84 | 84 | |
85 | # conn = psycopg2.connect("dbname='" + self.getSetting("Database") + | |
86 | # "' user='" + self.getSetting("User") + | |
87 | # "' password='" + self.getSetting("Password") + | |
88 | # "' host='" + self.getSetting("Server") + | |
89 | # "' port='" + self.getSetting("Port") + | |
90 | # "'") | |
91 | ||
92 | 85 | cur = conn.cursor() |
93 | 86 | except Exception as e: |
87 | print "[Faraday - MetasplotiOn] Error Connecting to the database" | |
88 | print "[Faraday - MetasplotiOn]Check your metasploit postgresql credentials and server IP/Port" | |
94 | 89 | print e |
95 | print "Error Connecting to the database\n" | |
96 | 90 | return |
97 | 91 | |
98 | 92 | cur = self._doSql( |
7 | 7 | |
8 | 8 | ''' |
9 | 9 | from __future__ import with_statement |
10 | from plugins import core | |
11 | from faraday import FARADAY_BASE | |
12 | 10 | import re |
13 | 11 | import os |
14 | 12 | import sys |
20 | 18 | except ImportError: |
21 | 19 | import xml.etree.ElementTree as ET |
22 | 20 | ETREE_VERSION = ET.VERSION |
21 | ||
22 | from plugins import core | |
23 | from faraday import FARADAY_BASE | |
24 | from plugins.plugins_utils import filter_services | |
23 | 25 | |
24 | 26 | ETREE_VERSION = [int(i) for i in ETREE_VERSION.split(".")] |
25 | 27 | |
50 | 52 | self.target = None |
51 | 53 | self.port = "80" |
52 | 54 | self.host = None |
53 | ||
54 | 55 | tree = self.parse_xml(xml_output) |
55 | 56 | |
56 | 57 | if tree: |
81 | 82 | """ |
82 | 83 | try: |
83 | 84 | report = tree.findall('report')[0] |
84 | node = tree.findall('report')[0] | |
85 | node2 = node.findall('results')[0] | |
86 | for node in node2.findall('result'): | |
85 | results = report.findall('results')[0] | |
86 | for node in results.findall('result'): | |
87 | 87 | yield Item(node,report) |
88 | 88 | |
89 | 89 | except Exception: |
90 | 90 | |
91 | node2 = tree.findall('result') | |
92 | for node in node2: | |
91 | result = tree.findall('result') | |
92 | for node in result: | |
93 | 93 | yield Item(node) |
94 | 94 | |
95 | 95 | |
136 | 136 | |
137 | 137 | def __init__(self, item_node, report): |
138 | 138 | self.node = item_node |
139 | ||
140 | 139 | self.host = self.get_text_from_subnode('host') |
141 | 140 | self.subnet = self.get_text_from_subnode('subnet') |
142 | 141 | |
143 | 142 | if self.subnet is '': |
144 | 143 | self.subnet = self.host |
145 | 144 | |
146 | self.description = self.get_text_from_subnode('description') | |
147 | 145 | self.port = "None" |
148 | 146 | self.severity = self.get_text_from_subnode('threat') |
149 | 147 | self.service = "Unknown" |
175 | 173 | self.xref = self.get_text_from_subnode( |
176 | 174 | 'xref') if self.get_text_from_subnode('xref') != "NOXREF" else "" |
177 | 175 | |
178 | ||
179 | def do_clean(self, value): | |
180 | myreturn = "" | |
181 | if value is not None: | |
182 | myreturn = re.sub("\n", "", value) | |
183 | return myreturn | |
176 | self.description = '' | |
177 | self.resolution = '' | |
178 | self.cvss_vector = '' | |
179 | self.tags = self.get_text_from_subnode('tags') | |
180 | if self.tags: | |
181 | tags_data = self.get_data_from_tags(self.tags) | |
182 | self.description = tags_data['description'] | |
183 | self.resolution = tags_data['solution'] | |
184 | self.cvss_vector = tags_data['cvss_base_vector'] | |
185 | ||
184 | 186 | |
185 | 187 | def get_text_from_subnode(self, subnode_xpath_expr): |
186 | 188 | """ |
190 | 192 | """ |
191 | 193 | sub_node = self.node.find(subnode_xpath_expr) |
192 | 194 | if sub_node is not None and sub_node.text is not None: |
193 | return sub_node.text | |
195 | return sub_node.text.strip() | |
194 | 196 | |
195 | 197 | return '' |
196 | 198 | |
197 | 199 | |
198 | def get_service(self, port, report, host_ip): | |
199 | detail = self.get_detail_from_host(report,host_ip) | |
200 | def get_service(self, port, report, result_host_ip): | |
201 | detail = self.get_detail_from_host(report,result_host_ip) | |
200 | 202 | |
201 | 203 | # dict detail: |
202 | 204 | # key is the host ip |
209 | 211 | |
210 | 212 | # if the service is not in detail, we will search it in |
211 | 213 | # the file port_mapper.txt |
212 | srv = self.filter_services() | |
214 | srv = filter_services() | |
213 | 215 | for service in srv: |
214 | 216 | if service[0] == port: |
215 | 217 | return service[1] |
216 | 218 | |
217 | 219 | return "Unknown" |
218 | 220 | |
219 | def filter_services(self): | |
220 | open_file = open(os.path.join(FARADAY_BASE,'plugins/repo/openvas/port_mapper.txt'),"r") | |
221 | mapper = open_file.read() | |
222 | filtering = mapper.split('\n') | |
223 | ||
224 | services = [] | |
225 | ||
226 | for item in filtering: | |
227 | tup = () | |
228 | filt = filter(len,item.split('\t')) | |
229 | tup = (filt[0],filt[1]) | |
230 | services.append(tup) | |
231 | ||
232 | return services | |
233 | ||
234 | def get_detail_from_host(self, report, host_ip): | |
235 | hosts = report.findall('host') | |
221 | ||
222 | def get_detail_from_host(self, report, result_host_ip): | |
223 | report_hosts = report.findall('host') | |
236 | 224 | host_dict = {} |
237 | for host in hosts: | |
238 | if host[0].text == host_ip.strip(): | |
225 | for host in report_hosts: | |
226 | report_host_ip = host.find('ip').text.strip() | |
227 | if report_host_ip == result_host_ip: | |
239 | 228 | details = self.get_details(host) |
240 | host_dict[host.find('ip').text] = details | |
229 | host_dict[report_host_ip] = details | |
241 | 230 | |
242 | 231 | return host_dict |
232 | ||
243 | 233 | |
244 | 234 | def get_details(self, host): |
245 | 235 | details_list = host.findall('detail') |
246 | 236 | details_dict = {} |
247 | 237 | |
248 | for item in details_list: | |
249 | name = item.find('name').text | |
238 | for detail in details_list: | |
239 | name = detail.find('name').text.strip() | |
250 | 240 | if not 'EXIT' in name: |
251 | details_dict[item.find('value').text] = name | |
241 | value = self.do_clean(detail.find('value').text) | |
242 | details_dict[value] = name | |
252 | 243 | |
253 | 244 | return details_dict |
245 | ||
246 | ||
247 | def do_clean(self, value): | |
248 | myreturn = "" | |
249 | if value is not None: | |
250 | myreturn = re.sub("\s+", " ", value) | |
251 | ||
252 | return myreturn.strip() | |
253 | ||
254 | 254 | |
255 | 255 | def get_service_from_details(self, value_dict, port): |
256 | 256 | # dict value: |
285 | 285 | |
286 | 286 | return res |
287 | 287 | |
288 | def get_data_from_tags(self,tags_text): | |
289 | clean_text = self.do_clean(tags_text) | |
290 | tags = clean_text.split('|') | |
291 | summary = '' | |
292 | insight = '' | |
293 | data = { | |
294 | 'solution': '', | |
295 | 'cvss_base_vector': '', | |
296 | 'description':'' | |
297 | } | |
298 | for tag in tags: | |
299 | splited_tag = tag.split('=',1) | |
300 | if splited_tag[0] in data.keys(): | |
301 | data[splited_tag[0]] = splited_tag[1] | |
302 | elif splited_tag[0] == 'summary': | |
303 | summary = splited_tag[1] | |
304 | elif splited_tag[0] == 'insight': | |
305 | insight = splited_tag[1] | |
306 | ||
307 | data['description'] = ' '.join([summary,insight]).strip() | |
308 | ||
309 | return data | |
310 | ||
288 | 311 | |
289 | 312 | class OpenvasPlugin(core.PluginBase): |
290 | 313 | """ |
295 | 318 | core.PluginBase.__init__(self) |
296 | 319 | self.id = "Openvas" |
297 | 320 | self.name = "Openvas XML Output Plugin" |
298 | self.plugin_version = "0.0.2" | |
299 | self.version = "2.0" | |
321 | self.plugin_version = "0.3" | |
322 | self.version = "9.0.3" | |
300 | 323 | self.framework_version = "1.0.0" |
301 | 324 | self.options = None |
302 | 325 | self._current_output = None |
321 | 344 | |
322 | 345 | web = False |
323 | 346 | ids = {} |
347 | ||
324 | 348 | for item in parser.items: |
325 | 349 | |
326 | 350 | if item.name is not None: |
327 | ||
328 | 351 | ref = [] |
329 | 352 | if item.cve: |
330 | 353 | ref.append(item.cve.encode("utf-8")) |
332 | 355 | ref.append(item.bid.encode("utf-8")) |
333 | 356 | if item.xref: |
334 | 357 | ref.append(item.xref.encode("utf-8")) |
358 | if item.tags and item.cvss_vector: | |
359 | ref.append(item.cvss_vector.encode("utf-8")) | |
335 | 360 | |
336 | 361 | if ids.has_key(item.subnet): |
337 | 362 | h_id = ids[item.host] |
345 | 370 | item.name.encode("utf-8"), |
346 | 371 | desc=item.description.encode("utf-8"), |
347 | 372 | severity=item.severity.encode("utf-8"), |
373 | resolution=item.resolution.encode("utf-8"), | |
348 | 374 | ref=ref) |
349 | 375 | else: |
350 | ||
351 | 376 | if item.service: |
352 | 377 | web = True if re.search( |
353 | 378 | r'^(www|http)', |
378 | 403 | if ids.has_key(item.subnet + "_" + item.port): |
379 | 404 | s_id = ids[item.subnet + "_" + item.port] |
380 | 405 | else: |
381 | ||
382 | 406 | s_id = self.createAndAddServiceToInterface( |
383 | 407 | h_id, |
384 | 408 | i_id, |
413 | 437 | desc=item.description.encode("utf-8"), |
414 | 438 | website=item.host, |
415 | 439 | severity=item.severity.encode("utf-8"), |
416 | ref=ref) | |
440 | ref=ref, | |
441 | resolution=item.resolution.encode("utf-8")) | |
417 | 442 | else: |
418 | 443 | self.createAndAddVulnToService( |
419 | 444 | h_id, |
421 | 446 | item.name.encode("utf-8"), |
422 | 447 | desc=item.description.encode("utf-8"), |
423 | 448 | severity=item.severity.encode("utf-8"), |
424 | ref=ref) | |
449 | ref=ref, | |
450 | resolution=item.resolution.encode("utf-8")) | |
425 | 451 | |
426 | 452 | del parser |
427 | 453 | |
442 | 468 | return OpenvasPlugin() |
443 | 469 | |
444 | 470 | if __name__ == '__main__': |
445 | with open("/home/javier/report_openvas.xml","r") as report: | |
471 | with open("/home/javier/openvas-report.xml","r") as report: | |
446 | 472 | parser = OpenvasXmlParser(report.read()) |
447 | 473 | #for item in parser.items: |
448 | 474 | #if item.status == 'up': |
0 | 1/tcp tcpmux | |
1 | 7/tcp echo | |
2 | 7/udp echo | |
3 | 9/tcp discard | |
4 | 9/udp discard | |
5 | 11/tcp systat | |
6 | 13/tcp daytime | |
7 | 13/udp daytime | |
8 | 15/tcp netstat | |
9 | 17/tcp qotd | |
10 | 18/tcp msp | |
11 | 18/udp msp | |
12 | 19/tcp chargen | |
13 | 19/udp chargen | |
14 | 20/tcp ftp-data | |
15 | 21/tcp ftp | |
16 | 21/udp fsp | |
17 | 22/tcp ssh | |
18 | 22/udp ssh | |
19 | 23/tcp telnet | |
20 | 25/tcp smtp | |
21 | 37/tcp time | |
22 | 37/udp time | |
23 | 39/udp rlp | |
24 | 42/tcp nameserver | |
25 | 43/tcp whois | |
26 | 49/tcp tacacs | |
27 | 49/udp tacacs | |
28 | 50/tcp re-mail-ck | |
29 | 50/udp re-mail-ck | |
30 | 53/tcp domain | |
31 | 53/udp domain | |
32 | 57/tcp mtp | |
33 | 65/tcp tacacs-ds | |
34 | 65/udp tacacs-ds | |
35 | 67/tcp bootps | |
36 | 67/udp bootps | |
37 | 68/tcp bootpc | |
38 | 68/udp bootpc | |
39 | 69/udp tftp | |
40 | 70/tcp gopher | |
41 | 70/udp gopher | |
42 | 77/tcp rje | |
43 | 79/tcp finger | |
44 | 80/tcp http | |
45 | 80/udp http | |
46 | 87/tcp link | |
47 | 88/tcp kerberos | |
48 | 88/udp kerberos | |
49 | 95/tcp supdup | |
50 | 101/tcp hostnames | |
51 | 102/tcp iso-tsap | |
52 | 104/tcp acr-nema | |
53 | 104/udp acr-nema | |
54 | 105/tcp csnet-ns | |
55 | 105/udp csnet-ns | |
56 | 107/tcp rtelnet | |
57 | 107/udp rtelnet | |
58 | 109/tcp pop2 | |
59 | 109/udp pop2 | |
60 | 110/tcp pop3 | |
61 | 110/udp pop3 | |
62 | 111/tcp sunrpc | |
63 | 111/udp sunrpc | |
64 | 113/tcp auth | |
65 | 115/tcp sftp | |
66 | 117/tcp uucp-path | |
67 | 119/tcp nntp | |
68 | 123/tcp ntp | |
69 | 123/udp ntp | |
70 | 129/tcp pwdgen | |
71 | 129/udp pwdgen | |
72 | 135/tcp loc-srv | |
73 | 135/udp loc-srv | |
74 | 137/tcp netbios-ns | |
75 | 137/udp netbios-ns | |
76 | 138/tcp netbios-dgm | |
77 | 138/udp netbios-dgm | |
78 | 139/tcp netbios-ssn | |
79 | 139/udp netbios-ssn | |
80 | 143/tcp imap2 | |
81 | 143/udp imap2 | |
82 | 161/tcp snmp | |
83 | 161/udp snmp | |
84 | 162/tcp snmp-trap | |
85 | 162/udp snmp-trap | |
86 | 163/tcp cmip-man | |
87 | 163/udp cmip-man | |
88 | 164/tcp cmip-agent | |
89 | 164/udp cmip-agent | |
90 | 174/tcp mailq | |
91 | 174/udp mailq | |
92 | 177/tcp xdmcp | |
93 | 177/udp xdmcp | |
94 | 178/tcp nextstep | |
95 | 178/udp nextstep | |
96 | 179/tcp bgp | |
97 | 179/udp bgp | |
98 | 191/tcp prospero | |
99 | 191/udp prospero | |
100 | 194/tcp irc | |
101 | 194/udp irc | |
102 | 199/tcp smux | |
103 | 199/udp smux | |
104 | 201/tcp at-rtmp | |
105 | 201/udp at-rtmp | |
106 | 202/tcp at-nbp | |
107 | 202/udp at-nbp | |
108 | 204/tcp at-echo | |
109 | 204/udp at-echo | |
110 | 206/tcp at-zis | |
111 | 206/udp at-zis | |
112 | 209/tcp qmtp | |
113 | 209/udp qmtp | |
114 | 210/tcp z3950 | |
115 | 210/udp z3950 | |
116 | 213/tcp ipx | |
117 | 213/udp ipx | |
118 | 220/tcp imap3 | |
119 | 220/udp imap3 | |
120 | 345/tcp pawserv | |
121 | 345/udp pawserv | |
122 | 346/tcp zserv | |
123 | 346/udp zserv | |
124 | 347/tcp fatserv | |
125 | 347/udp fatserv | |
126 | 369/tcp rpc2portmap | |
127 | 369/udp rpc2portmap | |
128 | 370/tcp codaauth2 | |
129 | 370/udp codaauth2 | |
130 | 371/tcp clearcase | |
131 | 371/udp clearcase | |
132 | 372/tcp ulistserv | |
133 | 372/udp ulistserv | |
134 | 389/tcp ldap | |
135 | 389/udp ldap | |
136 | 406/tcp imsp | |
137 | 406/udp imsp | |
138 | 427/tcp svrloc | |
139 | 427/udp svrloc | |
140 | 443/tcp https | |
141 | 443/udp https | |
142 | 444/tcp snpp | |
143 | 444/udp snpp | |
144 | 445/tcp microsoft-ds | |
145 | 445/udp microsoft-ds | |
146 | 464/tcp kpasswd | |
147 | 464/udp kpasswd | |
148 | 465/tcp urd | |
149 | 487/tcp saft | |
150 | 487/udp saft | |
151 | 500/tcp isakmp | |
152 | 500/udp isakmp | |
153 | 554/tcp rtsp | |
154 | 554/udp rtsp | |
155 | 607/tcp nqs | |
156 | 607/udp nqs | |
157 | 610/tcp npmp-local | |
158 | 610/udp npmp-local | |
159 | 611/tcp npmp-gui | |
160 | 611/udp npmp-gui | |
161 | 612/tcp hmmp-ind | |
162 | 612/udp hmmp-ind | |
163 | 623/udp asf-rmcp | |
164 | 628/tcp qmqp | |
165 | 628/udp qmqp | |
166 | 631/tcp ipp | |
167 | 631/udp ipp | |
168 | 512/tcp exec | |
169 | 512/udp biff | |
170 | 513/tcp login | |
171 | 513/udp who | |
172 | 514/tcp shell | |
173 | 514/udp syslog | |
174 | 515/tcp printer | |
175 | 517/udp talk | |
176 | 518/udp ntalk | |
177 | 520/udp route | |
178 | 525/udp timed | |
179 | 526/tcp tempo | |
180 | 530/tcp courier | |
181 | 531/tcp conference | |
182 | 532/tcp netnews | |
183 | 533/udp netwall | |
184 | 538/tcp gdomap | |
185 | 538/udp gdomap | |
186 | 540/tcp uucp | |
187 | 543/tcp klogin | |
188 | 544/tcp kshell | |
189 | 546/tcp dhcpv6-client | |
190 | 546/udp dhcpv6-client | |
191 | 547/tcp dhcpv6-server | |
192 | 547/udp dhcpv6-server | |
193 | 548/tcp afpovertcp | |
194 | 548/udp afpovertcp | |
195 | 549/tcp idfp | |
196 | 549/udp idfp | |
197 | 556/tcp remotefs | |
198 | 563/tcp nntps | |
199 | 563/udp nntps | |
200 | 587/tcp submission | |
201 | 587/udp submission | |
202 | 636/tcp ldaps | |
203 | 636/udp ldaps | |
204 | 655/tcp tinc | |
205 | 655/udp tinc | |
206 | 706/tcp silc | |
207 | 706/udp silc | |
208 | 749/tcp kerberos-adm | |
209 | 765/tcp webster | |
210 | 765/udp webster | |
211 | 873/tcp rsync | |
212 | 873/udp rsync | |
213 | 989/tcp ftps-data | |
214 | 990/tcp ftps | |
215 | 992/tcp telnets | |
216 | 992/udp telnets | |
217 | 993/tcp imaps | |
218 | 993/udp imaps | |
219 | 994/tcp ircs | |
220 | 994/udp ircs | |
221 | 995/tcp pop3s | |
222 | 995/udp pop3s | |
223 | 1080/tcp socks | |
224 | 1080/udp socks | |
225 | 1093/tcp proofd | |
226 | 1093/udp proofd | |
227 | 1094/tcp rootd | |
228 | 1094/udp rootd | |
229 | 1194/tcp openvpn | |
230 | 1194/udp openvpn | |
231 | 1099/tcp rmiregistry | |
232 | 1099/udp rmiregistry | |
233 | 1214/tcp kazaa | |
234 | 1214/udp kazaa | |
235 | 1241/tcp nessus | |
236 | 1241/udp nessus | |
237 | 1352/tcp lotusnote | |
238 | 1352/udp lotusnote | |
239 | 1433/tcp ms-sql-s | |
240 | 1433/udp ms-sql-s | |
241 | 1434/tcp ms-sql-m | |
242 | 1434/udp ms-sql-m | |
243 | 1524/tcp ingreslock | |
244 | 1524/udp ingreslock | |
245 | 1525/tcp prospero-np | |
246 | 1525/udp prospero-np | |
247 | 1645/tcp datametrics | |
248 | 1645/udp datametrics | |
249 | 1646/tcp sa-msg-port | |
250 | 1646/udp sa-msg-port | |
251 | 1649/tcp kermit | |
252 | 1649/udp kermit | |
253 | 1677/tcp groupwise | |
254 | 1677/udp groupwise | |
255 | 1701/tcp l2f | |
256 | 1701/udp l2f | |
257 | 1812/tcp radius | |
258 | 1812/udp radius | |
259 | 1813/tcp radius-acct | |
260 | 1813/udp radius-acct | |
261 | 1863/tcp msnp | |
262 | 1863/udp msnp | |
263 | 1957/tcp unix-status | |
264 | 1958/tcp log-server | |
265 | 1959/tcp remoteping | |
266 | 2000/tcp cisco-sccp | |
267 | 2000/udp cisco-sccp | |
268 | 2010/tcp search | |
269 | 2010/tcp pipe-server | |
270 | 2049/tcp nfs | |
271 | 2049/udp nfs | |
272 | 2086/tcp gnunet | |
273 | 2086/udp gnunet | |
274 | 2101/tcp rtcm-sc104 | |
275 | 2101/udp rtcm-sc104 | |
276 | 2119/tcp gsigatekeeper | |
277 | 2119/udp gsigatekeeper | |
278 | 2135/tcp gris | |
279 | 2135/udp gris | |
280 | 2401/tcp cvspserver | |
281 | 2401/udp cvspserver | |
282 | 2430/tcp venus | |
283 | 2430/udp venus | |
284 | 2431/tcp venus-se | |
285 | 2431/udp venus-se | |
286 | 2432/tcp codasrv | |
287 | 2432/udp codasrv | |
288 | 2433/tcp codasrv-se | |
289 | 2433/udp codasrv-se | |
290 | 2583/tcp mon | |
291 | 2583/udp mon | |
292 | 2628/tcp dict | |
293 | 2628/udp dict | |
294 | 2792/tcp f5-globalsite | |
295 | 2792/udp f5-globalsite | |
296 | 2811/tcp gsiftp | |
297 | 2811/udp gsiftp | |
298 | 2947/tcp gpsd | |
299 | 2947/udp gpsd | |
300 | 3050/tcp gds-db | |
301 | 3050/udp gds-db | |
302 | 3130/tcp icpv2 | |
303 | 3130/udp icpv2 | |
304 | 3260/tcp iscsi-target | |
305 | 3306/tcp mysql | |
306 | 3306/udp mysql | |
307 | 3493/tcp nut | |
308 | 3493/udp nut | |
309 | 3632/tcp distcc | |
310 | 3632/udp distcc | |
311 | 3689/tcp daap | |
312 | 3689/udp daap | |
313 | 3690/tcp svn | |
314 | 3690/udp svn | |
315 | 4031/tcp suucp | |
316 | 4031/udp suucp | |
317 | 4094/tcp sysrqd | |
318 | 4094/udp sysrqd | |
319 | 4190/tcp sieve | |
320 | 4369/tcp epmd | |
321 | 4369/udp epmd | |
322 | 4373/tcp remctl | |
323 | 4373/udp remctl | |
324 | 4353/tcp f5-iquery | |
325 | 4353/udp f5-iquery | |
326 | 4500/udp ipsec-nat-t | |
327 | 4569/tcp iax | |
328 | 4569/udp iax | |
329 | 4691/tcp mtn | |
330 | 4691/udp mtn | |
331 | 4899/tcp radmin-port | |
332 | 4899/udp radmin-port | |
333 | 5002/udp rfe | |
334 | 5002/tcp rfe | |
335 | 5050/tcp mmcc | |
336 | 5050/udp mmcc | |
337 | 5060/tcp sip | |
338 | 5060/udp sip | |
339 | 5061/tcp sip-tls | |
340 | 5061/udp sip-tls | |
341 | 5190/tcp aol | |
342 | 5190/udp aol | |
343 | 5222/tcp xmpp-client | |
344 | 5222/udp xmpp-client | |
345 | 5269/tcp xmpp-server | |
346 | 5269/udp xmpp-server | |
347 | 5308/tcp cfengine | |
348 | 5308/udp cfengine | |
349 | 5353/tcp mdns | |
350 | 5353/udp mdns | |
351 | 5432/tcp postgresql | |
352 | 5432/udp postgresql | |
353 | 5556/tcp freeciv | |
354 | 5556/udp freeciv | |
355 | 5671/tcp amqps | |
356 | 5672/tcp amqp | |
357 | 5672/udp amqp | |
358 | 5672/sctp amqp | |
359 | 5688/tcp ggz | |
360 | 5688/udp ggz | |
361 | 6000/tcp x11 | |
362 | 6000/udp x11 | |
363 | 6001/tcp x11-1 | |
364 | 6001/udp x11-1 | |
365 | 6002/tcp x11-2 | |
366 | 6002/udp x11-2 | |
367 | 6003/tcp x11-3 | |
368 | 6003/udp x11-3 | |
369 | 6004/tcp x11-4 | |
370 | 6004/udp x11-4 | |
371 | 6005/tcp x11-5 | |
372 | 6005/udp x11-5 | |
373 | 6006/tcp x11-6 | |
374 | 6006/udp x11-6 | |
375 | 6007/tcp x11-7 | |
376 | 6007/udp x11-7 | |
377 | 6346/tcp gnutella-svc | |
378 | 6346/udp gnutella-svc | |
379 | 6347/tcp gnutella-rtr | |
380 | 6347/udp gnutella-rtr | |
381 | 6444/tcp sge-qmaster | |
382 | 6444/udp sge-qmaster | |
383 | 6445/tcp sge-execd | |
384 | 6445/udp sge-execd | |
385 | 6446/tcp mysql-proxy | |
386 | 6446/udp mysql-proxy | |
387 | 7000/tcp afs3-fileserver | |
388 | 7000/udp afs3-fileserver | |
389 | 7001/tcp afs3-callback | |
390 | 7001/udp afs3-callback | |
391 | 7002/tcp afs3-prserver | |
392 | 7002/udp afs3-prserver | |
393 | 7003/tcp afs3-vlserver | |
394 | 7003/udp afs3-vlserver | |
395 | 7004/tcp afs3-kaserver | |
396 | 7004/udp afs3-kaserver | |
397 | 7005/tcp afs3-volser | |
398 | 7005/udp afs3-volser | |
399 | 7006/tcp afs3-errors | |
400 | 7006/udp afs3-errors | |
401 | 7007/tcp afs3-bos | |
402 | 7007/udp afs3-bos | |
403 | 7008/tcp afs3-update | |
404 | 7008/udp afs3-update | |
405 | 7009/tcp afs3-rmtsys | |
406 | 7009/udp afs3-rmtsys | |
407 | 7100/tcp font-service | |
408 | 7100/udp font-service | |
409 | 8080/tcp http-alt | |
410 | 8080/udp http-alt | |
411 | 9101/tcp bacula-dir | |
412 | 9101/udp bacula-dir | |
413 | 9102/tcp bacula-fd | |
414 | 9102/udp bacula-fd | |
415 | 9103/tcp bacula-sd | |
416 | 9103/udp bacula-sd | |
417 | 9667/tcp xmms2 | |
418 | 9667/udp xmms2 | |
419 | 10809/tcp nbd | |
420 | 10050/tcp zabbix-agent | |
421 | 10050/udp zabbix-agent | |
422 | 10051/tcp zabbix-trapper | |
423 | 10051/udp zabbix-trapper | |
424 | 10080/tcp amanda | |
425 | 10080/udp amanda | |
426 | 11112/tcp dicom | |
427 | 11371/tcp hkp | |
428 | 11371/udp hkp | |
429 | 13720/tcp bprd | |
430 | 13720/udp bprd | |
431 | 13721/tcp bpdbm | |
432 | 13721/udp bpdbm | |
433 | 13722/tcp bpjava-msvc | |
434 | 13722/udp bpjava-msvc | |
435 | 13724/tcp vnetd | |
436 | 13724/udp vnetd | |
437 | 13782/tcp bpcd | |
438 | 13782/udp bpcd | |
439 | 13783/tcp vopied | |
440 | 13783/udp vopied | |
441 | 17500/tcp db-lsp | |
442 | 22125/tcp dcap | |
443 | 22128/tcp gsidcap | |
444 | 22273/tcp wnn6 | |
445 | 22273/udp wnn6 | |
446 | 1/ddp rtmp | |
447 | 2/ddp nbp | |
448 | 4/ddp echo | |
449 | 6/ddp zip | |
450 | 750/udp kerberos4 | |
451 | 750/tcp kerberos4 | |
452 | 751/udp kerberos-master | |
453 | 751/tcp kerberos-master | |
454 | 752/udp passwd-server | |
455 | 754/tcp krb-prop | |
456 | 760/tcp krbupdate | |
457 | 901/tcp swat | |
458 | 1109/tcp kpop | |
459 | 2053/tcp knetd | |
460 | 2102/udp zephyr-srv | |
461 | 2103/udp zephyr-clt | |
462 | 2104/udp zephyr-hm | |
463 | 2105/tcp eklogin | |
464 | 2111/tcp kx | |
465 | 2121/tcp iprop | |
466 | 871/tcp supfilesrv | |
467 | 1127/tcp supfiledbg | |
468 | 98/tcp linuxconf | |
469 | 106/tcp poppassd | |
470 | 106/udp poppassd | |
471 | 775/tcp moira-db | |
472 | 777/tcp moira-update | |
473 | 779/udp moira-ureg | |
474 | 783/tcp spamd | |
475 | 808/tcp omirr | |
476 | 808/udp omirr | |
477 | 1001/tcp customs | |
478 | 1001/udp customs | |
479 | 1178/tcp skkserv | |
480 | 1210/udp predict | |
481 | 1236/tcp rmtcfg | |
482 | 1300/tcp wipld | |
483 | 1313/tcp xtel | |
484 | 1314/tcp xtelw | |
485 | 1529/tcp support | |
486 | 2003/tcp cfinger | |
487 | 2121/tcp frox | |
488 | 2150/tcp ninstall | |
489 | 2150/udp ninstall | |
490 | 2600/tcp zebrasrv | |
491 | 2601/tcp zebra | |
492 | 2602/tcp ripd | |
493 | 2603/tcp ripngd | |
494 | 2604/tcp ospfd | |
495 | 2605/tcp bgpd | |
496 | 2606/tcp ospf6d | |
497 | 2607/tcp ospfapi | |
498 | 2608/tcp isisd | |
499 | 2988/tcp afbackup | |
500 | 2988/udp afbackup | |
501 | 2989/tcp afmbackup | |
502 | 2989/udp afmbackup | |
503 | 4224/tcp xtell | |
504 | 4557/tcp fax | |
505 | 4559/tcp hylafax | |
506 | 4600/tcp distmp3 | |
507 | 4949/tcp munin | |
508 | 5051/tcp enbd-cstatd | |
509 | 5052/tcp enbd-sstatd | |
510 | 5151/tcp pcrd | |
511 | 5354/tcp noclog | |
512 | 5354/udp noclog | |
513 | 5355/tcp hostmon | |
514 | 5355/udp hostmon | |
515 | 5555/udp rplay | |
516 | 5666/tcp nrpe | |
517 | 5667/tcp nsca | |
518 | 5674/tcp mrtd | |
519 | 5675/tcp bgpsim | |
520 | 5680/tcp canna | |
521 | 6514/tcp syslog-tls | |
522 | 6566/tcp sane-port | |
523 | 6667/tcp ircd | |
524 | 8021/tcp zope-ftp | |
525 | 8081/tcp tproxy | |
526 | 8088/tcp omniorb | |
527 | 8088/udp omniorb | |
528 | 8990/tcp clc-build-daemon | |
529 | 9098/tcp xinetd | |
530 | 9359/udp mandelspawn | |
531 | 9418/tcp git | |
532 | 9673/tcp zope | |
533 | 10000/tcp webmin | |
534 | 10081/tcp kamanda | |
535 | 10081/udp kamanda | |
536 | 10082/tcp amandaidx | |
537 | 10083/tcp amidxtape | |
538 | 11201/tcp smsqp | |
539 | 11201/udp smsqp | |
540 | 15345/tcp xpilot | |
541 | 15345/udp xpilot | |
542 | 17001/udp sgi-cmsd | |
543 | 17002/udp sgi-crsd | |
544 | 17003/udp sgi-gcd | |
545 | 17004/tcp sgi-cad | |
546 | 20011/tcp isdnlog | |
547 | 20011/udp isdnlog | |
548 | 20012/tcp vboxd | |
549 | 20012/udp vboxd | |
550 | 24554/tcp binkp | |
551 | 27374/tcp asp | |
552 | 27374/udp asp | |
553 | 30865/tcp csync2 | |
554 | 57000/tcp dircproxy | |
555 | 60177/tcp tfido | |
556 | 60179/tcp fido | |
557 | 1027/udp Native IPv6 behind IPv4-to-IPv4 NAT Customer Premises Equipment (6a44) | |
558 | 1058/tcp nim, IBM AIX Network Installation Manager (NIM) | |
559 | 1058/udp nim, IBM AIX Network Installation Manager (NIM) | |
560 | 1059/tcp nimreg, IBM AIX Network Installation Manager (NIM) | |
561 | 1059/udp nimreg, IBM AIX Network Installation Manager (NIM) | |
562 | 1080/tcp SOCKS proxy | |
563 | 1080/udp SOCKS proxy | |
564 | 1085/tcp WebObjects | |
565 | 1085/udp WebObjects | |
566 | 1098/tcp rmiactivation, Java remote method invocation (RMI) activation | |
567 | 1098/udp rmiactivation, Java remote method invocation (RMI) activation | |
568 | 1099/tcp rmiregistry, Java remote method invocation (RMI) registry | |
569 | 1099/assigned rmiregistry, Java remote method invocation (RMI) registry | |
570 | 1119/tcp Battle.net chat/game protocol, used by Blizzard's games | |
571 | 1119/udp Battle.net chat/game protocol, used by Blizzard's games | |
572 | 1167/udp Cisco IP SLA (Service Assurance Agent) | |
573 | 1167/tcp Cisco IP SLA (Service Assurance Agent) | |
574 | 1194/udp OpenVPN | |
575 | 1194/tcp OpenVPN | |
576 | 1198/udp The cajo project Free dynamic transparent distributed computing in Java | |
577 | 1198/tcp The cajo project Free dynamic transparent distributed computing in Java | |
578 | 1214/udp Kazaa | |
579 | 1214/tcp Kazaa | |
580 | 1234/udp Infoseek search agent | |
581 | 1234/tcp Infoseek search agent | |
582 | 1241/udp Nessus Security Scanner | |
583 | 1241/tcp Nessus Security Scanner | |
584 | 1270/udp Microsoft System Center Operations Manager (SCOM) (formerly Microsoft Operations Manager (MOM)) agent | |
585 | 1270/tcp Microsoft System Center Operations Manager (SCOM) (formerly Microsoft Operations Manager (MOM)) agent | |
586 | 1293/udp Internet Protocol Security (IPSec) | |
587 | 1293/tcp Internet Protocol Security (IPSec) | |
588 | 1311/udp Windows RxMon.exe | |
589 | 1311/tcp Windows RxMon.exe | |
590 | 1341/udp Qubes (Manufacturing Execution System) | |
591 | 1341/tcp Qubes (Manufacturing Execution System) | |
592 | 1344/udp Internet Content Adaptation Protocol | |
593 | 1344/tcp Internet Content Adaptation Protocol | |
594 | 1352/udp IBM Lotus Notes/Domino (RPC) protocol | |
595 | 1352/tcp IBM Lotus Notes/Domino (RPC) protocol | |
596 | 1360/udp Mimer SQL | |
597 | 1360/tcp Mimer SQL | |
598 | 1414/udp IBM WebSphere MQ (formerly known as MQSeries) | |
599 | 1414/tcp IBM WebSphere MQ (formerly known as MQSeries) | |
600 | 1417/udp Timbuktu Service 1 Port | |
601 | 1417/tcp Timbuktu Service 1 Port | |
602 | 1418/udp Timbuktu Service 2 Port | |
603 | 1418/tcp Timbuktu Service 2 Port | |
604 | 1419/udp Timbuktu Service 3 Port | |
605 | 1419/tcp Timbuktu Service 3 Port | |
606 | 1420/udp Timbuktu Service 4 Port | |
607 | 1420/tcp Timbuktu Service 4 Port | |
608 | 1433/udp Microsoft SQL Server database management system (MSSQL) server | |
609 | 1433/tcp Microsoft SQL Server database management system (MSSQL) server | |
610 | 1434/udp Microsoft SQL Server database management system (MSSQL) monitor | |
611 | 1434/tcp Microsoft SQL Server database management system (MSSQL) monitor | |
612 | 1512/udp Microsoft's Windows Internet Name Service (WINS) | |
613 | 1512/tcp Microsoft's Windows Internet Name Service (WINS) | |
614 | 1521/udp nCUBE License Manager | |
615 | 1521/tcp nCUBE License Manager | |
616 | 1524/udp ingreslock, ingres | |
617 | 1524/tcp ingreslock, ingres | |
618 | 1527/udp Oracle Net Services, formerly known as SQL*Net | |
619 | 1527/tcp Oracle Net Services, formerly known as SQL*Net | |
620 | 1533/udp IBM Sametime Virtual Places Chat | |
621 | 1533/tcp IBM Sametime Virtual Places Chat | |
622 | 1547/udp Laplink | |
623 | 1547/tcp Laplink | |
624 | 1581/udp MIL STD 2045-47001 VMF | |
625 | 1581/tcp MIL STD 2045-47001 VMF | |
626 | 1589/udp Cisco VLAN Query Protocol (VQP) | |
627 | 1589/tcp Cisco VLAN Query Protocol (VQP) | |
628 | 1628/udp LonTalk normal | |
629 | 1628/tcp LonTalk normal | |
630 | 1629/udp LonTalk urgent | |
631 | 1629/tcp LonTalk urgent | |
632 | 1677/udp Novell GroupWise clients in client/server access mode | |
633 | 1677/tcp Novell GroupWise clients in client/server access mode | |
634 | 1701/udp Layer 2 Forwarding Protocol (L2F) | |
635 | 1701/tcp Layer 2 Forwarding Protocol (L2F) | |
636 | 1701/udp Layer 2 Tunneling Protocol (L2TP) | |
637 | 1701/assigned Layer 2 Tunneling Protocol (L2TP) | |
638 | 1707/udp Windward Studios games (vdmplay) | |
639 | 1707/tcp Windward Studios games (vdmplay) | |
640 | 1719/udp H.323 registration and alternate communication | |
641 | 1719/tcp H.323 registration and alternate communication | |
642 | 1720/udp H.323 call signaling | |
643 | 1720/tcp H.323 call signaling | |
644 | 1755/udp Microsoft Media Services (MMS, ms-streaming) | |
645 | 1755/tcp Microsoft Media Services (MMS, ms-streaming) | |
646 | 1801/udp Microsoft Message Queuing | |
647 | 1801/tcp Microsoft Message Queuing | |
648 | 1812/udp RADIUS authentication protocol, radius | |
649 | 1812/tcp RADIUS authentication protocol, radius | |
650 | 1813/udp RADIUS accounting protocol, radius-acct | |
651 | 1813/tcp RADIUS accounting protocol, radius-acct | |
652 | 1863/udp Microsoft Notification Protocol (MSNP), used by the Microsoft Messenger service and a number of instant messaging Messenger clients | |
653 | 1863/tcp Microsoft Notification Protocol (MSNP), used by the Microsoft Messenger service and a number of instant messaging Messenger clients | |
654 | 1883/udp MQTT (formerly MQ Telemetry Transport) | |
655 | 1883/tcp MQTT (formerly MQ Telemetry Transport) | |
656 | 1900/udp Simple Service Discovery Protocol (SSDP), discovery of UPnP devices | |
657 | 1900/assigned Simple Service Discovery Protocol (SSDP), discovery of UPnP devices | |
658 | 1935/udp Macromedia Flash Communications Server MX, the precursor to Adobe Flash Media Server before Macromedia's acquisition by Adobe on December 3, 2005 | |
659 | 1935/tcp Macromedia Flash Communications Server MX, the precursor to Adobe Flash Media Server before Macromedia's acquisition by Adobe on December 3, 2005 | |
660 | 1970/udp Netop Remote Control | |
661 | 1970/tcp Netop Remote Control | |
662 | 1972/udp InterSystems Caché | |
663 | 1972/tcp InterSystems Caché | |
664 | 1984/udp Big Brother | |
665 | 1984/tcp Big Brother | |
666 | 1985/udp Cisco Hot Standby Router Protocol (HSRP) | |
667 | 1985/assigned Cisco Hot Standby Router Protocol (HSRP) | |
668 | 1998/udp Cisco X.25 over TCP (XOT) service | |
669 | 1998/tcp Cisco X.25 over TCP (XOT) service | |
670 | 2000/udp Cisco Skinny Client Control Protocol (SCCP) | |
671 | 2000/tcp Cisco Skinny Client Control Protocol (SCCP) | |
672 | 2080/udp Autodesk NLM (FLEXlm) | |
673 | 2080/tcp Autodesk NLM (FLEXlm) | |
674 | 2083/udp Secure RADIUS Service (radsec) | |
675 | 2083/tcp Secure RADIUS Service (radsec) | |
676 | 2086/udp GNUnet | |
677 | 2086/tcp GNUnet | |
678 | 2102/udp Zephyr Notification Service server | |
679 | 2102/tcp Zephyr Notification Service server | |
680 | 2103/udp Zephyr Notification Service serv-hm connection | |
681 | 2103/tcp Zephyr Notification Service serv-hm connection | |
682 | 2104/udp Zephyr Notification Service hostmanager | |
683 | 2104/tcp Zephyr Notification Service hostmanager | |
684 | 2123/udp GTP control messages (GTP-C) | |
685 | 2123/tcp GTP control messages (GTP-C) | |
686 | 2142/udp TDMoIP (TDM over IP) | |
687 | 2142/tcp TDMoIP (TDM over IP) | |
688 | 2152/udp GTP user data messages (GTP-U) | |
689 | 2152/tcp GTP user data messages (GTP-U) | |
690 | 2159/udp GDB remote debug port | |
691 | 2159/tcp GDB remote debug port | |
692 | 2181/udp EForward-document transport system | |
693 | 2181/tcp EForward-document transport system | |
694 | 2210/udp NOAAPORT Broadcast Network | |
695 | 2210/tcp NOAAPORT Broadcast Network | |
696 | 2211/udp EMWIN | |
697 | 2211/tcp EMWIN | |
698 | 2222/udp EtherNet/IP implicit messaging for IO data | |
699 | 2222/tcp EtherNet/IP implicit messaging for IO data | |
700 | 2261/udp CoMotion master | |
701 | 2261/tcp CoMotion master | |
702 | 2262/udp CoMotion backup | |
703 | 2262/tcp CoMotion backup | |
704 | 2266/udp M-Files | |
705 | 2266/tcp M-Files | |
706 | 2399/udp FileMaker Data Access Layer (ODBC/JDBC) | |
707 | 2399/tcp FileMaker Data Access Layer (ODBC/JDBC) | |
708 | 2401/udp CVS version control system password-based server | |
709 | 2401/tcp CVS version control system password-based server | |
710 | 2404/udp IEC 60870-5-104, used to send electric power telecontrol messages between two systems via directly connected data circuits | |
711 | 2404/tcp IEC 60870-5-104, used to send electric power telecontrol messages between two systems via directly connected data circuits | |
712 | 2427/udp Media Gateway Control Protocol (MGCP) media gateway | |
713 | 2427/tcp Media Gateway Control Protocol (MGCP) media gateway | |
714 | 2447/udp ovwdb—OpenView Network Node Manager (NNM) daemon | |
715 | 2447/tcp ovwdb—OpenView Network Node Manager (NNM) daemon | |
716 | 2483/udp Oracle database listening for insecure client connections to the listener, replaces port 1521 | |
717 | 2483/tcp Oracle database listening for insecure client connections to the listener, replaces port 1521 | |
718 | 2484/udp Oracle database listening for SSL client connections to the listener | |
719 | 2484/tcp Oracle database listening for SSL client connections to the listener | |
720 | 2535/udp Multicast Address Dynamic Client Allocation Protocol (MADCAP). All standard messages are UDP datagrams. | |
721 | 2535/tcp Multicast Address Dynamic Client Allocation Protocol (MADCAP). All standard messages are UDP datagrams. | |
722 | 2541/udp LonTalk/IP | |
723 | 2541/tcp LonTalk/IP | |
724 | 2546/udp EVault data protection services | |
725 | 2546/tcp EVault data protection services | |
726 | 2547/udp EVault data protection services | |
727 | 2547/tcp EVault data protection services | |
728 | 2548/udp EVault data protection services | |
729 | 2548/tcp EVault data protection services | |
730 | 2638/udp SQL Anywhere database server | |
731 | 2638/tcp SQL Anywhere database server | |
732 | 2727/udp Media Gateway Control Protocol (MGCP) media gateway controller (call agent) | |
733 | 2727/tcp Media Gateway Control Protocol (MGCP) media gateway controller (call agent) | |
734 | 2809/udp corbaloc:iiop URL, per the CORBA 3.0.3 specification | |
735 | 2809/tcp corbaloc:iiop URL, per the CORBA 3.0.3 specification | |
736 | 2811/udp gsi ftp, per the GridFTP specification | |
737 | 2811/tcp gsi ftp, per the GridFTP specification | |
738 | 2944/udp Megaco text H.248 | |
739 | 2944/tcp Megaco text H.248 | |
740 | 2945/udp Megaco binary (ASN.1) H.248 | |
741 | 2945/tcp Megaco binary (ASN.1) H.248 | |
742 | 2947/udp gpsd, GPS daemon | |
743 | 2947/tcp gpsd, GPS daemon | |
744 | 2948/udp WAP push Multimedia Messaging Service (MMS) | |
745 | 2948/tcp WAP push Multimedia Messaging Service (MMS) | |
746 | 2949/udp WAP push secure (MMS) | |
747 | 2949/tcp WAP push secure (MMS) | |
748 | 2967/udp Symantec System Center agent (SSC-AGENT) | |
749 | 2967/tcp Symantec System Center agent (SSC-AGENT) | |
750 | 3020/udp Common Internet File System (CIFS). See also port 445 for Server Message Block (SMB), a dialect of CIFS. | |
751 | 3020/tcp Common Internet File System (CIFS). See also port 445 for Server Message Block (SMB), a dialect of CIFS. | |
752 | 3050/udp gds-db (Interbase/Firebird databases) | |
753 | 3050/tcp gds-db (Interbase/Firebird databases) | |
754 | 3052/udp APC PowerChute Network | |
755 | 3052/tcp APC PowerChute Network | |
756 | 3074/udp Xbox LIVE and Games for Windows – Live | |
757 | 3074/tcp Xbox LIVE and Games for Windows – Live | |
758 | 3225/udp Fibre Channel over IP (FCIP) | |
759 | 3225/tcp Fibre Channel over IP (FCIP) | |
760 | 3233/udp WhiskerControl research control protocol | |
761 | 3233/tcp WhiskerControl research control protocol | |
762 | 3260/udp iSCSI | |
763 | 3260/tcp iSCSI | |
764 | 3268/udp msft-gc, Microsoft Global Catalog (LDAP service which contains data from Active Directory forests) | |
765 | 3268/tcp msft-gc, Microsoft Global Catalog (LDAP service which contains data from Active Directory forests) | |
766 | 3269/udp msft-gc-ssl, Microsoft Global Catalog over SSL (similar to port 3268, LDAP over SSL) | |
767 | 3269/tcp msft-gc-ssl, Microsoft Global Catalog over SSL (similar to port 3268, LDAP over SSL) | |
768 | 3283/udp Net Assistant, a predecessor to Apple Remote Desktop | |
769 | 3283/tcp Net Assistant, a predecessor to Apple Remote Desktop | |
770 | 3305/udp Odette File Transfer Protocol (OFTP) | |
771 | 3305/tcp Odette File Transfer Protocol (OFTP) | |
772 | 3386/udp GTP' 3GPP GSM/UMTS CDR logging protocol | |
773 | 3386/tcp GTP' 3GPP GSM/UMTS CDR logging protocol | |
774 | 3389/udp Microsoft Terminal Server (RDP) officially registered as Windows Based Terminal (WBT) | |
775 | 3389/tcp Microsoft Terminal Server (RDP) officially registered as Windows Based Terminal (WBT) | |
776 | 3396/udp Novell NDPS Printer Agent | |
777 | 3396/tcp Novell NDPS Printer Agent | |
778 | 3412/udp xmlBlaster | |
779 | 3412/tcp xmlBlaster | |
780 | 3455/udp Resource Reservation Protocol (RSVP) | |
781 | 3455/tcp Resource Reservation Protocol (RSVP) | |
782 | 3478/udp STUN, a protocol for NAT traversal | |
783 | 3478/tcp STUN, a protocol for NAT traversal | |
784 | 3478/udp TURN, a protocol for NAT traversal (extension to STUN) | |
785 | 3478/tcp TURN, a protocol for NAT traversal (extension to STUN) | |
786 | 3478/udp STUN Behavior Discovery. See also port 5349. | |
787 | 3478/tcp STUN Behavior Discovery. See also port 5349. | |
788 | 3493/udp Network UPS Tools (NUT) | |
789 | 3493/tcp Network UPS Tools (NUT) | |
790 | 3516/udp Smartcard Port | |
791 | 3516/tcp Smartcard Port | |
792 | 3645/udp Cyc | |
793 | 3645/tcp Cyc | |
794 | 3659/udp Apple SASL, used by Mac OS X Server Password Server | |
795 | 3659/tcp Apple SASL, used by Mac OS X Server Password Server | |
796 | 3667/udp Information Exchange | |
797 | 3667/tcp Information Exchange | |
798 | 3690/udp Subversion (SVN) version control system | |
799 | 3690/tcp Subversion (SVN) version control system | |
800 | 3702/udp Web Services Dynamic Discovery (WS-Discovery), used by various components of Windows Vista and later | |
801 | 3702/tcp Web Services Dynamic Discovery (WS-Discovery), used by various components of Windows Vista and later | |
802 | 3724/udp Some Blizzard games | |
803 | 3724/tcp Some Blizzard games | |
804 | 3725/udp Netia NA-ER Port | |
805 | 3725/tcp Netia NA-ER Port | |
806 | 3768/udp RBLcheckd server daemon | |
807 | 3768/tcp RBLcheckd server daemon | |
808 | 3804/udp Harman Professional HiQnet protocol | |
809 | 3804/tcp Harman Professional HiQnet protocol | |
810 | 3826/udp WarMUX game server | |
811 | 3826/tcp WarMUX game server | |
812 | 3830/udp System Management Agent, developed and used by Cerner to monitor and manage solutions | |
813 | 3830/tcp System Management Agent, developed and used by Cerner to monitor and manage solutions | |
814 | 3880/udp IGRS | |
815 | 3880/tcp IGRS | |
816 | 3999/udp Norman distributed scanning service | |
817 | 3999/tcp Norman distributed scanning service | |
818 | 4018/udp Protocol information and warnings | |
819 | 4018/tcp Protocol information and warnings | |
820 | 4089/udp OpenCORE Remote Control Service | |
821 | 4089/tcp OpenCORE Remote Control Service | |
822 | 4090/udp Kerio | |
823 | 4090/tcp Kerio | |
824 | 4093/udp PxPlus Client server interface ProvideX | |
825 | 4093/tcp PxPlus Client server interface ProvideX | |
826 | 4096/udp Ascom Timeplex Bridge Relay Element (BRE) | |
827 | 4096/tcp Ascom Timeplex Bridge Relay Element (BRE) | |
828 | 4105/udp Shofar (ShofarNexus) | |
829 | 4105/tcp Shofar (ShofarNexus) | |
830 | 4116/udp Smartcard-TLS | |
831 | 4116/tcp Smartcard-TLS | |
832 | 4172/udp Teradici PCoIP | |
833 | 4172/tcp Teradici PCoIP | |
834 | 4303/udp Simple Railroad Command Protocol (SRCP) | |
835 | 4303/tcp Simple Railroad Command Protocol (SRCP) | |
836 | 4486/udp Integrated Client Message Service (ICMS) | |
837 | 4486/tcp Integrated Client Message Service (ICMS) | |
838 | 4500/udp IPSec NAT Traversal (RFC 3947, RFC 4306) | |
839 | 4500/assigned IPSec NAT Traversal (RFC 3947, RFC 4306) | |
840 | 4662/udp OrbitNet Message Service | |
841 | 4662/tcp OrbitNet Message Service | |
842 | 4730/udp Gearman's job server | |
843 | 4730/tcp Gearman's job server | |
844 | 4739/udp IP Flow Information Export | |
845 | 4739/tcp IP Flow Information Export | |
846 | 4753/udp SIMON (service and discovery) | |
847 | 4753/tcp SIMON (service and discovery) | |
848 | 4840/udp OPC UA Connection Protocol (TCP) and OPC UA Multicast Datagram Protocol (UDP) for OPC Unified Architecture from OPC Foundation | |
849 | 4840/tcp OPC UA Connection Protocol (TCP) and OPC UA Multicast Datagram Protocol (UDP) for OPC Unified Architecture from OPC Foundation | |
850 | 4843/udp OPC UA TCP Protocol over TLS/SSL for OPC Unified Architecture from OPC Foundation | |
851 | 4843/tcp OPC UA TCP Protocol over TLS/SSL for OPC Unified Architecture from OPC Foundation | |
852 | 4847/udp Web Fresh Communication, Quadrion Software & Odorless Entertainment | |
853 | 4847/tcp Web Fresh Communication, Quadrion Software & Odorless Entertainment | |
854 | 4894/udp LysKOM Protocol A | |
855 | 4894/tcp LysKOM Protocol A | |
856 | 4950/udp Cylon Controls UC32 Communications Port | |
857 | 4950/tcp Cylon Controls UC32 Communications Port | |
858 | 5010/udp Registered to: TelePath (the IBM FlowMark workflow-management system messaging platform). The TCP port is now used for: IBM WebSphere MQ Workflow | |
859 | 5010/tcp Registered to: TelePath (the IBM FlowMark workflow-management system messaging platform). The TCP port is now used for: IBM WebSphere MQ Workflow | |
860 | 5011/udp TelePath (the IBM FlowMark workflow-management system messaging platform) | |
861 | 5011/tcp TelePath (the IBM FlowMark workflow-management system messaging platform) | |
862 | 5025/udp scpi-raw Standard Commands for Programmable Instruments | |
863 | 5025/tcp scpi-raw Standard Commands for Programmable Instruments | |
864 | 5060/udp Session Initiation Protocol (SIP) | |
865 | 5060/tcp Session Initiation Protocol (SIP) | |
866 | 5062/udp Localisation access | |
867 | 5062/tcp Localisation access | |
868 | 5064/udp EPICS Channel Access server | |
869 | 5064/tcp EPICS Channel Access server | |
870 | 5065/udp EPICS Channel Access repeater beacon | |
871 | 5065/tcp EPICS Channel Access repeater beacon | |
872 | 5084/udp EPCglobal Low Level Reader Protocol (LLRP) | |
873 | 5084/tcp EPCglobal Low Level Reader Protocol (LLRP) | |
874 | 5085/udp EPCglobal Low Level Reader Protocol (LLRP) over TLS | |
875 | 5085/tcp EPCglobal Low Level Reader Protocol (LLRP) over TLS | |
876 | 5099/udp SafeNet, Inc Sentinel LM, Sentinel RMS, License Manager, server-to-server | |
877 | 5099/tcp SafeNet, Inc Sentinel LM, Sentinel RMS, License Manager, server-to-server | |
878 | 5150/udp ATMP Ascend Tunnel Management Protocol | |
879 | 5150/tcp ATMP Ascend Tunnel Management Protocol | |
880 | 5154/udp BZFlag | |
881 | 5154/tcp BZFlag | |
882 | 5190/udp AOL Instant Messenger protocol. The chat app is defunct as of 15 December 2017. | |
883 | 5190/tcp AOL Instant Messenger protocol. The chat app is defunct as of 15 December 2017. | |
884 | 5298/udp Extensible Messaging and Presence Protocol (XMPP) | |
885 | 5298/tcp Extensible Messaging and Presence Protocol (XMPP) | |
886 | 5310/udp Outlaws (1997 video game). Both UDP and TCP are reserved, but only UDP is used | |
887 | 5310/tcp Outlaws (1997 video game). Both UDP and TCP are reserved, but only UDP is used | |
888 | 5353/udp Multicast DNS (mDNS) | |
889 | 5353/assigned Multicast DNS (mDNS) | |
890 | 5355/udp Link-Local Multicast Name Resolution (LLMNR), allows hosts to perform name resolution for hosts on the same local link (only provided by Windows Vista and Server 2008) | |
891 | 5355/tcp Link-Local Multicast Name Resolution (LLMNR), allows hosts to perform name resolution for hosts on the same local link (only provided by Windows Vista and Server 2008) | |
892 | 5402/udp Multicast File Transfer Protocol (MFTP) | |
893 | 5402/tcp Multicast File Transfer Protocol (MFTP) | |
894 | 5405/udp NetSupport Manager | |
895 | 5405/tcp NetSupport Manager | |
896 | 5412/udp IBM Rational Synergy (Telelogic Synergy) (Continuus CM) Message Router | |
897 | 5412/tcp IBM Rational Synergy (Telelogic Synergy) (Continuus CM) Message Router | |
898 | 5413/udp Wonderware SuiteLink service | |
899 | 5413/tcp Wonderware SuiteLink service | |
900 | 5417/udp SNS Agent | |
901 | 5417/tcp SNS Agent | |
902 | 5421/udp NetSupport Manager | |
903 | 5421/tcp NetSupport Manager | |
904 | 5556/udp Freeciv, Oracle WebLogic Server Node Manager | |
905 | 5556/tcp Freeciv, Oracle WebLogic Server Node Manager | |
906 | 5568/udp Session Data Transport (SDT), a part of Architecture for Control Networks (ACN) | |
907 | 5568/tcp Session Data Transport (SDT), a part of Architecture for Control Networks (ACN) | |
908 | 5722/udp Microsoft RPC, DFSR (SYSVOL) Replication Service | |
909 | 5722/tcp Microsoft RPC, DFSR (SYSVOL) Replication Service | |
910 | 5741/udp IDA Discover Port 1 | |
911 | 5741/tcp IDA Discover Port 1 | |
912 | 5742/udp IDA Discover Port 2 | |
913 | 5742/tcp IDA Discover Port 2 | |
914 | 5900/udp Remote Frame Buffer protocol (RFB) | |
915 | 5900/tcp Remote Frame Buffer protocol (RFB) | |
916 | 5931/udp AMMYY admin Remote Control | |
917 | 5931/tcp AMMYY admin Remote Control | |
918 | 5984/udp CouchDB database server | |
919 | 5984/tcp CouchDB database server | |
920 | 6000/udp X11-used between an X client and server over the network | |
921 | 6000/tcp X11-used between an X client and server over the network | |
922 | 6001/udp X11-used between an X client and server over the network | |
923 | 6001/tcp X11-used between an X client and server over the network | |
924 | 6002/udp X11-used between an X client and server over the network | |
925 | 6002/tcp X11-used between an X client and server over the network | |
926 | 6003/udp X11-used between an X client and server over the network | |
927 | 6003/tcp X11-used between an X client and server over the network | |
928 | 6004/udp X11-used between an X client and server over the network | |
929 | 6004/tcp X11-used between an X client and server over the network | |
930 | 6005/udp X11-used between an X client and server over the network | |
931 | 6005/tcp X11-used between an X client and server over the network | |
932 | 6006/udp X11-used between an X client and server over the network | |
933 | 6006/tcp X11-used between an X client and server over the network | |
934 | 6007/udp X11-used between an X client and server over the network | |
935 | 6007/tcp X11-used between an X client and server over the network | |
936 | 6008/udp X11-used between an X client and server over the network | |
937 | 6008/tcp X11-used between an X client and server over the network | |
938 | 6009/udp X11-used between an X client and server over the network | |
939 | 6009/tcp X11-used between an X client and server over the network | |
940 | 6010/udp X11-used between an X client and server over the network | |
941 | 6010/tcp X11-used between an X client and server over the network | |
942 | 6011/udp X11-used between an X client and server over the network | |
943 | 6011/tcp X11-used between an X client and server over the network | |
944 | 6012/udp X11-used between an X client and server over the network | |
945 | 6012/tcp X11-used between an X client and server over the network | |
946 | 6013/udp X11-used between an X client and server over the network | |
947 | 6013/tcp X11-used between an X client and server over the network | |
948 | 6014/udp X11-used between an X client and server over the network | |
949 | 6014/tcp X11-used between an X client and server over the network | |
950 | 6015/udp X11-used between an X client and server over the network | |
951 | 6015/tcp X11-used between an X client and server over the network | |
952 | 6016/udp X11-used between an X client and server over the network | |
953 | 6016/tcp X11-used between an X client and server over the network | |
954 | 6017/udp X11-used between an X client and server over the network | |
955 | 6017/tcp X11-used between an X client and server over the network | |
956 | 6018/udp X11-used between an X client and server over the network | |
957 | 6018/tcp X11-used between an X client and server over the network | |
958 | 6019/udp X11-used between an X client and server over the network | |
959 | 6019/tcp X11-used between an X client and server over the network | |
960 | 6020/udp X11-used between an X client and server over the network | |
961 | 6020/tcp X11-used between an X client and server over the network | |
962 | 6021/udp X11-used between an X client and server over the network | |
963 | 6021/tcp X11-used between an X client and server over the network | |
964 | 6022/udp X11-used between an X client and server over the network | |
965 | 6022/tcp X11-used between an X client and server over the network | |
966 | 6023/udp X11-used between an X client and server over the network | |
967 | 6023/tcp X11-used between an X client and server over the network | |
968 | 6024/udp X11-used between an X client and server over the network | |
969 | 6024/tcp X11-used between an X client and server over the network | |
970 | 6025/udp X11-used between an X client and server over the network | |
971 | 6025/tcp X11-used between an X client and server over the network | |
972 | 6026/udp X11-used between an X client and server over the network | |
973 | 6026/tcp X11-used between an X client and server over the network | |
974 | 6027/udp X11-used between an X client and server over the network | |
975 | 6027/tcp X11-used between an X client and server over the network | |
976 | 6028/udp X11-used between an X client and server over the network | |
977 | 6028/tcp X11-used between an X client and server over the network | |
978 | 6029/udp X11-used between an X client and server over the network | |
979 | 6029/tcp X11-used between an X client and server over the network | |
980 | 6030/udp X11-used between an X client and server over the network | |
981 | 6030/tcp X11-used between an X client and server over the network | |
982 | 6031/udp X11-used between an X client and server over the network | |
983 | 6031/tcp X11-used between an X client and server over the network | |
984 | 6032/udp X11-used between an X client and server over the network | |
985 | 6032/tcp X11-used between an X client and server over the network | |
986 | 6033/udp X11-used between an X client and server over the network | |
987 | 6033/tcp X11-used between an X client and server over the network | |
988 | 6034/udp X11-used between an X client and server over the network | |
989 | 6034/tcp X11-used between an X client and server over the network | |
990 | 6035/udp X11-used between an X client and server over the network | |
991 | 6035/tcp X11-used between an X client and server over the network | |
992 | 6036/udp X11-used between an X client and server over the network | |
993 | 6036/tcp X11-used between an X client and server over the network | |
994 | 6037/udp X11-used between an X client and server over the network | |
995 | 6037/tcp X11-used between an X client and server over the network | |
996 | 6038/udp X11-used between an X client and server over the network | |
997 | 6038/tcp X11-used between an X client and server over the network | |
998 | 6039/udp X11-used between an X client and server over the network | |
999 | 6039/tcp X11-used between an X client and server over the network | |
1000 | 6040/udp X11-used between an X client and server over the network | |
1001 | 6040/tcp X11-used between an X client and server over the network | |
1002 | 6041/udp X11-used between an X client and server over the network | |
1003 | 6041/tcp X11-used between an X client and server over the network | |
1004 | 6042/udp X11-used between an X client and server over the network | |
1005 | 6042/tcp X11-used between an X client and server over the network | |
1006 | 6043/udp X11-used between an X client and server over the network | |
1007 | 6043/tcp X11-used between an X client and server over the network | |
1008 | 6044/udp X11-used between an X client and server over the network | |
1009 | 6044/tcp X11-used between an X client and server over the network | |
1010 | 6045/udp X11-used between an X client and server over the network | |
1011 | 6045/tcp X11-used between an X client and server over the network | |
1012 | 6046/udp X11-used between an X client and server over the network | |
1013 | 6046/tcp X11-used between an X client and server over the network | |
1014 | 6047/udp X11-used between an X client and server over the network | |
1015 | 6047/tcp X11-used between an X client and server over the network | |
1016 | 6048/udp X11-used between an X client and server over the network | |
1017 | 6048/tcp X11-used between an X client and server over the network | |
1018 | 6049/udp X11-used between an X client and server over the network | |
1019 | 6049/tcp X11-used between an X client and server over the network | |
1020 | 6050/udp X11-used between an X client and server over the network | |
1021 | 6050/tcp X11-used between an X client and server over the network | |
1022 | 6051/udp X11-used between an X client and server over the network | |
1023 | 6051/tcp X11-used between an X client and server over the network | |
1024 | 6052/udp X11-used between an X client and server over the network | |
1025 | 6052/tcp X11-used between an X client and server over the network | |
1026 | 6053/udp X11-used between an X client and server over the network | |
1027 | 6053/tcp X11-used between an X client and server over the network | |
1028 | 6054/udp X11-used between an X client and server over the network | |
1029 | 6054/tcp X11-used between an X client and server over the network | |
1030 | 6055/udp X11-used between an X client and server over the network | |
1031 | 6055/tcp X11-used between an X client and server over the network | |
1032 | 6056/udp X11-used between an X client and server over the network | |
1033 | 6056/tcp X11-used between an X client and server over the network | |
1034 | 6057/udp X11-used between an X client and server over the network | |
1035 | 6057/tcp X11-used between an X client and server over the network | |
1036 | 6058/udp X11-used between an X client and server over the network | |
1037 | 6058/tcp X11-used between an X client and server over the network | |
1038 | 6059/udp X11-used between an X client and server over the network | |
1039 | 6059/tcp X11-used between an X client and server over the network | |
1040 | 6060/udp X11-used between an X client and server over the network | |
1041 | 6060/tcp X11-used between an X client and server over the network | |
1042 | 6061/udp X11-used between an X client and server over the network | |
1043 | 6061/tcp X11-used between an X client and server over the network | |
1044 | 6062/udp X11-used between an X client and server over the network | |
1045 | 6062/tcp X11-used between an X client and server over the network | |
1046 | 6063/udp X11-used between an X client and server over the network | |
1047 | 6063/tcp X11-used between an X client and server over the network | |
1048 | 6110/udp softcm, HP Softbench CM | |
1049 | 6110/tcp softcm, HP Softbench CM | |
1050 | 6111/udp spc, HP Softbench Sub-Process Control | |
1051 | 6111/tcp spc, HP Softbench Sub-Process Control | |
1052 | 6112/udp dtspcd, execute commands and launch applications remotely | |
1053 | 6112/tcp dtspcd, execute commands and launch applications remotely | |
1054 | 6346/udp gnutella-svc, gnutella (FrostWire, Limewire, Shareaza, etc.) | |
1055 | 6346/tcp gnutella-svc, gnutella (FrostWire, Limewire, Shareaza, etc.) | |
1056 | 6347/udp gnutella-rtr, Gnutella alternate | |
1057 | 6347/tcp gnutella-rtr, Gnutella alternate | |
1058 | 6350/udp App Discovery and Access Protocol | |
1059 | 6350/tcp App Discovery and Access Protocol | |
1060 | 6444/udp Sun Grid Engine Qmaster Service | |
1061 | 6444/tcp Sun Grid Engine Qmaster Service | |
1062 | 6445/udp Sun Grid Engine Execution Service | |
1063 | 6445/tcp Sun Grid Engine Execution Service | |
1064 | 6464/udp Port assignment for medical device communication in accordance to IEEE 11073-20701 | |
1065 | 6464/tcp Port assignment for medical device communication in accordance to IEEE 11073-20701 | |
1066 | 6515/udp Elipse RPC Protocol (REC) | |
1067 | 6515/tcp Elipse RPC Protocol (REC) | |
1068 | 6619/udp odette-ftps, Odette File Transfer Protocol (OFTP) over TLS/SSL | |
1069 | 6619/tcp odette-ftps, Odette File Transfer Protocol (OFTP) over TLS/SSL | |
1070 | 6622/udp Multicast FTP | |
1071 | 6622/tcp Multicast FTP | |
1072 | 6679/udp Osorno Automation Protocol (OSAUT) | |
1073 | 6679/tcp Osorno Automation Protocol (OSAUT) | |
1074 | 6888/udp MUSE | |
1075 | 6888/tcp MUSE | |
1076 | 6969/udp acmsoda | |
1077 | 6969/tcp acmsoda | |
1078 | 7262/udp CNAP (Calypso Network Access Protocol) | |
1079 | 7262/tcp CNAP (Calypso Network Access Protocol) | |
1080 | 7272/udp WatchMe - WatchMe Monitoring | |
1081 | 7272/tcp WatchMe - WatchMe Monitoring | |
1082 | 7400/udp RTPS (Real Time Publish Subscribe) DDS Discovery | |
1083 | 7400/tcp RTPS (Real Time Publish Subscribe) DDS Discovery | |
1084 | 7401/udp RTPS (Real Time Publish Subscribe) DDS User-Traffic | |
1085 | 7401/tcp RTPS (Real Time Publish Subscribe) DDS User-Traffic | |
1086 | 7402/udp RTPS (Real Time Publish Subscribe) DDS Meta-Traffic | |
1087 | 7402/tcp RTPS (Real Time Publish Subscribe) DDS Meta-Traffic | |
1088 | 7542/udp Saratoga file transfer protocol | |
1089 | 7542/tcp Saratoga file transfer protocol | |
1090 | 7547/udp CPE WAN Management Protocol (CWMP) Technical Report 069 | |
1091 | 7547/tcp CPE WAN Management Protocol (CWMP) Technical Report 069 | |
1092 | 7624/udp Instrument Neutral Distributed Interface | |
1093 | 7624/tcp Instrument Neutral Distributed Interface | |
1094 | 8008/udp Alternative port for HTTP. See also ports 80 and 8080. | |
1095 | 8008/tcp Alternative port for HTTP. See also ports 80 and 8080. | |
1096 | 8074/udp Gadu-Gadu | |
1097 | 8074/tcp Gadu-Gadu | |
1098 | 8080/udp Alternative port for HTTP. See also ports 80 and 8008. | |
1099 | 8080/tcp Alternative port for HTTP. See also ports 80 and 8008. | |
1100 | 8243/udp HTTPS listener for Apache Synapse | |
1101 | 8243/tcp HTTPS listener for Apache Synapse | |
1102 | 8280/udp HTTP listener for Apache Synapse | |
1103 | 8280/tcp HTTP listener for Apache Synapse | |
1104 | 8883/udp Secure MQTT (MQTT over TLS) | |
1105 | 8883/tcp Secure MQTT (MQTT over TLS) | |
1106 | 9001/udp ETL Service Manager | |
1107 | 9001/tcp ETL Service Manager | |
1108 | 9080/udp glrpc, Groove Collaboration software GLRPC | |
1109 | 9080/tcp glrpc, Groove Collaboration software GLRPC | |
1110 | 9101/udp Bacula Director | |
1111 | 9101/tcp Bacula Director | |
1112 | 9102/udp Bacula File Daemon | |
1113 | 9102/tcp Bacula File Daemon | |
1114 | 9103/udp Bacula Storage Daemon | |
1115 | 9103/tcp Bacula Storage Daemon | |
1116 | 9119/udp MXit Instant Messenger | |
1117 | 9119/tcp MXit Instant Messenger | |
1118 | 9389/udp adws, Microsoft AD DS Web Services, Powershell uses this port | |
1119 | 9389/tcp adws, Microsoft AD DS Web Services, Powershell uses this port | |
1120 | 9418/udp git, Git pack transfer service | |
1121 | 9418/tcp git, Git pack transfer service | |
1122 | 9535/udp mngsuite, LANDesk Management Suite Remote Control | |
1123 | 9535/tcp mngsuite, LANDesk Management Suite Remote Control | |
1124 | 9536/udp laes-bf, IP Fabrics Surveillance buffering function | |
1125 | 9536/tcp laes-bf, IP Fabrics Surveillance buffering function | |
1126 | 9800/udp WebDAV Source | |
1127 | 9800/tcp WebDAV Source | |
1128 | 10000/udp Network Data Management Protocol | |
1129 | 10000/tcp Network Data Management Protocol | |
1130 | 10050/udp Zabbix agent | |
1131 | 10050/tcp Zabbix agent | |
1132 | 10051/udp Zabbix trapper | |
1133 | 10051/tcp Zabbix trapper | |
1134 | 10110/udp NMEA 0183 Navigational Data. Transport of NMEA 0183 sentences over TCP or UDP | |
1135 | 10110/tcp NMEA 0183 Navigational Data. Transport of NMEA 0183 sentences over TCP or UDP | |
1136 | 11001/udp metasys ( Johnson Controls Metasys java AC control environment ) | |
1137 | 11001/tcp metasys ( Johnson Controls Metasys java AC control environment ) | |
1138 | 11112/udp ACR/NEMA Digital Imaging and Communications in Medicine (DICOM) | |
1139 | 11112/tcp ACR/NEMA Digital Imaging and Communications in Medicine (DICOM) | |
1140 | 11371/udp OpenPGP HTTP key server | |
1141 | 11371/tcp OpenPGP HTTP key server | |
1142 | 13720/udp Symantec NetBackup—bprd (formerly VERITAS) | |
1143 | 13720/tcp Symantec NetBackup—bprd (formerly VERITAS) | |
1144 | 13721/udp Symantec NetBackup—bpdbm (formerly VERITAS) | |
1145 | 13721/tcp Symantec NetBackup—bpdbm (formerly VERITAS) | |
1146 | 13724/udp Symantec Network Utility—vnetd (formerly VERITAS) | |
1147 | 13724/tcp Symantec Network Utility—vnetd (formerly VERITAS) | |
1148 | 13782/udp Symantec NetBackup—bpcd (formerly VERITAS) | |
1149 | 13782/tcp Symantec NetBackup—bpcd (formerly VERITAS) | |
1150 | 13783/udp Symantec VOPIED protocol (formerly VERITAS) | |
1151 | 13783/tcp Symantec VOPIED protocol (formerly VERITAS) | |
1152 | 13785/udp Symantec NetBackup Database—nbdb (formerly VERITAS) | |
1153 | 13785/tcp Symantec NetBackup Database—nbdb (formerly VERITAS) | |
1154 | 13786/udp Symantec nomdb (formerly VERITAS) | |
1155 | 13786/tcp Symantec nomdb (formerly VERITAS) | |
1156 | 15345/udp XPilot Contact | |
1157 | 15345/tcp XPilot Contact | |
1158 | 17500/udp Dropbox LanSync Protocol (db-lsp); used to synchronize file catalogs between Dropbox clients on a local network. | |
1159 | 17500/tcp Dropbox LanSync Protocol (db-lsp); used to synchronize file catalogs between Dropbox clients on a local network. | |
1160 | 19813/udp 4D database Client Server Communication | |
1161 | 19813/tcp 4D database Client Server Communication | |
1162 | 24465/udp Tonido Directory Server for Tonido which is a Personal Web App and P2P platform | |
1163 | 24465/tcp Tonido Directory Server for Tonido which is a Personal Web App and P2P platform | |
1164 | 24554/udp BINKP, Fidonet mail transfers over TCP/IP | |
1165 | 24554/tcp BINKP, Fidonet mail transfers over TCP/IP | |
1166 | 26000/udp id Software's Quake server | |
1167 | 26000/tcp id Software's Quake server | |
1168 | 27000/udp FlexNet Publisher's License server (from the range of default ports) | |
1169 | 27000/tcp FlexNet Publisher's License server (from the range of default ports) | |
1170 | 27001/udp FlexNet Publisher's License server (from the range of default ports) | |
1171 | 27001/tcp FlexNet Publisher's License server (from the range of default ports) | |
1172 | 27002/udp FlexNet Publisher's License server (from the range of default ports) | |
1173 | 27002/tcp FlexNet Publisher's License server (from the range of default ports) | |
1174 | 27003/udp FlexNet Publisher's License server (from the range of default ports) | |
1175 | 27003/tcp FlexNet Publisher's License server (from the range of default ports) | |
1176 | 27004/udp FlexNet Publisher's License server (from the range of default ports) | |
1177 | 27004/tcp FlexNet Publisher's License server (from the range of default ports) | |
1178 | 27005/udp FlexNet Publisher's License server (from the range of default ports) | |
1179 | 27005/tcp FlexNet Publisher's License server (from the range of default ports) | |
1180 | 27006/udp FlexNet Publisher's License server (from the range of default ports) | |
1181 | 27006/tcp FlexNet Publisher's License server (from the range of default ports) | |
1182 | 27007/udp FlexNet Publisher's License server (from the range of default ports) | |
1183 | 27007/tcp FlexNet Publisher's License server (from the range of default ports) | |
1184 | 27008/udp FlexNet Publisher's License server (from the range of default ports) | |
1185 | 27008/tcp FlexNet Publisher's License server (from the range of default ports) | |
1186 | 27009/udp FlexNet Publisher's License server (from the range of default ports) | |
1187 | 27009/tcp FlexNet Publisher's License server (from the range of default ports) | |
1188 | 33434/udp traceroute | |
1189 | 33434/tcp traceroute | |
1190 | 40000/udp SafetyNET p – a real-time Industrial Ethernet protocol | |
1191 | 40000/tcp SafetyNET p – a real-time Industrial Ethernet protocol | |
1192 | 44818/udp EtherNet/IP explicit messaging | |
1193 | 44818/tcp EtherNet/IP explicit messaging | |
1194 | 47808/udp BACnet Building Automation and Control Networks (4780810 = BAC016) | |
1195 | 47808/tcp BACnet Building Automation and Control Networks (4780810 = BAC016) | |
1196 | 49151/udp Reserved | |
1197 | 49151/tcp Reserved⏎ |
0 | websocket-client>=0.46.0 | |
0 | websocket-client>=0.54.0 | |
1 | 1 | autobahn>=17.10.1 |
2 | 2 | colorama>=0.3.9 |
3 | 3 | deprecation>=1.0.1 |
21 | 21 | sqlalchemy_schemadisplay>=1.3 |
22 | 22 | tqdm>=4.15.0 |
23 | 23 | twisted>=18.7.0 |
24 | webargs>=3.0.0 | |
24 | #webargs==5.0.0 fails with Python 2 | |
25 | webargs==4.4.1 | |
25 | 26 | marshmallow-sqlalchemy |
26 | 27 | git+https://github.com/infobyte/filteralchemy@dev#egg=filteralchemy |
27 | 28 | filedepot>=0.5.0 |
10 | 10 | threshold = 0.75 |
11 | 11 | min_weight = 0.3 |
12 | 12 | |
13 | """ | |
14 | APPLY_MS_REFS adds | |
15 | 'https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010' | |
16 | as refs to all vulnerabilities which name begins with 'MS17-010' | |
17 | and its creator is 'Nessus'. | |
18 | """ | |
19 | ||
13 | 20 | rules = [ |
14 | 21 | { |
15 | 'id': 'PARENT_TEST', | |
22 | 'id': 'APPLY_MS_REFS', | |
16 | 23 | 'model': 'Vulnerability', |
17 | 'parent': '192.168.1.18', | |
18 | 'object': "regex=^generic-", | |
19 | 'conditions': ["severity=info"], | |
20 | 'actions': ["--UPDATE:severity=critical"] | |
21 | }, | |
22 | { | |
23 | 'id': 'CIFRADO_DEBIL', | |
24 | 'model': 'Vulnerability', | |
25 | 'object': "name=EN-Cifrado%Débil%(SSL%weak%ciphers)", | |
26 | 'actions': ["--UPDATE:severity=info"] | |
27 | }, | |
28 | ||
29 | { | |
30 | 'id': 'CLIENT_TEST', | |
31 | 'model': 'Vulnerability', | |
32 | 'parent': '50.56.220.123', | |
33 | 'object': "regex=^Device", | |
34 | 'conditions': ["severity=info", "creator=Nessus regex=^OS"], | |
35 | 'actions': ["--UPDATE:severity=critical", "--UPDATE:confirmed=True"] | |
36 | }, | |
37 | ||
38 | { | |
39 | 'id': 'CLIENT_TEST_2', | |
40 | 'model': 'Vulnerability', | |
41 | 'parent': 'http', | |
42 | 'object': "regex=Email target=200.58.121.156", | |
43 | 'conditions': ["severity=info", "creator=Burp"], | |
44 | 'actions': ["--UPDATE:severity=med", "--UPDATE:confirmed=True"] | |
45 | }, | |
46 | ||
47 | { | |
48 | 'id': 'CLIENT_TEST_3', | |
49 | 'model': 'Vulnerability', | |
50 | 'parent': '320131ea90e3986c8221291c683d6d19bfe8503b', | |
51 | 'object': "creator=Nessus --old", | |
52 | 'conditions': ["severity=info", "creator=Nessus"], | |
53 | 'actions': ["--UPDATE:refs=VCritical", "--UPDATE:confirmed=True"] | |
54 | }, | |
55 | ||
56 | { | |
57 | 'id': 'CU1', | |
58 | 'model': 'Vulnerability', | |
59 | 'parent': '50.56.220.123', | |
60 | 'object': "severity=critical", | |
61 | 'actions': ["--UPDATE:severity=info"] | |
62 | }, | |
63 | ||
64 | { | |
65 | 'id': 'CU2', | |
66 | 'model': 'Vulnerability', | |
67 | 'parent': '50.56.220.123', | |
68 | 'object': "severity=info confirmed=True", | |
69 | 'actions': ["--EXECUTE:ls"] | |
70 | }, | |
71 | ||
72 | { | |
73 | 'id': 'CU3A', | |
74 | 'model': 'Vulnerability', | |
75 | 'fields': ['name'], | |
76 | 'actions': ["--UPDATE:confirmed=False"] | |
77 | }, | |
78 | ||
79 | { | |
80 | 'id': 'CU3B', | |
81 | 'model': 'Vulnerability', | |
82 | 'fields': ['name'], | |
83 | 'object': "--old", | |
84 | 'actions': ["--UPDATE:confirmed=True"] | |
85 | }, | |
86 | ||
87 | { | |
88 | 'id': 'CU4', | |
89 | 'model': 'Vulnerability', | |
90 | 'object': "name=Email%addresses%disclosed creator=Burp", | |
91 | 'actions': ["--UPDATE:refs=RefsX"] | |
92 | }, | |
93 | ||
94 | { | |
95 | 'id': 'CU4B', | |
96 | 'model': 'Vulnerability', | |
97 | 'object': "name=Email%addresses%disclosed creator=Burp", | |
98 | 'actions': ["--UPDATE:-refs=RefsY"] | |
99 | }, | |
100 | ||
101 | { | |
102 | 'id': 'CU5', | |
103 | 'model': 'Vulnerability', | |
104 | 'object': "name=OS%Identification", | |
105 | 'actions': ["--UPDATE:template=445"] | |
106 | }, | |
107 | ||
108 | { | |
109 | 'id': 'CU5B1', | |
110 | 'model': 'Vulnerability', | |
111 | 'object': "severity=critical", | |
112 | 'actions': ["--UPDATE:template=EN-Cifrado Debil (SSL weak ciphers)"] | |
113 | }, | |
114 | ||
115 | { | |
116 | 'id': 'CU5B', | |
117 | 'model': 'Vulnerability', | |
118 | 'object': "severity=critical", | |
119 | 'actions': ["--UPDATE:template=EN-Cifrado Debil (SSL weak ciphers)"] | |
120 | }, | |
121 | { | |
122 | 'id': 'CU6', | |
123 | 'model': 'Service', | |
124 | 'object': "name=http", | |
125 | 'actions': ["--UPDATE:owned=True"] | |
126 | }, | |
127 | { | |
128 | 'id': 'CU6B', | |
129 | 'model': 'Service', | |
130 | 'fields': ['name'], | |
131 | 'actions': ["--UPDATE:description=SET BY RULE"] | |
132 | }, | |
133 | ||
134 | { | |
135 | 'id': 'CU7', | |
136 | 'model': 'Host', | |
137 | 'object': "name=172.16.138.1", | |
138 | 'actions': ["--DELETE:"] | |
139 | }, | |
140 | ||
141 | { | |
142 | 'id': 'CU7B', | |
143 | 'model': 'Host', | |
144 | 'fields': ['name'], | |
145 | 'actions': ["--UPDATE:owned=True"] | |
24 | 'object': "regex=^MS17-010", | |
25 | 'conditions': ["creator=Nessus"], | |
26 | 'actions': ["--UPDATE:refs=https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010"] | |
146 | 27 | } |
147 | ||
148 | 28 | ] |
469 | 469 | for obj in objects: |
470 | 470 | for action in actions: |
471 | 471 | action = action.strip('--') |
472 | command, expression = action.split(':') | |
472 | array = action.split(':') | |
473 | command = array[0] | |
474 | expression = str(':').join(array[1:]) | |
473 | 475 | |
474 | 476 | if command == 'UPDATE': |
475 | key, value = expression.split('=') | |
477 | array_exp = expression.split('=') | |
478 | key = array_exp[0] | |
479 | value = str('=').join(array_exp[1:]) | |
476 | 480 | if obj.class_signature == 'VulnerabilityWeb' or obj.class_signature == 'Vulnerability': |
477 | 481 | if update_vulnerability(ws, obj, key, value, _server): |
478 | 482 | insert_rule(rule['id'], command, obj, _objs_value, fields=None, key=key, value=value) |
708 | 712 | os.remove(lockf) |
709 | 713 | exit(0) |
710 | 714 | |
711 | except Exception as errorMsg: | |
712 | logger.error(errorMsg) | |
713 | os.remove(lockf) | |
714 | exit(0) | |
715 | # except Exception as errorMsg: | |
716 | # logger.error(errorMsg) | |
717 | # os.remove(lockf) | |
718 | # exit(0) | |
715 | 719 | |
716 | 720 | |
717 | 721 | if __name__ == "__main__": |
0 | 0 | # Faraday Penetration Test IDE |
1 | 1 | # Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) |
2 | 2 | # See the file 'doc/LICENSE' for the license information |
3 | import datetime | |
4 | 3 | import time |
5 | 4 | from datetime import datetime |
6 | 5 | |
25 | 24 | workspace = PrimaryKeyRelatedField('name', dump_only=True) |
26 | 25 | |
27 | 26 | def load_itime(self, value): |
28 | return datetime.datetime.fromtimestamp(value) | |
27 | return datetime.fromtimestamp(value) | |
29 | 28 | |
30 | 29 | def get_itime(self, obj): |
31 | 30 | return time.mktime(obj.start_date.utctimetuple()) * 1000 |
0 | # Faraday Penetration Test IDE | |
1 | # Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) | |
2 | # See the file 'doc/LICENSE' for the license information | |
3 | ||
4 | from flask import Blueprint | |
5 | from marshmallow import fields | |
6 | ||
7 | from server.models import CustomFieldsSchema | |
8 | from server.api.base import ( | |
9 | AutoSchema, | |
10 | ReadWriteView, | |
11 | ) | |
12 | ||
13 | ||
14 | custom_fields_schema_api = Blueprint('custom_fields_schema_api', __name__) | |
15 | ||
16 | ||
17 | class CustomFieldsSchemaSchema(AutoSchema): | |
18 | ||
19 | class Meta: | |
20 | model = CustomFieldsSchema | |
21 | fields = ('field_name', | |
22 | 'field_type', | |
23 | 'field_display_name', | |
24 | 'field_order', | |
25 | ) | |
26 | ||
27 | ||
28 | class CustomFieldsSchemaView(ReadWriteView): | |
29 | route_base = 'custom_fields_schema' | |
30 | model_class = CustomFieldsSchema | |
31 | schema_class = CustomFieldsSchemaSchema | |
32 | ||
33 | CustomFieldsSchemaView.register(custom_fields_schema_api) |
85 | 85 | self._stop = True |
86 | 86 | |
87 | 87 | def run(self): |
88 | logger.info('Tool report processor started') | |
88 | 89 | while not self._stop: |
89 | 90 | try: |
90 | 91 | |
144 | 145 | |
145 | 146 | report_file = request.files['file'] |
146 | 147 | |
147 | if report_file.filename == '': | |
148 | abort(400) | |
149 | ||
150 | 148 | if report_file: |
151 | 149 | |
152 | 150 | chars = string.ascii_uppercase + string.digits |
13 | 13 | from flask_classful import route |
14 | 14 | from flask_restless.search import search |
15 | 15 | from marshmallow import Schema, fields, post_load, ValidationError |
16 | from marshmallow.validate import OneOf, Length | |
16 | from marshmallow.validate import OneOf | |
17 | 17 | from sqlalchemy.orm import aliased, joinedload, selectin_polymorphic, undefer |
18 | 18 | from sqlalchemy.orm.exc import NoResultFound |
19 | from psycopg2 import DataError | |
19 | ||
20 | 20 | from depot.manager import DepotManager |
21 | 21 | from server.api.base import ( |
22 | 22 | AutoSchema, |
23 | InvalidUsage, | |
23 | FilterAlchemyMixin, | |
24 | 24 | FilterSetMeta, |
25 | 25 | PaginatedMixin, |
26 | FilterAlchemyMixin, | |
27 | 26 | ReadWriteWorkspacedView, |
28 | ) | |
27 | InvalidUsage) | |
29 | 28 | from server.fields import FaradayUploadedFile |
30 | 29 | from server.models import ( |
31 | 30 | db, |
43 | 42 | from server.api.modules.services import ServiceSchema |
44 | 43 | from server.schemas import ( |
45 | 44 | MutableField, |
46 | PrimaryKeyRelatedField, | |
47 | SelfNestedField, | |
48 | 45 | SeverityField, |
49 | 46 | MetadataSchema, |
47 | SelfNestedField, | |
48 | FaradayCustomField, | |
49 | PrimaryKeyRelatedField, | |
50 | 50 | ) |
51 | 51 | |
52 | 52 | vulns_api = Blueprint('vulns_api', __name__) |
133 | 133 | metadata = SelfNestedField(CustomMetadataSchema()) |
134 | 134 | date = fields.DateTime(attribute='create_date', |
135 | 135 | dump_only=True) # This is only used for sorting |
136 | custom_fields = FaradayCustomField(table_name='vulnerability', attribute='custom_fields') | |
136 | 137 | |
137 | 138 | class Meta: |
138 | 139 | model = Vulnerability |
145 | 146 | 'desc', 'impact', 'confirmed', 'name', |
146 | 147 | 'service', 'obj_id', 'type', 'policyviolations', |
147 | 148 | '_attachments', |
148 | 'target', 'host_os', 'resolution', 'metadata') | |
149 | 'target', 'host_os', 'resolution', 'metadata', | |
150 | 'custom_fields') | |
149 | 151 | |
150 | 152 | def get_type(self, obj): |
151 | 153 | return obj.__class__.__name__ |
262 | 264 | 'service', 'obj_id', 'type', 'policyviolations', |
263 | 265 | 'request', '_attachments', 'params', |
264 | 266 | 'target', 'host_os', 'resolution', 'method', 'metadata', |
265 | 'status_code') | |
267 | 'status_code', 'custom_fields' | |
268 | ) | |
266 | 269 | |
267 | 270 | |
268 | 271 | # Use this override for filterset fields that filter by en exact match by |
305 | 308 | alias.name == value |
306 | 309 | ) |
307 | 310 | |
311 | ||
308 | 312 | class HostnamesFilter(Filter): |
309 | 313 | def filter(self, query, model, attr, value): |
310 | 314 | alias = aliased(Hostname, name='hostname_filter') |
322 | 326 | |
323 | 327 | query = service_hostnames_query.union(host_hostnames_query) |
324 | 328 | return query |
329 | ||
325 | 330 | |
326 | 331 | class CustomILike(operators.Operator): |
327 | 332 | """A filter operator that puts a % in the beggining and in the |
378 | 383 | validate=OneOf(Vulnerability.STATUSES + ['opened']) |
379 | 384 | )) |
380 | 385 | hostnames = HostnamesFilter(fields.Str()) |
386 | confirmed = Filter(fields.Boolean()) | |
381 | 387 | |
382 | 388 | def filter(self): |
383 | 389 | """Generate a filtered query from request parameters. |
567 | 573 | @route('/<vuln_id>/attachment/', methods=['POST']) |
568 | 574 | def post_attachment(self, workspace_name, vuln_id): |
569 | 575 | vuln_workspace_check = db.session.query(VulnerabilityGeneric, Workspace.id).join( |
570 | Workspace).filter(VulnerabilityGeneric.id == vuln_id, Workspace.name == workspace_name) | |
576 | Workspace).filter(VulnerabilityGeneric.id == vuln_id, | |
577 | Workspace.name == workspace_name).first() | |
571 | 578 | |
572 | 579 | if vuln_workspace_check: |
573 | 580 | if 'file' not in request.files: |
648 | 655 | else: |
649 | 656 | flask.abort(404, "Vulnerability not found") |
650 | 657 | |
658 | @route('/<vuln_id>/attachment/<attachment_filename>/', methods=['DELETE']) | |
659 | def delete_attachment(self, workspace_name, vuln_id, attachment_filename): | |
660 | vuln_workspace_check = db.session.query(VulnerabilityGeneric, Workspace.id).join( | |
661 | Workspace).filter( | |
662 | VulnerabilityGeneric.id == vuln_id, Workspace.name == workspace_name).first() | |
663 | ||
664 | if vuln_workspace_check: | |
665 | file_obj = db.session.query(File).filter_by(object_type='vulnerability', | |
666 | object_id=vuln_id, | |
667 | filename=attachment_filename).first() | |
668 | if file_obj: | |
669 | db.session.delete(file_obj) | |
670 | db.session.commit() | |
671 | depot = DepotManager.get() | |
672 | depot.delete(file_obj.content.get('file_id')) | |
673 | return flask.jsonify({'message': 'Attachment was successfully deleted'}) | |
674 | else: | |
675 | flask.abort(404, "File not found") | |
676 | else: | |
677 | flask.abort(404, "Vulnerability not found") | |
678 | ||
651 | 679 | |
652 | 680 | VulnerabilityView.register(vulns_api) |
0 | 0 | # Faraday Penetration Test IDE |
1 | 1 | # Copyright (C) 2016 Infobyte LLC (http://www.infobytesec.com/) |
2 | 2 | # See the file 'doc/LICENSE' for the license information |
3 | import os | |
3 | 4 | import json |
4 | 5 | |
5 | 6 | import flask |
21 | 22 | SelfNestedField, |
22 | 23 | ) |
23 | 24 | from server.api.base import ReadWriteView, AutoSchema |
25 | from config.configuration import getInstanceConfiguration | |
24 | 26 | |
25 | 27 | workspace_api = Blueprint('workspace_api', __name__) |
26 | 28 | |
175 | 177 | scope = data.pop('scope', []) |
176 | 178 | workspace = super(WorkspaceView, self)._perform_create(data, **kwargs) |
177 | 179 | workspace.set_scope(scope) |
180 | self._createWorkspaceFolder(workspace.name) | |
178 | 181 | db.session.commit() |
179 | 182 | return workspace |
183 | ||
184 | def _createWorkspaceFolder(self, name): | |
185 | CONF = getInstanceConfiguration() | |
186 | self._report_path = os.path.join(CONF.getReportPath(), name) | |
187 | self._report_ppath = os.path.join(self._report_path, "process") | |
188 | self._report_upath = os.path.join(self._report_path, "unprocessed") | |
189 | ||
190 | if not os.path.exists(self._report_path): | |
191 | os.mkdir(self._report_path) | |
192 | ||
193 | if not os.path.exists(self._report_ppath): | |
194 | os.mkdir(self._report_ppath) | |
195 | ||
196 | if not os.path.exists(self._report_upath): | |
197 | os.mkdir(self._report_upath) | |
180 | 198 | |
181 | 199 | def _update_object(self, obj, data): |
182 | 200 | scope = data.pop('scope', []) |
76 | 76 | from server.api.modules.upload_reports import upload_api |
77 | 77 | from server.api.modules.websocket_auth import websocket_auth_api |
78 | 78 | from server.api.modules.get_exploits import exploits_api |
79 | from server.api.modules.custom_fields import custom_fields_schema_api | |
79 | 80 | app.register_blueprint(commandsrun_api) |
80 | 81 | app.register_blueprint(activityfeed_api) |
81 | 82 | app.register_blueprint(credentials_api) |
92 | 93 | app.register_blueprint(upload_api) |
93 | 94 | app.register_blueprint(websocket_auth_api) |
94 | 95 | app.register_blueprint(exploits_api) |
96 | app.register_blueprint(custom_fields_schema_api) | |
95 | 97 | |
96 | 98 | |
97 | 99 | def check_testing_configuration(testing, app): |
0 | import sys | |
1 | import click | |
2 | ||
3 | from server.web import app | |
4 | from server.models import ( | |
5 | db, | |
6 | CustomFieldsSchema | |
7 | ) | |
8 | from server.utils.database import get_or_create | |
9 | ||
10 | ||
11 | def add_custom_field_main(): | |
12 | with app.app_context(): | |
13 | add_custom_field_wizard() | |
14 | ||
15 | def delete_custom_field_main(): | |
16 | with app.app_context(): | |
17 | delete_custom_field_wizard() | |
18 | ||
19 | ||
20 | def delete_custom_field_wizard(): | |
21 | print('This wizard will guide you to DELETE custom field to the vulneraiblity model.') | |
22 | print('All available custom fields are:') | |
23 | for custom_field in db.session.query(CustomFieldsSchema): | |
24 | print('* {0}'.format(custom_field.field_name)) | |
25 | print('End of custom fields') | |
26 | field_name = click.prompt('Field name') | |
27 | custom_field = db.session.query(CustomFieldsSchema).filter_by(field_name=field_name).first() | |
28 | if custom_field: | |
29 | db.session.delete(custom_field) | |
30 | db.session.commit() | |
31 | else: | |
32 | print('Custom field not found') | |
33 | ||
34 | def add_custom_field_wizard(): | |
35 | print('This wizard will guide you to ADD custom field to the vulneraiblity model.') | |
36 | field_name = click.prompt('Field name') | |
37 | field_display_name = click.prompt('Display name') | |
38 | field_type = click.prompt('Field type (int, str, list)', type=click.Choice(['int', 'str', 'list'])) | |
39 | custom_fields = db.session.query(CustomFieldsSchema) | |
40 | current_used_orders = set() | |
41 | if custom_fields.count(): | |
42 | print('Custom field current order') | |
43 | for custom_field in custom_fields: | |
44 | current_used_orders.add(custom_field.field_order) | |
45 | print('Field {0}, order {1}'.format(custom_field.field_display_name, custom_field.field_order)) | |
46 | field_order = click.prompt('Field order index') | |
47 | invalid_field_order = False | |
48 | try: | |
49 | int(field_order) | |
50 | except ValueError: | |
51 | invalid_field_order = True | |
52 | ||
53 | while invalid_field_order or int(field_order) in current_used_orders: | |
54 | print('Field order already used or invalid value, please choose another value') | |
55 | field_order = click.prompt('Field order index') | |
56 | try: | |
57 | int(field_order) | |
58 | except ValueError: | |
59 | invalid_field_order = True | |
60 | continue | |
61 | invalid_field_order = False | |
62 | confirmation = click.prompt('New CustomField will be added to vulnerability -> Order {order} ({0},{1},{2}) <-, confirm to continue (yes/no)'.format(field_name, field_display_name, field_type, order=field_order)) | |
63 | if not confirmation: | |
64 | sys.exit(1) | |
65 | ||
66 | custom_field_data, created = get_or_create( | |
67 | db.session, | |
68 | CustomFieldsSchema, | |
69 | table_name='vulnerability', | |
70 | field_name=field_name, | |
71 | field_order=field_order, | |
72 | ) | |
73 | if not created: | |
74 | print('Custom field already exists, skipping') | |
75 | sys.exit(1) | |
76 | custom_field_data.field_display_name = field_display_name, | |
77 | custom_field_data.field_type = field_type | |
78 | db.session.commit() |
62 | 62 | report_managers.append(report_manager) |
63 | 63 | report_manager.start() |
64 | 64 | |
65 | #for report_manager in report_managers: | |
66 | # report_manager.join() | |
65 | for report_manager in report_managers: | |
66 | report_manager.stop() | |
67 | 67 | |
68 | #for controller in controllers: | |
69 | # controller.join() | |
68 | for controller in controllers: | |
69 | controller.stop() |
90 | 90 | return None |
91 | 91 | |
92 | 92 | |
93 | def check_postgresql_encoding(): | |
94 | with app.app_context(): | |
95 | psql_status = check_postgres() | |
96 | if psql_status: | |
97 | encoding = db.engine.execute("SHOW SERVER_ENCODING").first()[0] | |
98 | return encoding | |
99 | else: | |
100 | return None | |
101 | ||
102 | ||
93 | 103 | def check_client(): |
94 | 104 | |
95 | 105 | port_rest = CONF.getApiRestfulConInfoPort() |
194 | 204 | return exit_code |
195 | 205 | |
196 | 206 | |
197 | def print_postgresql_locks_status(): | |
198 | """Prints the status of locks in Postgresql using check_locks_postgresql()""" | |
207 | def print_postgresql_other_status(): | |
208 | """Prints the status of locks in Postgresql using check_locks_postgresql() and | |
209 | prints Postgresql encoding using check_postgresql_encoding()""" | |
210 | ||
199 | 211 | lock_status = check_locks_postgresql() |
200 | 212 | if lock_status: |
201 | 213 | print('[{yellow}-{white}] Warning: PostgreSQL lock detected.' \ |
206 | 218 | elif lock_status == None: |
207 | 219 | pass |
208 | 220 | |
221 | encoding = check_postgresql_encoding() | |
222 | if encoding: | |
223 | print('[{green}+{white}] PostgreSQL encoding: {db_encoding}'.\ | |
224 | format(green=Fore.GREEN, white=Fore.WHITE, db_encoding=encoding)) | |
225 | elif encoding == None: | |
226 | pass | |
227 | ||
209 | 228 | |
210 | 229 | def print_faraday_status(): |
211 | 230 | """Prints Status of farday using check_server_running() and check_client""" |
291 | 310 | def full_status_check(): |
292 | 311 | print('\n{white}Checking if postgreSQL is running...'.format(white=Fore.WHITE)) |
293 | 312 | print_postgresql_status() |
294 | print_postgresql_locks_status() | |
313 | print_postgresql_other_status() | |
295 | 314 | |
296 | 315 | print('\n{white}Checking if Faraday is running...'.format(white=Fore.WHITE)) |
297 | 316 | print_faraday_status() |
0 | import os | |
1 | import sys | |
2 | import shutil | |
3 | import tempfile | |
4 | from tqdm import tqdm | |
5 | from colorama import init | |
6 | from colorama import Fore, Style | |
7 | ||
8 | try: | |
9 | from pip._internal.operations import freeze | |
10 | except ImportError: # pip < 10.0 | |
11 | from pip.operations import freeze | |
12 | ||
13 | import config.constant as constants | |
14 | from server.commands import status_check | |
15 | ||
16 | init() | |
17 | ||
18 | def init_config(): | |
19 | #Creates the directory where all the info will go to | |
20 | path = tempfile.mkdtemp() | |
21 | return path | |
22 | ||
23 | def get_status_check(path): | |
24 | #Executes status check from with-in the code and uses stdout to save info to file | |
25 | #stdout was the only way to get this information without doing a big refactor | |
26 | original_stdout = sys.stdout | |
27 | ||
28 | sys.stdout = open(path + '/status_check.txt','wt') | |
29 | status_check.full_status_check() | |
30 | ||
31 | sys.stdout.close() | |
32 | sys.stdout = original_stdout | |
33 | ||
34 | ||
35 | def get_pip_freeze(path): | |
36 | #Executes pip freeze internally and saves the info a pip_freeze.txt file | |
37 | pip_freeze = freeze.freeze() | |
38 | pip_file = open(path + '/pip_freeze.txt', 'a') | |
39 | for line in pip_freeze: | |
40 | pip_file.write(line) | |
41 | pip_file.write('\n') | |
42 | pip_file.close() | |
43 | ||
44 | def get_logs(path): | |
45 | #Copies the logs using the logs path saved on constants | |
46 | shutil.copytree(constants.CONST_FARADAY_HOME_PATH +'/logs', path + '/logs') | |
47 | ||
48 | def make_zip(path): | |
49 | #Makes a zip file of the new folder with all the information obtained inside | |
50 | shutil.make_archive('faraday_support', 'zip', path) | |
51 | ||
52 | def end_config(path): | |
53 | #Deletes recursively the directory created on the init_config | |
54 | shutil.rmtree(path) | |
55 | ||
56 | def all_for_support(): | |
57 | with tqdm(total=5) as pbar: | |
58 | path = init_config() | |
59 | get_status_check(path) | |
60 | pbar.update(1) | |
61 | get_logs(path) | |
62 | pbar.update(1) | |
63 | get_pip_freeze(path) | |
64 | pbar.update(1) | |
65 | make_zip(path) | |
66 | pbar.update(1) | |
67 | end_config(path) | |
68 | pbar.update(1) | |
69 | ||
70 | print('[{green}+{white}] Process Completed. You will find a {bright}faraday_support.zip{normal} file inside Faraday\'s root directory.' | |
71 | .format(green=Fore.GREEN, white=Fore.WHITE, bright=Style.BRIGHT, normal=Style.NORMAL))⏎ |
5 | 5 | import os |
6 | 6 | import shutil |
7 | 7 | import errno |
8 | import ConfigParser | |
8 | try: | |
9 | import ConfigParser | |
10 | except ImportError: | |
11 | import configparser as ConfigParser | |
9 | 12 | |
10 | 13 | from logging import ( |
11 | 14 | DEBUG, |
169 | 172 | self.certificate = None |
170 | 173 | self.keyfile = None |
171 | 174 | self.port = None |
175 | self.enabled = False | |
172 | 176 | |
173 | 177 | |
174 | 178 | class StorageConfigObject(ConfigSection): |
3 | 3 | See the file 'doc/LICENSE' for the license information |
4 | 4 | |
5 | 5 | ''' |
6 | import json | |
6 | 7 | import imghdr |
7 | 8 | from tempfile import SpooledTemporaryFile |
8 | 9 | |
9 | 10 | from PIL import Image |
10 | ||
11 | import sqlalchemy as sa | |
12 | from sqlalchemy.dialects.postgresql.json import JSONB | |
11 | 13 | from depot.fields.upload import UploadedFile |
12 | 14 | from depot.io.utils import file_from_content |
13 | 15 | from depot.io.utils import INMEMORY_FILESIZE |
84 | 86 | if public_url: |
85 | 87 | return public_url |
86 | 88 | return DepotManager.get_middleware().url_for(self['thumb_path']) |
89 | ||
90 | ||
91 | class JSONType(sa.types.TypeDecorator): | |
92 | impl = sa.UnicodeText | |
93 | ||
94 | def load_dialect_impl(self, dialect): | |
95 | if dialect.name == 'postgresql': | |
96 | return dialect.type_descriptor(JSONB()) | |
97 | else: | |
98 | return dialect.type_descriptor(self.impl) | |
99 | ||
100 | def process_bind_param(self, value, dialect): | |
101 | if dialect.name == 'postgresql': | |
102 | return value | |
103 | if value is not None: | |
104 | value = json.dumps(value) | |
105 | return value | |
106 | ||
107 | def process_result_value(self, value, dialect): | |
108 | if dialect.name == 'postgresql': | |
109 | return value | |
110 | if value is not None: | |
111 | value = json.loads(value) | |
112 | return value |
38 | 38 | SQLAlchemy as OriginalSQLAlchemy, |
39 | 39 | _EngineConnector |
40 | 40 | ) |
41 | ||
41 | 42 | from depot.fields.sqlalchemy import UploadedFileField |
42 | 43 | |
43 | 44 | import server.config |
44 | from server.fields import FaradayUploadedFile | |
45 | from server.fields import FaradayUploadedFile, JSONType | |
45 | 46 | from flask_security import ( |
46 | 47 | RoleMixin, |
47 | 48 | UserMixin, |
482 | 483 | version or "") |
483 | 484 | |
484 | 485 | |
486 | class CustomFieldsSchema(db.Model): | |
487 | __tablename__ = 'custom_fields_schema' | |
488 | ||
489 | id = Column(Integer, primary_key=True) | |
490 | field_name = Column(Text) | |
491 | field_type = Column(Text) | |
492 | field_display_name = Column(Text) | |
493 | field_order = Column(Integer) | |
494 | table_name = Column(Text) | |
495 | ||
496 | ||
485 | 497 | class VulnerabilityABC(Metadata): |
486 | 498 | # revisar plugin nexpose, netspark para terminar de definir uniques. asegurar que se carguen bien |
487 | 499 | EASE_OF_RESOLUTIONS = [ |
520 | 532 | CheckConstraint('1.0 <= risk AND risk <= 10.0', |
521 | 533 | name='check_vulnerability_risk'), |
522 | 534 | ) |
535 | ||
536 | custom_fields = Column(JSONType) | |
523 | 537 | |
524 | 538 | @property |
525 | 539 | def parent(self): |
663 | 677 | proxy_factory=CustomAssociationSet, |
664 | 678 | creator=_build_associationproxy_creator_non_workspaced('PolicyViolationTemplate') |
665 | 679 | ) |
680 | custom_fields = Column(JSONType) | |
666 | 681 | |
667 | 682 | |
668 | 683 | class CommandObject(db.Model): |
1477 | 1492 | |
1478 | 1493 | __tablename__ = 'faraday_user' |
1479 | 1494 | ROLES = ['admin', 'pentester', 'client'] |
1495 | OTP_STATES = ["disabled", "requested", "confirmed"] | |
1480 | 1496 | |
1481 | 1497 | id = Column(Integer, primary_key=True) |
1482 | 1498 | username = NonBlankColumn(String(255), unique=True) |
1493 | 1509 | confirmed_at = Column(DateTime()) |
1494 | 1510 | role = Column(Enum(*ROLES, name='user_roles'), |
1495 | 1511 | nullable=False, default='client') |
1512 | _otp_secret = Column( | |
1513 | String(16), | |
1514 | name="otp_secret", nullable=True) | |
1515 | state_otp = Column(Enum(*OTP_STATES, name='user_otp_states'), nullable=False, default="disabled") | |
1516 | ||
1496 | 1517 | # TODO: add many to many relationship to add permission to workspace |
1497 | 1518 | |
1498 | 1519 | workspace_permission_instances = relationship( |
4 | 4 | |
5 | 5 | ''' |
6 | 6 | import time |
7 | import json | |
7 | 8 | import datetime |
8 | 9 | from marshmallow import fields, Schema |
9 | 10 | from marshmallow.exceptions import ValidationError |
10 | 11 | from dateutil.tz import tzutc |
11 | 12 | |
12 | from server.models import VulnerabilityABC | |
13 | from server.models import ( | |
14 | db, | |
15 | VulnerabilityABC, | |
16 | CustomFieldsSchema, | |
17 | ) | |
13 | 18 | |
14 | 19 | |
15 | 20 | class JSTimestampField(fields.Integer): |
23 | 28 | def _deserialize(self, value, attr, data): |
24 | 29 | if value is not None and value: |
25 | 30 | return datetime.datetime.fromtimestamp(self._validated(value)/1e3) |
31 | ||
32 | ||
33 | class FaradayCustomField(fields.Field): | |
34 | def __init__(self, table_name='vulnerability', *args, **kwargs): | |
35 | self.table_name = table_name | |
36 | super(FaradayCustomField, self).__init__(*args, **kwargs) | |
37 | ||
38 | def _serialize(self, value, attr, obj, **kwargs): | |
39 | if not value: | |
40 | value = {} | |
41 | res = {} | |
42 | custom_fields = db.session.query(CustomFieldsSchema).filter_by( | |
43 | table_name=self.table_name) | |
44 | for custom_field in custom_fields: | |
45 | serialized_value = value.get(custom_field.field_display_name) | |
46 | res[custom_field.field_display_name] = serialized_value | |
47 | ||
48 | return res | |
49 | ||
50 | def _deserialize(self, value, attr, data, **kwargs): | |
51 | serialized = {} | |
52 | if value is not None and value: | |
53 | for key, raw_data in value.iteritems(): | |
54 | field_schema = db.session.query(CustomFieldsSchema).filter_by( | |
55 | table_name=self.table_name, | |
56 | field_display_name=key, | |
57 | ).first() | |
58 | if not field_schema: | |
59 | raise ValidationError("Invalid custom field, not found in schema. Did you add it first?") | |
60 | if field_schema.field_type == 'str': | |
61 | serialized[key] = str(raw_data) | |
62 | elif field_schema.field_type == 'int': | |
63 | try: | |
64 | serialized[key] = int(raw_data) | |
65 | except TypeError: | |
66 | return None | |
67 | except ValueError: | |
68 | raise ValidationError("Can not convert custom type to int") | |
69 | elif field_schema.field_type == 'list': | |
70 | serialized[key] = raw_data | |
71 | else: | |
72 | raise ValidationError("Custom Field datatype not supported yet") | |
73 | ||
74 | return serialized | |
26 | 75 | |
27 | 76 | |
28 | 77 | class PrimaryKeyRelatedField(fields.Field): |
12 | 12 | import errno |
13 | 13 | import atexit |
14 | 14 | import signal |
15 | from functools import partial | |
16 | ||
15 | 17 | import server.config |
16 | ||
17 | 18 | from server.utils.logger import get_logger |
18 | 19 | |
19 | 20 | |
157 | 158 | return False |
158 | 159 | else: |
159 | 160 | raise err |
160 | ||
161 | ||
161 | 162 | remove_pid_file(port) |
162 | 163 | return True |
163 | 164 | |
206 | 207 | def create_pid_file(port): |
207 | 208 | with open(server.config.FARADAY_SERVER_PID_FILE.format(port), 'w') as pid_file: |
208 | 209 | pid_file.write('{}'.format(os.getpid())) |
209 | atexit.register(remove_pid_file) | |
210 | atexit.register(partial(remove_pid_file, port)) | |
210 | 211 | |
211 | 212 | def remove_pid_file(port): |
212 | 213 | os.remove(server.config.FARADAY_SERVER_PID_FILE.format(port)) |
8 | 8 | |
9 | 9 | import twisted.web |
10 | 10 | from twisted.web.resource import Resource, ForbiddenResource |
11 | ||
12 | 11 | # Ugly hack to make "flask shell" work. It works because when running via flask |
13 | 12 | # shell, __file__ will be server/web.py instead of faraday-server.py |
14 | 13 | if os.path.split(os.path.dirname(__file__))[-1] == 'server': |
139 | 138 | |
140 | 139 | def run(self): |
141 | 140 | def signal_handler(*args): |
141 | logger.info('Received SIGTERM, shutting down.') | |
142 | 142 | logger.info("Stopping threads, please wait...") |
143 | 143 | # teardown() |
144 | 144 | self.raw_report_processor.stop() |
145 | reactor.stop() | |
146 | 145 | |
147 | 146 | site = twisted.web.server.Site(self.__root_resource) |
148 | 147 | if self.__ssl_enabled: |
240 | 240 | margin-right: 15px; |
241 | 241 | } |
242 | 242 | |
243 | .nav-tabs { | |
244 | border-bottom: none !important; | |
245 | } | |
246 | ||
247 | .nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover { | |
248 | color: #67aef9; | |
249 | cursor: default; | |
250 | background-color: #fff; | |
251 | border: none; | |
252 | border-bottom: 3px solid #67aef9; | |
253 | font-weight: bold; | |
254 | } | |
255 | ||
256 | .nav-tabs > li > a { | |
257 | color: #8c9799; | |
258 | } | |
259 | ||
260 | .nav > li:not(.active) > a:hover { | |
261 | background-color: #fff !important; | |
262 | border-color: #fff #fff #ddd !important; | |
263 | } | |
264 | ||
265 | .edit-vulns-dropdowns { | |
266 | margin-bottom: 15px; | |
267 | } | |
268 | ||
269 | .primary-btn { | |
270 | width: calc(100% - 29px); | |
271 | } | |
272 | ||
273 | .secondary-btn { | |
274 | left: -5px; | |
275 | position: relative; | |
276 | } | |
277 | ||
278 | .btn-change-property { | |
279 | border: none; | |
280 | padding: 5px; | |
281 | color: #fff; | |
282 | font-weight: bold; | |
283 | } | |
284 | ||
285 | .data-name { | |
286 | font-size: 1.5em; | |
287 | font-weight: bold; | |
288 | color: #5e6667; | |
289 | } | |
290 | ||
291 | .modal-data-name { | |
292 | margin: 25px 0; | |
293 | } | |
294 | ||
295 | .tab-pane-header { | |
296 | color: #5e6667; | |
297 | font-size: 1.2em; | |
298 | font-weight: bold; | |
299 | margin-bottom: 15px; | |
300 | } | |
301 | ||
302 | .tab-pane-container { | |
303 | width: 100%; | |
304 | } | |
305 | ||
306 | .btn-primary-white { | |
307 | background-color: #fff; | |
308 | border: 1px solid #ddd; | |
309 | border-right: none; | |
310 | color: #5e6667; | |
311 | text-transform: capitalize; | |
312 | font-weight: normal; | |
313 | } | |
314 | ||
315 | .btn-secondary-white{ | |
316 | background-color: #fff; | |
317 | border: 1px solid #ddd; | |
318 | border-left: none; | |
319 | color: #5e6667; | |
320 | } | |
321 | ||
322 | .edit-name-icon { | |
323 | color: #999; | |
324 | cursor: pointer; | |
325 | margin-left: 10px; | |
326 | } | |
327 | ||
328 | /*.modal-data-name:hover .edit-name-icon {*/ | |
329 | /*display: inline-flex;*/ | |
330 | /*}*/ | |
331 | ||
332 | #inp-edit-name{ | |
333 | font-weight: bold; | |
334 | color: #5e6667; | |
335 | } | |
336 | ||
337 | .fields-of-vulnWeb { | |
338 | position: relative; | |
339 | top: 22px; | |
340 | } | |
341 | ||
342 | /* The container */ | |
343 | .radio-container { | |
344 | display: block; | |
345 | position: relative; | |
346 | padding-left: 55px; | |
347 | margin-bottom: 12px; | |
348 | cursor: pointer; | |
349 | font-size: 22px; | |
350 | -webkit-user-select: none; | |
351 | -moz-user-select: none; | |
352 | -ms-user-select: none; | |
353 | user-select: none; | |
354 | } | |
355 | ||
356 | /* Hide the browser's default radio button */ | |
357 | .radio-container input { | |
358 | position: absolute; | |
359 | opacity: 0; | |
360 | cursor: pointer; | |
361 | } | |
362 | ||
363 | /* Create a custom radio button */ | |
364 | .checkmark { | |
365 | position: absolute; | |
366 | top: 5px; | |
367 | left: 25px; | |
368 | height: 20px; | |
369 | width: 20px; | |
370 | background-color: #ddd; | |
371 | border-radius: 50%; | |
372 | } | |
373 | ||
374 | /* On mouse-over, add a grey background color */ | |
375 | .radio-container:hover input ~ .checkmark { | |
376 | background-color: #ccc; | |
377 | } | |
378 | ||
379 | /* When the radio button is checked, add a blue background */ | |
380 | .radio-container input:checked ~ .checkmark { | |
381 | background-color: #008000; | |
382 | } | |
383 | ||
384 | /* Create the indicator (the dot/circle - hidden when not checked) */ | |
385 | .checkmark:after { | |
386 | content: ""; | |
387 | position: absolute; | |
388 | display: none; | |
389 | } | |
390 | ||
391 | /* Show the indicator (dot/circle) when checked */ | |
392 | .radio-container input:checked ~ .checkmark:after { | |
393 | display: block; | |
394 | top: 6px; | |
395 | left: 6px; | |
396 | } | |
397 | ||
398 | /* Style the indicator (dot/circle) */ | |
399 | .radio-container .checkmark:after { | |
400 | top: 9px; | |
401 | left: 9px; | |
402 | width: 8px; | |
403 | height: 8px; | |
404 | border-radius: 50%; | |
405 | background: white; | |
406 | } | |
407 | ||
408 | .customs-radio-inline{ | |
409 | display: inline-flex; | |
410 | } | |
411 | ||
412 | ||
413 | ||
414 | /* The container */ | |
415 | .chbox-container { | |
416 | display: block; | |
417 | position: relative; | |
418 | padding-left: 55px; | |
419 | margin-bottom: 12px; | |
420 | cursor: pointer; | |
421 | font-size: 22px; | |
422 | -webkit-user-select: none; | |
423 | -moz-user-select: none; | |
424 | -ms-user-select: none; | |
425 | user-select: none; | |
426 | } | |
427 | ||
428 | /* Hide the browser's default checkbox */ | |
429 | .chbox-container input { | |
430 | position: absolute; | |
431 | opacity: 0; | |
432 | cursor: pointer; | |
433 | height: 0; | |
434 | width: 0; | |
435 | } | |
436 | ||
437 | /* On mouse-over, add a grey background color */ | |
438 | .chbox-container:hover input ~ .checkmark { | |
439 | background-color: #ccc; | |
440 | } | |
441 | ||
442 | /* When the checkbox is checked, add a blue background */ | |
443 | .chbox-container input:checked ~ .checkmark { | |
444 | background-color: #008000; | |
445 | } | |
446 | ||
447 | /* Create the checkmark/indicator (hidden when not checked) */ | |
448 | .checkmark:after { | |
449 | content: ""; | |
450 | position: absolute; | |
451 | display: none; | |
452 | } | |
453 | ||
454 | /* Show the checkmark when checked */ | |
455 | .chbox-container input:checked ~ .checkmark:after { | |
456 | display: block; | |
457 | } | |
458 | ||
459 | /* Style the checkmark/indicator */ | |
460 | .chbox-container .checkmark:after { | |
461 | left: 8px; | |
462 | top: 5px; | |
463 | width: 5px; | |
464 | height: 10px; | |
465 | border: solid white; | |
466 | border-width: 0 3px 3px 0; | |
467 | -webkit-transform: rotate(45deg); | |
468 | -ms-transform: rotate(45deg); | |
469 | transform: rotate(45deg); | |
470 | } | |
471 | ||
472 | .chbox-container .checkmark{ | |
473 | top: 0; | |
474 | } | |
475 | ||
476 | .custom-divider { | |
477 | border-top: 1px solid #ddd; | |
478 | margin: 10px 0 15px 0; | |
479 | } | |
480 | ||
481 | li.nav-item.has-error:not(.active) { | |
482 | border-bottom: 1px dashed #a94442; | |
483 | } | |
484 | ||
485 | li.nav-item.has-error:not(.active) a { | |
486 | color: #a94442; | |
487 | } | |
243 | 488 | .active-toggle{ |
244 | 489 | width: 3%; |
245 | 490 | text-align: center!important; |
255 | 500 | position: relative; |
256 | 501 | top: 220px; |
257 | 502 | color: #aeaeb1; |
503 | } | |
504 | .active-toggle{ | |
505 | width: 3%; | |
506 | text-align: center!important; | |
507 | } | |
508 | ||
509 | .active-toggle-container{ | |
510 | cursor: pointer; | |
511 | } | |
512 | ||
513 | .forbidden-error { | |
514 | text-align: center; | |
515 | overflow-wrap: break-word; | |
516 | position: relative; | |
517 | top: 220px; | |
518 | color: #aeaeb1; | |
519 | } | |
520 | ||
521 | .last-item-field { | |
522 | margin-bottom: 25px; | |
258 | 523 | }⏎ |
Binary diff not shown
5 | 5 | <font id="glyphicons_halflingsregular" horiz-adv-x="1200" > |
6 | 6 | <font-face units-per-em="1200" ascent="960" descent="-240" /> |
7 | 7 | <missing-glyph horiz-adv-x="500" /> |
8 | <glyph /> | |
9 | <glyph /> | |
10 | <glyph unicode="
" /> | |
8 | <glyph horiz-adv-x="0" /> | |
9 | <glyph horiz-adv-x="400" /> | |
11 | 10 | <glyph unicode=" " /> |
12 | <glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> | |
13 | <glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> | |
11 | <glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> | |
12 | <glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> | |
14 | 13 | <glyph unicode=" " /> |
15 | <glyph unicode=" " horiz-adv-x="652" /> | |
16 | <glyph unicode=" " horiz-adv-x="1304" /> | |
17 | <glyph unicode=" " horiz-adv-x="652" /> | |
18 | <glyph unicode=" " horiz-adv-x="1304" /> | |
19 | <glyph unicode=" " horiz-adv-x="434" /> | |
20 | <glyph unicode=" " horiz-adv-x="326" /> | |
21 | <glyph unicode=" " horiz-adv-x="217" /> | |
22 | <glyph unicode=" " horiz-adv-x="217" /> | |
23 | <glyph unicode=" " horiz-adv-x="163" /> | |
14 | <glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> | |
15 | <glyph unicode=" " horiz-adv-x="650" /> | |
16 | <glyph unicode=" " horiz-adv-x="1300" /> | |
17 | <glyph unicode=" " horiz-adv-x="650" /> | |
18 | <glyph unicode=" " horiz-adv-x="1300" /> | |
19 | <glyph unicode=" " horiz-adv-x="433" /> | |
20 | <glyph unicode=" " horiz-adv-x="325" /> | |
21 | <glyph unicode=" " horiz-adv-x="216" /> | |
22 | <glyph unicode=" " horiz-adv-x="216" /> | |
23 | <glyph unicode=" " horiz-adv-x="162" /> | |
24 | 24 | <glyph unicode=" " horiz-adv-x="260" /> |
25 | 25 | <glyph unicode=" " horiz-adv-x="72" /> |
26 | 26 | <glyph unicode=" " horiz-adv-x="260" /> |
27 | <glyph unicode=" " horiz-adv-x="326" /> | |
28 | <glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> | |
29 | <glyph unicode="−" d="M200 400h900v300h-900v-300z" /> | |
27 | <glyph unicode=" " horiz-adv-x="325" /> | |
28 | <glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> | |
29 | <glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> | |
30 | <glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> | |
31 | <glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> | |
30 | 32 | <glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> |
31 | <glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> | |
32 | <glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> | |
33 | <glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> | |
34 | <glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> | |
35 | <glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> | |
36 | <glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> | |
37 | <glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> | |
38 | <glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> | |
39 | <glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> | |
40 | <glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> | |
41 | <glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> | |
42 | <glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
43 | <glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
44 | <glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
45 | <glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> | |
46 | <glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> | |
47 | <glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> | |
48 | <glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> | |
49 | <glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> | |
50 | <glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> | |
51 | <glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> | |
52 | <glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> | |
53 | <glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> | |
54 | <glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> | |
55 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> | |
56 | <glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> | |
57 | <glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> | |
58 | <glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> | |
59 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> | |
60 | <glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> | |
61 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> | |
62 | <glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> | |
63 | <glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> | |
64 | <glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> | |
65 | <glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> | |
66 | <glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> | |
67 | <glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> | |
68 | <glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> | |
69 | <glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> | |
70 | <glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> | |
71 | <glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> | |
72 | <glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> | |
73 | <glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> | |
74 | <glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> | |
75 | <glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> | |
76 | <glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> | |
77 | <glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> | |
78 | <glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> | |
79 | <glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> | |
80 | <glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> | |
81 | <glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> | |
82 | <glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> | |
83 | <glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> | |
84 | <glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> | |
85 | <glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> | |
86 | <glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> | |
87 | <glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> | |
88 | <glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> | |
89 | <glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> | |
90 | <glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> | |
91 | <glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> | |
92 | <glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> | |
93 | <glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> | |
94 | <glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> | |
95 | <glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> | |
96 | <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> | |
97 | <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> | |
98 | <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> | |
99 | <glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> | |
100 | <glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
101 | <glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
102 | <glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> | |
103 | <glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> | |
104 | <glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> | |
105 | <glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> | |
106 | <glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> | |
107 | <glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> | |
108 | <glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> | |
109 | <glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> | |
110 | <glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> | |
111 | <glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> | |
112 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> | |
113 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> | |
114 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> | |
115 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> | |
116 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> | |
117 | <glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> | |
118 | <glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> | |
119 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> | |
120 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> | |
121 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> | |
122 | <glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> | |
123 | <glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> | |
124 | <glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> | |
125 | <glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> | |
126 | <glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> | |
127 | <glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> | |
128 | <glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> | |
129 | <glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> | |
130 | <glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> | |
131 | <glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> | |
132 | <glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> | |
133 | <glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> | |
134 | <glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> | |
135 | <glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> | |
136 | <glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> | |
137 | <glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> | |
138 | <glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> | |
139 | <glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> | |
140 | <glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> | |
141 | <glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> | |
142 | <glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> | |
143 | <glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> | |
144 | <glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> | |
145 | <glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> | |
146 | <glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> | |
147 | <glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> | |
148 | <glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> | |
149 | <glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> | |
150 | <glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> | |
151 | <glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> | |
152 | <glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> | |
153 | <glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> | |
154 | <glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> | |
155 | <glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> | |
156 | <glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> | |
157 | <glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> | |
158 | <glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> | |
159 | <glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> | |
160 | <glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> | |
161 | <glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> | |
162 | <glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> | |
163 | <glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> | |
164 | <glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> | |
165 | <glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> | |
166 | <glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> | |
167 | <glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> | |
168 | <glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> | |
169 | <glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> | |
170 | <glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> | |
171 | <glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> | |
172 | <glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> | |
173 | <glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> | |
174 | <glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> | |
175 | <glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> | |
176 | <glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> | |
177 | <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> | |
178 | <glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> | |
179 | <glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> | |
180 | <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> | |
181 | <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> | |
182 | <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> | |
183 | <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> | |
184 | <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> | |
185 | <glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> | |
186 | <glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> | |
187 | <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> | |
188 | <glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> | |
189 | <glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> | |
190 | <glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> | |
191 | <glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> | |
192 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> | |
193 | <glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> | |
194 | <glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> | |
195 | <glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> | |
196 | <glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> | |
197 | <glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> | |
198 | <glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> | |
199 | <glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> | |
200 | <glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> | |
201 | <glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> | |
202 | <glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> | |
203 | <glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> | |
204 | <glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> | |
205 | <glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> | |
206 | <glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> | |
207 | <glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> | |
208 | <glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> | |
209 | <glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> | |
210 | <glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> | |
211 | <glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> | |
212 | <glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> | |
213 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> | |
214 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> | |
215 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> | |
216 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> | |
217 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> | |
218 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> | |
219 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> | |
220 | <glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> | |
221 | <glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> | |
222 | <glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> | |
223 | <glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> | |
224 | <glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> | |
225 | <glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> | |
226 | <glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> | |
33 | <glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> | |
34 | <glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> | |
35 | <glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> | |
36 | <glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> | |
37 | <glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> | |
38 | <glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> | |
39 | <glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> | |
40 | <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> | |
41 | <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> | |
42 | <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> | |
43 | <glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> | |
44 | <glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> | |
45 | <glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> | |
46 | <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> | |
47 | <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> | |
48 | <glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> | |
49 | <glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> | |
50 | <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> | |
51 | <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> | |
52 | <glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> | |
53 | <glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> | |
54 | <glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> | |
55 | <glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> | |
56 | <glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> | |
57 | <glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> | |
58 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> | |
59 | <glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> | |
60 | <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> | |
61 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> | |
62 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> | |
63 | <glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> | |
64 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> | |
65 | <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> | |
66 | <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> | |
67 | <glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> | |
68 | <glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> | |
69 | <glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> | |
70 | <glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> | |
71 | <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> | |
72 | <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> | |
73 | <glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> | |
74 | <glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> | |
75 | <glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> | |
76 | <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> | |
77 | <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> | |
78 | <glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> | |
79 | <glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> | |
80 | <glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> | |
81 | <glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> | |
82 | <glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> | |
83 | <glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> | |
84 | <glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> | |
85 | <glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> | |
86 | <glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> | |
87 | <glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
88 | <glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
89 | <glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> | |
90 | <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
91 | <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
92 | <glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
93 | <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
94 | <glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> | |
95 | <glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> | |
96 | <glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> | |
97 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> | |
98 | <glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> | |
99 | <glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> | |
100 | <glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> | |
101 | <glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> | |
102 | <glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> | |
103 | <glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> | |
104 | <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> | |
105 | <glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> | |
106 | <glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> | |
107 | <glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> | |
108 | <glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> | |
109 | <glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> | |
110 | <glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> | |
111 | <glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> | |
112 | <glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
113 | <glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> | |
114 | <glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> | |
115 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> | |
116 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> | |
117 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> | |
118 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> | |
119 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> | |
120 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> | |
121 | <glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> | |
122 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> | |
123 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> | |
124 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> | |
125 | <glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> | |
126 | <glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> | |
127 | <glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> | |
128 | <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> | |
129 | <glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> | |
130 | <glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> | |
131 | <glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> | |
132 | <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> | |
133 | <glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> | |
134 | <glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> | |
135 | <glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> | |
136 | <glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> | |
137 | <glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> | |
138 | <glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> | |
139 | <glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> | |
140 | <glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> | |
141 | <glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> | |
142 | <glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> | |
143 | <glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> | |
144 | <glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> | |
145 | <glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> | |
146 | <glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> | |
147 | <glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> | |
148 | <glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> | |
149 | <glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> | |
150 | <glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> | |
151 | <glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> | |
152 | <glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> | |
153 | <glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> | |
154 | <glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> | |
155 | <glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> | |
156 | <glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> | |
157 | <glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> | |
158 | <glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> | |
159 | <glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> | |
160 | <glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> | |
161 | <glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> | |
162 | <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> | |
163 | <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> | |
164 | <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> | |
165 | <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> | |
166 | <glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> | |
167 | <glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> | |
168 | <glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> | |
169 | <glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> | |
170 | <glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> | |
171 | <glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> | |
172 | <glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> | |
173 | <glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> | |
174 | <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> | |
175 | <glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> | |
176 | <glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> | |
177 | <glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> | |
178 | <glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> | |
179 | <glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> | |
180 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> | |
181 | <glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> | |
182 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> | |
183 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> | |
184 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> | |
185 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> | |
186 | <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> | |
187 | <glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> | |
188 | <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> | |
189 | <glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> | |
190 | <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> | |
191 | <glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> | |
192 | <glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> | |
193 | <glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> | |
194 | <glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> | |
195 | <glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> | |
196 | <glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> | |
197 | <glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> | |
198 | <glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> | |
199 | <glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> | |
200 | <glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> | |
201 | <glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> | |
202 | <glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> | |
203 | <glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> | |
204 | <glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> | |
205 | <glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> | |
206 | <glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> | |
207 | <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> | |
208 | <glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> | |
209 | <glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> | |
210 | <glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> | |
211 | <glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> | |
212 | <glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> | |
213 | <glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> | |
214 | <glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
215 | <glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> | |
216 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> | |
217 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> | |
218 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> | |
219 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> | |
220 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> | |
221 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> | |
222 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> | |
223 | <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> | |
224 | <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> | |
225 | <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> | |
226 | <glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> | |
227 | <glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> | |
228 | <glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> | |
229 | <glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> | |
230 | <glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> | |
231 | <glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> | |
232 | <glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> | |
233 | <glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> | |
234 | <glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> | |
235 | <glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> | |
236 | <glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> | |
237 | <glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> | |
238 | <glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
239 | <glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
240 | <glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
241 | <glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
242 | <glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> | |
243 | <glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> | |
244 | <glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> | |
245 | <glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> | |
246 | <glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> | |
247 | <glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> | |
248 | <glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> | |
249 | <glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> | |
250 | <glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> | |
251 | <glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> | |
252 | <glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> | |
253 | <glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> | |
254 | <glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> | |
255 | <glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> | |
256 | <glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> | |
257 | <glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> | |
258 | <glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> | |
259 | <glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> | |
260 | <glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> | |
261 | <glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> | |
262 | <glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> | |
263 | <glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> | |
264 | <glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> | |
265 | <glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> | |
266 | <glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> | |
267 | <glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> | |
268 | <glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> | |
269 | <glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> | |
270 | <glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> | |
271 | <glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> | |
272 | <glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> | |
273 | <glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> | |
274 | <glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> | |
275 | <glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> | |
276 | <glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> | |
277 | <glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> | |
278 | <glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> | |
279 | <glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> | |
280 | <glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> | |
281 | <glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> | |
282 | <glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> | |
283 | <glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> | |
284 | <glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> | |
285 | <glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> | |
227 | 286 | </font> |
228 | 287 | </defs></svg> ⏎ |
Binary diff not shown
Binary diff not shown
143 | 143 | <script type="text/javascript" src="scripts/statusReport/controllers/modalNew.js"></script> |
144 | 144 | <script type="text/javascript" src="scripts/statusReport/directives/textCollapse.js"></script> |
145 | 145 | <script type="text/javascript" src="scripts/statusReport/directives/appendSearchParam.js"></script> |
146 | <script type="text/javascript" src="scripts/statusReport/directives/autofocus.js"></script> | |
147 | <script type="text/javascript" src="scripts/statusReport/directives/customField.js"></script> | |
148 | <script type="text/javascript" src="scripts/statusReport/directives/checkCustomType.js"></script> | |
146 | 149 | <script type="text/javascript" src="scripts/statusReport/providers/target.js"></script> |
147 | 150 | <script type="text/javascript" src="scripts/statusReport/providers/reference.js"></script> |
148 | 151 | <script type="text/javascript" src="scripts/statusReport/providers/parser.js"></script> |
0 | 0 | /*! |
1 | * Bootstrap v3.1.1 (http://getbootstrap.com) | |
2 | * Copyright 2011-2014 Twitter, Inc. | |
1 | * Bootstrap v3.4.0 (https://getbootstrap.com/) | |
2 | * Copyright 2011-2018 Twitter, Inc. | |
3 | 3 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
4 | */ | |
5 | ||
6 | .btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#2e97bd 0,#2e97bd 100%);background-image:linear-gradient(to bottom,#2e97bd 0,#2e97bd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e97bd', endColorstr='#ff2e97bd', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#278eaa}.btn-primary:hover,.btn-primary:focus{background-color:#2e97bd;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2e97bd;border-color:#278eaa}.btn-success{background-image:-webkit-linear-gradient(top,#cae388 0,#a1ce32 100%);background-image:linear-gradient(to bottom,#cae388 0,#a1ce32 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffcae388', endColorstr='#ffa1ce32', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#9dbf30}.btn-success:hover,.btn-success:focus{background-color:#a1ce32;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#a1ce32;border-color:#9dbf30}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#e66462 0,#df3936 100%);background-image:linear-gradient(to bottom,#e66462 0,#df3936 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe66462', endColorstr='#ffdf3936', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#d13434}.btn-danger:hover,.btn-danger:focus{background-color:#df3936;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#df3936;border-color:#d13434}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top,#2e97bd 0,#357ebd 100%);background-image:linear-gradient(to bottom,#2e97bd 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e97bd', endColorstr='#ff357ebd', GradientType=0);background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#2e97bd 0,#3071a9 100%);background-image:linear-gradient(to bottom,#2e97bd 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e97bd', endColorstr='#ff3071a9', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#2e97bd 0,#3278b3 100%);background-image:linear-gradient(to bottom,#2e97bd 0,#3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e97bd', endColorstr='#ff3278b3', GradientType=0);border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#2e97bd 0,#357ebd 100%);background-image:linear-gradient(to bottom,#2e97bd 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e97bd', endColorstr='#ff357ebd', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}⏎ | |
4 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} | |
5 | /*# sourceMappingURL=bootstrap-theme.min.css.map */⏎ |
0 | 0 | /*! |
1 | * Bootstrap v3.3.7 (http://getbootstrap.com) | |
2 | * Copyright 2011-2016 Twitter, Inc. | |
1 | * Bootstrap v3.4.0 (https://getbootstrap.com/) | |
2 | * Copyright 2011-2018 Twitter, Inc. | |
3 | 3 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
4 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} | |
4 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} | |
5 | 5 | /*# sourceMappingURL=bootstrap.min.css.map */⏎ |
0 | 0 | /*! |
1 | * Bootstrap v3.3.7 (http://getbootstrap.com) | |
2 | * Copyright 2011-2016 Twitter, Inc. | |
1 | * Bootstrap v3.4.0 (https://getbootstrap.com/) | |
2 | * Copyright 2011-2018 Twitter, Inc. | |
3 | 3 | * Licensed under the MIT license |
4 | 4 | */ |
5 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){ | |
6 | this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e<c&&"top";if("bottom"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&"bottom":!(e+g<=a-d)&&"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?"top":null!=d&&i+j>=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);⏎ | |
5 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3<e[0])throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(),function(n){"use strict";n.fn.emulateTransitionEnd=function(t){var e=!1,i=this;n(this).one("bsTransitionEnd",function(){e=!0});return setTimeout(function(){e||n(i).trigger(n.support.transition.end)},t),this},n(function(){n.support.transition=function o(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(t.style[i]!==undefined)return{end:e[i]};return!1}(),n.support.transition&&(n.event.special.bsTransitionEnd={bindType:n.support.transition.end,delegateType:n.support.transition.end,handle:function(t){if(n(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(s){"use strict";var e='[data-dismiss="alert"]',a=function(t){s(t).on("click",e,this.close)};a.VERSION="3.4.0",a.TRANSITION_DURATION=150,a.prototype.close=function(t){var e=s(this),i=e.attr("data-target");i||(i=(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=s(document).find(i);function n(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=e.closest(".alert")),o.trigger(t=s.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),s.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",n).emulateTransitionEnd(a.TRANSITION_DURATION):n())};var t=s.fn.alert;s.fn.alert=function o(i){return this.each(function(){var t=s(this),e=t.data("bs.alert");e||t.data("bs.alert",e=new a(this)),"string"==typeof i&&e[i].call(t)})},s.fn.alert.Constructor=a,s.fn.alert.noConflict=function(){return s.fn.alert=t,this},s(document).on("click.bs.alert.data-api",e,a.prototype.close)}(jQuery),function(s){"use strict";var n=function(t,e){this.$element=s(t),this.options=s.extend({},n.DEFAULTS,e),this.isLoading=!1};function i(o){return this.each(function(){var t=s(this),e=t.data("bs.button"),i="object"==typeof o&&o;e||t.data("bs.button",e=new n(this,i)),"toggle"==o?e.toggle():o&&e.setState(o)})}n.VERSION="3.4.0",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var e="disabled",i=this.$element,o=i.is("input")?"val":"html",n=i.data();t+="Text",null==n.resetText&&i.data("resetText",i[o]()),setTimeout(s.proxy(function(){i[o](null==n[t]?this.options[t]:n[t]),"loadingText"==t?(this.isLoading=!0,i.addClass(e).attr(e,e).prop(e,!0)):this.isLoading&&(this.isLoading=!1,i.removeClass(e).removeAttr(e).prop(e,!1))},this),0)},n.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var t=s.fn.button;s.fn.button=i,s.fn.button.Constructor=n,s.fn.button.noConflict=function(){return s.fn.button=t,this},s(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(t){var e=s(t.target).closest(".btn");i.call(e,"toggle"),s(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),e.is("input,button")?e.trigger("focus"):e.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){s(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(p){"use strict";var c=function(t,e){this.$element=p(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=e,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",p.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",p.proxy(this.pause,this)).on("mouseleave.bs.carousel",p.proxy(this.cycle,this))};function r(n){return this.each(function(){var t=p(this),e=t.data("bs.carousel"),i=p.extend({},c.DEFAULTS,t.data(),"object"==typeof n&&n),o="string"==typeof n?n:i.slide;e||t.data("bs.carousel",e=new c(this,i)),"number"==typeof n?e.to(n):o?e[o]():i.interval&&e.pause().cycle()})}c.VERSION="3.4.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},c.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(p.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},c.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if(("prev"==t&&0===i||"next"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var o=(i+("prev"==t?-1:1))%this.$items.length;return this.$items.eq(o)},c.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(i<t?"next":"prev",this.$items.eq(t))},c.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&p.support.transition&&(this.$element.trigger(p.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(t,e){var i=this.$element.find(".item.active"),o=e||this.getItemForDirection(t,i),n=this.interval,s="next"==t?"left":"right",a=this;if(o.hasClass("active"))return this.sliding=!1;var r=o[0],l=p.Event("slide.bs.carousel",{relatedTarget:r,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var h=p(this.$indicators.children()[this.getItemIndex(o)]);h&&h.addClass("active")}var d=p.Event("slid.bs.carousel",{relatedTarget:r,direction:s});return p.support.transition&&this.$element.hasClass("slide")?(o.addClass(t),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one("bsTransitionEnd",function(){o.removeClass([t,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger(d)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var t=p.fn.carousel;p.fn.carousel=r,p.fn.carousel.Constructor=c,p.fn.carousel.noConflict=function(){return p.fn.carousel=t,this};var e=function(t){var e=p(this),i=e.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=e.attr("data-target")||i,n=p(document).find(o);if(n.hasClass("carousel")){var s=p.extend({},n.data(),e.data()),a=e.attr("data-slide-to");a&&(s.interval=!1),r.call(n,s),a&&n.data("bs.carousel").to(a),t.preventDefault()}};p(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),p(window).on("load",function(){p('[data-ride="carousel"]').each(function(){var t=p(this);r.call(t,t.data())})})}(jQuery),function(a){"use strict";var r=function(t,e){this.$element=a(t),this.options=a.extend({},r.DEFAULTS,e),this.$trigger=a('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var e,i=t.attr("data-target")||(e=t.attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"");return a(document).find(i)}function l(o){return this.each(function(){var t=a(this),e=t.data("bs.collapse"),i=a.extend({},r.DEFAULTS,t.data(),"object"==typeof o&&o);!e&&i.toggle&&/show|hide/.test(o)&&(i.toggle=!1),e||t.data("bs.collapse",e=new r(this,i)),"string"==typeof o&&e[o]()})}r.VERSION="3.4.0",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(t=e.data("bs.collapse"))&&t.transitioning)){var i=a.Event("show.bs.collapse");if(this.$element.trigger(i),!i.isDefaultPrevented()){e&&e.length&&(l.call(e,"hide"),t||e.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var n=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return n.call(this);var s=a.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",a.proxy(n,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[o](this.$element[0][s])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=a.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var e=this.dimension();this.$element[e](this.$element[e]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!a.support.transition)return i.call(this);this.$element[e](0).one("bsTransitionEnd",a.proxy(i,this)).emulateTransitionEnd(r.TRANSITION_DURATION)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(t,e){var i=a(e);this.addAriaAndCollapsedClass(n(i),i)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var t=a.fn.collapse;a.fn.collapse=l,a.fn.collapse.Constructor=r,a.fn.collapse.noConflict=function(){return a.fn.collapse=t,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(t){var e=a(this);e.attr("data-target")||t.preventDefault();var i=n(e),o=i.data("bs.collapse")?"toggle":e.data();l.call(i,o)})}(jQuery),function(a){"use strict";var r='[data-toggle="dropdown"]',o=function(t){a(t).on("click.bs.dropdown",this.toggle)};function l(t){var e=t.attr("data-target");e||(e=(e=t.attr("href"))&&/#[A-Za-z]/.test(e)&&e.replace(/.*(?=#[^\s]*$)/,""));var i=e&&a(document).find(e);return i&&i.length?i:t.parent()}function s(o){o&&3===o.which||(a(".dropdown-backdrop").remove(),a(r).each(function(){var t=a(this),e=l(t),i={relatedTarget:this};e.hasClass("open")&&(o&&"click"==o.type&&/input|textarea/i.test(o.target.tagName)&&a.contains(e[0],o.target)||(e.trigger(o=a.Event("hide.bs.dropdown",i)),o.isDefaultPrevented()||(t.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",i)))))}))}o.VERSION="3.4.0",o.prototype.toggle=function(t){var e=a(this);if(!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(s(),!o){"ontouchstart"in document.documentElement&&!i.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",s);var n={relatedTarget:this};if(i.trigger(t=a.Event("show.bs.dropdown",n)),t.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),i.toggleClass("open").trigger(a.Event("shown.bs.dropdown",n))}return!1}},o.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var e=a(this);if(t.preventDefault(),t.stopPropagation(),!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(!o&&27!=t.which||o&&27==t.which)return 27==t.which&&i.find(r).trigger("focus"),e.trigger("click");var n=i.find(".dropdown-menu li:not(.disabled):visible a");if(n.length){var s=n.index(t.target);38==t.which&&0<s&&s--,40==t.which&&s<n.length-1&&s++,~s||(s=0),n.eq(s).trigger("focus")}}}};var t=a.fn.dropdown;a.fn.dropdown=function e(i){return this.each(function(){var t=a(this),e=t.data("bs.dropdown");e||t.data("bs.dropdown",e=new o(this)),"string"==typeof i&&e[i].call(t)})},a.fn.dropdown.Constructor=o,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=t,this},a(document).on("click.bs.dropdown.data-api",s).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",r,o.prototype.toggle).on("keydown.bs.dropdown.data-api",r,o.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",o.prototype.keydown)}(jQuery),function(a){"use strict";var s=function(t,e){this.options=e,this.$body=a(document.body),this.$element=a(t),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.fixedContent=".navbar-fixed-top, .navbar-fixed-bottom",this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};function r(o,n){return this.each(function(){var t=a(this),e=t.data("bs.modal"),i=a.extend({},s.DEFAULTS,t.data(),"object"==typeof o&&o);e||t.data("bs.modal",e=new s(this,i)),"string"==typeof o?e[o](n):i.show&&e.show(n)})}s.VERSION="3.4.0",s.TRANSITION_DURATION=300,s.BACKDROP_TRANSITION_DURATION=150,s.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},s.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},s.prototype.show=function(i){var o=this,t=a.Event("show.bs.modal",{relatedTarget:i});this.$element.trigger(t),this.isShown||t.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){o.$element.one("mouseup.dismiss.bs.modal",function(t){a(t.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var t=a.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),t&&o.$element[0].offsetWidth,o.$element.addClass("in"),o.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:i});t?o.$dialog.one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(s.TRANSITION_DURATION):o.$element.trigger("focus").trigger(e)}))},s.prototype.hide=function(t){t&&t.preventDefault(),t=a.Event("hide.bs.modal"),this.$element.trigger(t),this.isShown&&!t.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(s.TRANSITION_DURATION):this.hideModal())},s.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},s.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},s.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},s.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},s.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},s.prototype.backdrop=function(t){var e=this,i=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var o=a.support.transition&&i;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+i).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(t){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),o&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!t)return;o?this.$backdrop.one("bsTransitionEnd",t).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):t()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){e.removeBackdrop(),t&&t()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):n()}else t&&t()},s.prototype.handleUpdate=function(){this.adjustDialog()},s.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},s.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"";var n=this.scrollbarWidth;this.bodyIsOverflowing&&(this.$body.css("padding-right",t+n),a(this.fixedContent).each(function(t,e){var i=e.style.paddingRight,o=a(e).css("padding-right");a(e).data("padding-right",i).css("padding-right",parseFloat(o)+n+"px")}))},s.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad),a(this.fixedContent).each(function(t,e){var i=a(e).data("padding-right");a(e).removeData("padding-right"),e.style.paddingRight=i||""})},s.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var t=a.fn.modal;a.fn.modal=r,a.fn.modal.Constructor=s,a.fn.modal.noConflict=function(){return a.fn.modal=t,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(t){var e=a(this),i=e.attr("href"),o=e.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,""),n=a(document).find(o),s=n.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(i)&&i},n.data(),e.data());e.is("a")&&t.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){e.is(":visible")&&e.trigger("focus")})}),r.call(n,s,this)})}(jQuery),function(g){"use strict";var m=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};m.VERSION="3.4.0",m.TRANSITION_DURATION=150,m.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){return(t=g.extend({},this.getDefaults(),this.$element.data(),t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-d<c.top?"bottom":"right"==s&&l.right+h>c.width?"left":"left"==s&&l.left-h<c.left?"right":s,o.removeClass(p).addClass(s)}var f=this.getCalculatedOffset(s,l,h,d);this.applyPlacement(f,s);var u=function(){var t=i.hoverState;i.$element.trigger("shown.bs."+i.type),i.hoverState=null,"out"==t&&i.leave(i)};g.support.transition&&this.$tip.hasClass("fade")?o.one("bsTransitionEnd",u).emulateTransitionEnd(m.TRANSITION_DURATION):u()}},m.prototype.applyPlacement=function(t,e){var i=this.tip(),o=i[0].offsetWidth,n=i[0].offsetHeight,s=parseInt(i.css("margin-top"),10),a=parseInt(i.css("margin-left"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),t.top+=s,t.left+=a,g.offset.setOffset(i[0],g.extend({using:function(t){i.css({top:Math.round(t.top),left:Math.round(t.left)})}},t),0),i.addClass("in");var r=i[0].offsetWidth,l=i[0].offsetHeight;"top"==e&&l!=n&&(t.top=t.top+n-l);var h=this.getViewportAdjustedDelta(e,t,r,l);h.left?t.left+=h.left:t.top+=h.top;var d=/top|bottom/.test(e),p=d?2*h.left-o+r:2*h.top-n+l,c=d?"offsetWidth":"offsetHeight";i.offset(t),this.replaceArrow(p,i[0][c],d)},m.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},m.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},m.prototype.hide=function(t){var e=this,i=g(this.$tip),o=g.Event("hide.bs."+this.type);function n(){"in"!=e.hoverState&&i.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),t&&t()}if(this.$element.trigger(o),!o.isDefaultPrevented())return i.removeClass("in"),g.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",n).emulateTransitionEnd(m.TRANSITION_DURATION):n(),this.hoverState=null,this},m.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},m.prototype.hasContent=function(){return this.getTitle()},m.prototype.getPosition=function(t){var e=(t=t||this.$element)[0],i="BODY"==e.tagName,o=e.getBoundingClientRect();null==o.width&&(o=g.extend({},o,{width:o.right-o.left,height:o.bottom-o.top}));var n=window.SVGElement&&e instanceof window.SVGElement,s=i?{top:0,left:0}:n?null:t.offset(),a={scroll:i?document.documentElement.scrollTop||document.body.scrollTop:t.scrollTop()},r=i?{width:g(window).width(),height:g(window).height()}:null;return g.extend({},o,a,r,s)},m.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},m.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,a=this.getPosition(this.$viewport);if(/right|left/.test(t)){var r=e.top-s-a.scroll,l=e.top+s-a.scroll+o;r<a.top?n.top=a.top-r:l>a.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;h<a.left?n.left=a.left-h:d>a.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})};var t=g.fn.tooltip;g.fn.tooltip=function e(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=t,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.0",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.0",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e<n[0])return this.activeTarget=null,this.clear();for(t=n.length;t--;)a!=s[t]&&e>=n[t]&&(n[t+1]===undefined||e<n[t+1])&&this.activate(s[t])},n.prototype.activate=function(t){this.activeTarget=t,this.clear();var e=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',i=s(e).parents("li").addClass("active");i.parent(".dropdown-menu").length&&(i=i.closest("li.dropdown").addClass("active")),i.trigger("activate.bs.scrollspy")},n.prototype.clear=function(){s(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var t=s.fn.scrollspy;s.fn.scrollspy=e,s.fn.scrollspy.Constructor=n,s.fn.scrollspy.noConflict=function(){return s.fn.scrollspy=t,this},s(window).on("load.bs.scrollspy.data-api",function(){s('[data-spy="scroll"]').each(function(){var t=s(this);e.call(t,t.data())})})}(jQuery),function(r){"use strict";var a=function(t){this.element=r(t)};function e(i){return this.each(function(){var t=r(this),e=t.data("bs.tab");e||t.data("bs.tab",e=new a(this)),"string"==typeof i&&e[i]()})}a.VERSION="3.4.0",a.TRANSITION_DURATION=150,a.prototype.show=function(){var t=this.element,e=t.closest("ul:not(.dropdown-menu)"),i=t.data("target");if(i||(i=(i=t.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),!t.parent("li").hasClass("active")){var o=e.find(".active:last a"),n=r.Event("hide.bs.tab",{relatedTarget:t[0]}),s=r.Event("show.bs.tab",{relatedTarget:o[0]});if(o.trigger(n),t.trigger(s),!s.isDefaultPrevented()&&!n.isDefaultPrevented()){var a=r(document).find(i);this.activate(t.closest("li"),e),this.activate(a,a.parent(),function(){o.trigger({type:"hidden.bs.tab",relatedTarget:t[0]}),t.trigger({type:"shown.bs.tab",relatedTarget:o[0]})})}}},a.prototype.activate=function(t,e,i){var o=e.find("> .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.0",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n<i&&"top";if("bottom"==this.affixed)return null!=i?!(n+this.unpin<=s.top)&&"bottom":!(n+a<=t-o)&&"bottom";var r=null==this.affixed,l=r?n:s.top;return null!=i&&n<=i?"top":null!=o&&t-o<=l+(r?a:e)&&"bottom"},h.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(h.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},h.prototype.checkPositionWithEventLoop=function(){setTimeout(l.proxy(this.checkPosition,this),1)},h.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),e=this.options.offset,i=e.top,o=e.bottom,n=Math.max(l(document).height(),l(document.body).height());"object"!=typeof e&&(o=i=e),"function"==typeof i&&(i=e.top(this.$element)),"function"==typeof o&&(o=e.bottom(this.$element));var s=this.getState(n,t,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var a="affix"+(s?"-"+s:""),r=l.Event(a+".bs.affix");if(this.$element.trigger(r),r.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(h.RESET).addClass(a).trigger(a.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:n-t-o})}};var t=l.fn.affix;l.fn.affix=i,l.fn.affix.Constructor=h,l.fn.affix.noConflict=function(){return l.fn.affix=t,this},l(window).on("load",function(){l('[data-spy="affix"]').each(function(){var t=l(this),e=t.data();e.offset=e.offset||{},null!=e.offsetBottom&&(e.offset.bottom=e.offsetBottom),null!=e.offsetTop&&(e.offset.top=e.offsetTop),i.call(t,e)})})}(jQuery);⏎ |
402 | 402 | ServerAPI.getWorkspace = function (wsName) { |
403 | 403 | var getUrl = createDbUrl(wsName); |
404 | 404 | return get(getUrl); |
405 | } | |
406 | ||
407 | ServerAPI.getCustomFields = function () { | |
408 | return get(APIURL + "custom_fields_schema/"); | |
405 | 409 | } |
406 | 410 | |
407 | 411 | ServerAPI.activateWorkspace = function (wsName) { |
3 | 3 | |
4 | 4 | angular.module('faradayApp') |
5 | 5 | .controller('modalEditCtrl', |
6 | ['$modalInstance', '$routeParams','EASEOFRESOLUTION', 'STATUSES', 'commonsFact', | |
7 | 'BASEURL', 'severities', 'vuln', 'vulnModelsManager', 'vulnsManager', 'referenceFact', | |
8 | 'encodeURIComponentFilter', | |
9 | function($modalInstance, $routeParams,EASEOFRESOLUTION, STATUSES, commonsFact, | |
10 | BASEURL, severities, vuln, vulnModelsManager, vulnsManager, referenceFact, | |
11 | encodeURIComponent) { | |
12 | ||
13 | var vm = this; | |
14 | ||
15 | vm.baseurl; | |
16 | vm.saveAsModelDisabled = false; | |
17 | vm.easeofresolution; | |
18 | vm.new_ref; | |
19 | vm.new_policyviolation; | |
20 | vm.icons; | |
21 | vm.cweList; | |
22 | vm.cweLimit; | |
23 | vm.cwe_filter; | |
24 | ||
25 | vm.file_name_error; | |
26 | ||
27 | vm.data; | |
28 | vm.vuln; | |
29 | ||
30 | init = function() { | |
31 | vm.modelMessage = "Click here." | |
32 | vm.easeofresolution = EASEOFRESOLUTION; | |
33 | vm.severities = severities; | |
34 | vm.statuses = STATUSES; | |
35 | vm.new_ref = ""; | |
36 | vm.new_policyviolation = ""; | |
37 | vm.icons = {}; | |
38 | vm.baseurl = BASEURL; | |
39 | ||
40 | vm.cweList = []; | |
41 | vulnModelsManager.get().then(function(data) { | |
42 | vm.cweList = data; | |
43 | }); | |
44 | vm.cweLimit = 5; | |
45 | vm.cwe_filter = ""; | |
46 | ||
47 | vm.file_name_error = false; | |
48 | ||
49 | vm.data = { | |
50 | _id: undefined, | |
51 | _attachments: {}, | |
52 | confirmed: false, | |
53 | data: "", | |
54 | desc: "", | |
55 | easeofresolution: undefined, | |
56 | impact: { | |
57 | accountability: false, | |
58 | availability: false, | |
59 | confidentiality: false, | |
60 | integrity: false | |
61 | }, | |
62 | name: "", | |
63 | refs: {}, | |
64 | resolution: "", | |
65 | severity: undefined, | |
66 | method: "", | |
67 | path: "", | |
68 | pname: "", | |
69 | params: "", | |
70 | query: "", | |
71 | request: "", | |
72 | response: "", | |
73 | website: "", | |
74 | status: "opened", | |
75 | policyviolations: [] | |
76 | }; | |
77 | ||
78 | vm.vuln = angular.copy(vuln); | |
79 | ||
80 | vm.populate(vm.vuln); | |
81 | ||
82 | // TODO: EVIDENCE SHOUD BE LOADED ALREADY? | |
83 | if(vm.vuln._attachments !== undefined) { | |
84 | vm.data._attachments = vm.vuln._attachments; | |
85 | vm.icons = commonsFact.loadIcons(vm.data._attachments); | |
86 | } | |
87 | }; | |
88 | ||
89 | vm.saveAsModel = function() { | |
90 | vm.modelMessage = "Done." | |
91 | vm.vulnModelsManager.create(vm.data); | |
92 | vm.saveAsModelDisabled = true; | |
93 | }; | |
94 | ||
95 | vm.selectedFiles = function(files, e) { | |
96 | files.forEach(function(file) { | |
97 | file.newfile = true; | |
98 | if(file.name.charAt(0) != "_") { | |
99 | if(!vm.data._attachments.hasOwnProperty(file)) vm.data._attachments[file.name] = file; | |
100 | } else { | |
101 | vm.file_name_error = true; | |
6 | ['$modalInstance', '$routeParams', 'EASEOFRESOLUTION', 'STATUSES', 'commonsFact', | |
7 | 'BASEURL', 'severities', 'vuln', 'vulnModelsManager', 'vulnsManager', 'referenceFact', | |
8 | 'encodeURIComponentFilter', 'customFields', | |
9 | function ($modalInstance, $routeParams, EASEOFRESOLUTION, STATUSES, commonsFact, | |
10 | BASEURL, severities, vuln, vulnModelsManager, vulnsManager, referenceFact, | |
11 | encodeURIComponent, customFields) { | |
12 | ||
13 | var vm = this; | |
14 | ||
15 | vm.baseurl; | |
16 | vm.saveAsModelDisabled = false; | |
17 | vm.easeofresolution; | |
18 | vm.new_ref; | |
19 | vm.new_policyviolation; | |
20 | vm.icons; | |
21 | vm.cweList; | |
22 | vm.cweLimit; | |
23 | vm.cwe_filter; | |
24 | ||
25 | vm.file_name_error; | |
26 | ||
27 | vm.data; | |
28 | vm.vuln; | |
29 | ||
30 | init = function () { | |
31 | vm.modelMessage = "Click here." | |
32 | vm.easeofresolution = EASEOFRESOLUTION; | |
33 | vm.severities = severities; | |
34 | vm.statuses = STATUSES; | |
35 | vm.new_ref = ""; | |
36 | vm.new_policyviolation = ""; | |
37 | vm.icons = {}; | |
38 | vm.baseurl = BASEURL; | |
39 | ||
40 | vm.cweList = []; | |
41 | vulnModelsManager.get().then(function (data) { | |
42 | vm.cweList = data; | |
43 | }); | |
44 | vm.cweLimit = 5; | |
45 | vm.cwe_filter = ""; | |
46 | ||
47 | vm.file_name_error = false; | |
48 | ||
49 | vm.customFields = customFields; | |
50 | ||
51 | vm.data = { | |
52 | _id: undefined, | |
53 | _attachments: {}, | |
54 | confirmed: false, | |
55 | data: "", | |
56 | desc: "", | |
57 | easeofresolution: undefined, | |
58 | impact: { | |
59 | accountability: false, | |
60 | availability: false, | |
61 | confidentiality: false, | |
62 | integrity: false | |
63 | }, | |
64 | name: "", | |
65 | refs: {}, | |
66 | resolution: "", | |
67 | severity: undefined, | |
68 | method: "", | |
69 | path: "", | |
70 | pname: "", | |
71 | params: "", | |
72 | query: "", | |
73 | request: "", | |
74 | response: "", | |
75 | type: "Vulnerability", | |
76 | website: "", | |
77 | status: "opened", | |
78 | policyviolations: [], | |
79 | custom_fields:{} | |
80 | }; | |
81 | ||
82 | vm.vuln = angular.copy(vuln); | |
83 | ||
84 | vm.populate(vm.vuln); | |
85 | ||
86 | // TODO: EVIDENCE SHOUD BE LOADED ALREADY? | |
87 | if (vm.vuln._attachments !== undefined) { | |
88 | vm.data._attachments = vm.vuln._attachments; | |
89 | vm.icons = commonsFact.loadIcons(vm.data._attachments); | |
90 | } | |
91 | ||
92 | angular.element('#nav-tabs-container a[data-target="#general"]').click(); | |
93 | }; | |
94 | ||
95 | vm.saveAsModel = function () { | |
96 | vm.modelMessage = "Done." | |
97 | vm.vulnModelsManager.create(vm.data); | |
98 | vm.saveAsModelDisabled = true; | |
99 | }; | |
100 | ||
101 | vm.selectedFiles = function (files, e) { | |
102 | files.forEach(function (file) { | |
103 | file.newfile = true; | |
104 | if (file.name.charAt(0) != "_") { | |
105 | if (!vm.data._attachments.hasOwnProperty(file)) vm.data._attachments[file.name] = file; | |
106 | } else { | |
107 | vm.file_name_error = true; | |
108 | } | |
109 | }); | |
110 | vm.icons = commonsFact.loadIcons(vm._attachments); | |
102 | 111 | } |
103 | }); | |
104 | vm.icons = commonsFact.loadIcons(vm._attachments); | |
105 | } | |
106 | ||
107 | vm.removeEvidence = function(name) { | |
108 | delete vm.data._attachments[name]; | |
109 | delete vm.icons[name]; | |
110 | }; | |
111 | ||
112 | vm.toggleImpact = function(key) { | |
113 | vm.data.impact[key] = !vm.data.impact[key]; | |
114 | }; | |
115 | ||
116 | vm.ok = function() { | |
117 | // add the ref in new_ref, if there's any | |
118 | vm.newReference(); | |
119 | // convert refs to an array of strings | |
120 | var refs = []; | |
121 | vm.data.refs.forEach(function(ref) { | |
122 | refs.push(ref.value); | |
123 | }); | |
124 | vm.data.refs = refs; | |
125 | ||
126 | // add the policy violation in new_policyviolation, if there's any | |
127 | vm.newPolicyViolation(); | |
128 | // convert policy violations to an array of strings | |
129 | var policyviolations = []; | |
130 | vm.data.policyviolations.forEach(function(policyviolation) { | |
131 | policyviolations.push(policyviolation.value); | |
132 | }); | |
133 | vm.data.policyviolations = policyviolations; | |
134 | ||
135 | vulnsManager.updateVuln(vm.vuln, vm.data).then(function(){ | |
136 | $modalInstance.close(vm.data); | |
137 | }, function(data){ | |
138 | commonsFact.showMessage("Error updating vuln " + vm.vuln.name + " (" + vm.vuln._id + "): " + (data.message || JSON.stringify(data.messages))); | |
139 | }); | |
140 | ||
141 | ||
142 | }; | |
143 | ||
144 | vm.cancel = function() { | |
145 | $modalInstance.dismiss('cancel'); | |
146 | }; | |
147 | ||
148 | vm.newReference = function() { | |
149 | if (vm.new_ref != "") { | |
150 | // we need to check if the ref already exists | |
151 | if (vm.data.refs.filter(function(ref) {return ref.value === vm.new_ref}).length == 0) { | |
152 | vm.data.refs.push({value: vm.new_ref}); | |
153 | vm.new_ref = ""; | |
154 | } | |
155 | } | |
156 | }; | |
157 | ||
158 | vm.openReference = function(text) { | |
159 | window.open(referenceFact.processReference(text), '_blank'); | |
160 | }; | |
161 | ||
162 | vm.openEvidence = function(name) { | |
163 | var currentEvidence = vm.data._attachments[name]; | |
164 | if (!currentEvidence.newfile) | |
165 | window.open(vm.baseurl + '_api/v2/ws/' + $routeParams.wsId + '/vulns/' + vm.data._id + '/attachment/' + encodeURIComponent(name), '_blank'); | |
166 | }; | |
167 | ||
168 | vm.newPolicyViolation = function() { | |
169 | if (vm.new_policyviolation != "") { | |
170 | // we need to check if the policy violation already exists | |
171 | if (vm.data.policyviolations.filter(function(policyviolation) {return policyviolation.value === vm.new_policyviolation}).length == 0) { | |
172 | vm.data.policyviolations.push({value: vm.new_policyviolation}); | |
173 | vm.new_policyviolation = ""; | |
174 | } | |
175 | } | |
176 | }; | |
177 | ||
178 | vm.populate = function(item) { | |
179 | for (var key in vm.data) { | |
180 | if (key != "refs" && key != "policyviolations" && item.hasOwnProperty(key) && vm.data.hasOwnProperty(key)) { | |
181 | vm.data[key] = item[key]; | |
182 | } | |
183 | } | |
184 | // convert refs to an array of objects | |
185 | var refs = []; | |
186 | item.refs.forEach(function(ref) { | |
187 | refs.push({value: ref}); | |
188 | }); | |
189 | vm.data.refs = refs; | |
190 | ||
191 | // convert policyviolations to an array of objects | |
192 | var policyviolations = []; | |
193 | item.policyviolations.forEach(function(policyviolation) { | |
194 | policyviolations.push({value: policyviolation}); | |
195 | }); | |
196 | vm.data.policyviolations = policyviolations; | |
197 | }; | |
198 | ||
199 | init(); | |
200 | }]); | |
112 | ||
113 | vm.removeEvidence = function (name) { | |
114 | delete vm.data._attachments[name]; | |
115 | delete vm.icons[name]; | |
116 | }; | |
117 | ||
118 | vm.toggleImpact = function (key) { | |
119 | vm.data.impact[key] = !vm.data.impact[key]; | |
120 | }; | |
121 | ||
122 | vm.ok = function () { | |
123 | // add the ref in new_ref, if there's any | |
124 | vm.newReference(); | |
125 | // convert refs to an array of strings | |
126 | var refs = []; | |
127 | vm.data.refs.forEach(function (ref) { | |
128 | refs.push(ref.value); | |
129 | }); | |
130 | vm.data.refs = refs; | |
131 | ||
132 | // add the policy violation in new_policyviolation, if there's any | |
133 | vm.newPolicyViolation(); | |
134 | // convert policy violations to an array of strings | |
135 | var policyviolations = []; | |
136 | vm.data.policyviolations.forEach(function (policyviolation) { | |
137 | policyviolations.push(policyviolation.value); | |
138 | }); | |
139 | vm.data.policyviolations = policyviolations; | |
140 | ||
141 | vulnsManager.updateVuln(vm.vuln, vm.data).then(function () { | |
142 | $modalInstance.close(vm.data); | |
143 | }, function (data) { | |
144 | commonsFact.showMessage("Error updating vuln " + vm.vuln.name + " (" + vm.vuln._id + "): " + (data.message || JSON.stringify(data.messages))); | |
145 | }); | |
146 | ||
147 | ||
148 | }; | |
149 | ||
150 | vm.cancel = function () { | |
151 | $modalInstance.dismiss('cancel'); | |
152 | }; | |
153 | ||
154 | vm.newReference = function () { | |
155 | if (vm.new_ref != "") { | |
156 | // we need to check if the ref already exists | |
157 | if (vm.data.refs.filter(function (ref) { | |
158 | return ref.value === vm.new_ref | |
159 | }).length == 0) { | |
160 | vm.data.refs.push({value: vm.new_ref}); | |
161 | vm.new_ref = ""; | |
162 | } | |
163 | } | |
164 | }; | |
165 | ||
166 | vm.openReference = function (text) { | |
167 | window.open(referenceFact.processReference(text), '_blank'); | |
168 | }; | |
169 | ||
170 | vm.openEvidence = function (name) { | |
171 | var currentEvidence = vm.data._attachments[name]; | |
172 | if (!currentEvidence.newfile) | |
173 | window.open(vm.baseurl + '_api/v2/ws/' + $routeParams.wsId + '/vulns/' + vm.data._id + '/attachment/' + encodeURIComponent(name), '_blank'); | |
174 | }; | |
175 | ||
176 | vm.newPolicyViolation = function () { | |
177 | if (vm.new_policyviolation != "") { | |
178 | // we need to check if the policy violation already exists | |
179 | if (vm.data.policyviolations.filter(function (policyviolation) { | |
180 | return policyviolation.value === vm.new_policyviolation | |
181 | }).length == 0) { | |
182 | vm.data.policyviolations.push({value: vm.new_policyviolation}); | |
183 | vm.new_policyviolation = ""; | |
184 | } | |
185 | } | |
186 | }; | |
187 | ||
188 | vm.populate = function (item) { | |
189 | for (var key in vm.data) { | |
190 | if (key != "refs" && key != "policyviolations" && item.hasOwnProperty(key) && vm.data.hasOwnProperty(key)) { | |
191 | vm.data[key] = item[key]; | |
192 | } | |
193 | } | |
194 | // convert refs to an array of objects | |
195 | var refs = []; | |
196 | item.refs.forEach(function (ref) { | |
197 | refs.push({value: ref}); | |
198 | }); | |
199 | vm.data.refs = refs; | |
200 | ||
201 | // convert policyviolations to an array of objects | |
202 | var policyviolations = []; | |
203 | item.policyviolations.forEach(function (policyviolation) { | |
204 | policyviolations.push({value: policyviolation}); | |
205 | }); | |
206 | vm.data.policyviolations = policyviolations; | |
207 | }; | |
208 | ||
209 | ||
210 | vm.updateBtnSeverityColor = function (severity) { | |
211 | var color = undefined; | |
212 | switch (severity) { | |
213 | case "unclassified": | |
214 | color = '#999999'; | |
215 | break; | |
216 | case "info": | |
217 | color = '#2e97bd'; | |
218 | break; | |
219 | case "low": | |
220 | color = '#a1ce31'; | |
221 | break; | |
222 | case "med": | |
223 | color = '#dfbf35'; | |
224 | break; | |
225 | case "high": | |
226 | color = '#df3936'; | |
227 | break; | |
228 | case "critical": | |
229 | color = '#932ebe'; | |
230 | break; | |
231 | } | |
232 | ||
233 | angular.element('#btn-chg-severity').css('background-color', color); | |
234 | angular.element('#caret-chg-severity').css('background-color', color); | |
235 | }; | |
236 | ||
237 | vm.changeSeverity = function (severity) { | |
238 | vm.data.severity = severity; | |
239 | vm.updateBtnSeverityColor(severity); | |
240 | }; | |
241 | ||
242 | vm.updateBtnStatusColor = function (status) { | |
243 | var color = undefined; | |
244 | switch (status) { | |
245 | case "opened": | |
246 | color = '#DB3130'; | |
247 | break; | |
248 | case "closed": | |
249 | color = '#97F72C'; | |
250 | break; | |
251 | case "re-opened": | |
252 | color = '#DBB72F'; | |
253 | break; | |
254 | case "risk-accepted": | |
255 | color = '#288DB4'; | |
256 | break; | |
257 | default: | |
258 | color = '#aaaaaa'; | |
259 | break; | |
260 | } | |
261 | ||
262 | angular.element('#btn-chg-status').css('background-color', color); | |
263 | angular.element('#caret-chg-status').css('background-color', color); | |
264 | }; | |
265 | ||
266 | vm.changeStatus = function (status) { | |
267 | vm.data.status = status; | |
268 | vm.updateBtnStatusColor(status); | |
269 | }; | |
270 | ||
271 | ||
272 | init(); | |
273 | }]) | |
274 | ; |
3 | 3 | |
4 | 4 | angular.module('faradayApp') |
5 | 5 | .controller('modalNewVulnCtrl', |
6 | ['$modalInstance', '$filter', '$upload', 'EASEOFRESOLUTION', 'commonsFact', 'severities', 'workspace', 'targetFact', 'vulnModelsManager', 'vulnsManager', | |
7 | function($modalInstance, $filter, $upload, EASEOFRESOLUTION, commonsFact, severities, workspace, targetFact, vulnModelsManager, vulnsManager) { | |
6 | ['$modalInstance', '$filter', '$upload', 'EASEOFRESOLUTION', 'commonsFact', 'severities', 'workspace', 'targetFact', 'vulnModelsManager', 'vulnsManager', 'customFields', | |
7 | function($modalInstance, $filter, $upload, EASEOFRESOLUTION, commonsFact, severities, workspace, targetFact, vulnModelsManager, vulnsManager, customFields) { | |
8 | 8 | |
9 | 9 | var vm = this; |
10 | 10 | |
45 | 45 | vm.icons = {}; |
46 | 46 | |
47 | 47 | vm.host_parents = false; |
48 | ||
49 | vm.customFields = customFields; | |
48 | 50 | |
49 | 51 | vm.cweList = []; |
50 | 52 | vulnModelsManager.get().then(function(data) { |
84 | 86 | response: "", |
85 | 87 | severity: undefined, |
86 | 88 | type: "Vulnerability", |
87 | website: "" | |
89 | website: "", | |
90 | custom_fields:{} | |
88 | 91 | }; |
92 | ||
93 | customFields.forEach(function(cf) { | |
94 | vm.data.custom_fields[cf.field_display_name] = null; | |
95 | }); | |
89 | 96 | |
90 | 97 | vm.targets = []; |
91 | 98 | vm.target_filter = ""; |
238 | 245 | vm.data.policyviolations = policyviolations; |
239 | 246 | } |
240 | 247 | |
248 | vm.updateBtnSeverityColor = function (severity) { | |
249 | var color = undefined; | |
250 | switch (severity) { | |
251 | case "unclassified": | |
252 | color = '#999999'; | |
253 | break; | |
254 | case "info": | |
255 | color = '#2e97bd'; | |
256 | break; | |
257 | case "low": | |
258 | color = '#a1ce31'; | |
259 | break; | |
260 | case "med": | |
261 | color = '#dfbf35'; | |
262 | break; | |
263 | case "high": | |
264 | color = '#df3936'; | |
265 | break; | |
266 | case "critical": | |
267 | color = '#932ebe'; | |
268 | break; | |
269 | default: | |
270 | color = '#AAAAAA'; | |
271 | break; | |
272 | } | |
273 | ||
274 | angular.element('#btn-chg-severity').css('background-color', color); | |
275 | angular.element('#caret-chg-severity').css('background-color', color); | |
276 | }; | |
277 | ||
278 | vm.changeSeverity = function (severity) { | |
279 | vm.data.severity = severity; | |
280 | vm.updateBtnSeverityColor(severity); | |
281 | }; | |
282 | ||
241 | 283 | init(); |
242 | 284 | }]); |
31 | 31 | $scope.vulnWebSelected; |
32 | 32 | |
33 | 33 | $scope.gridHeight; |
34 | $scope.customFields; | |
34 | 35 | var allVulns; |
35 | 36 | |
36 | 37 | var searchFilter = {}; |
272 | 273 | |
273 | 274 | loadVulns(); |
274 | 275 | |
276 | loadCustomFields(); | |
277 | ||
275 | 278 | angular.element($window).bind("resize", function () { |
276 | 279 | resizeGrid(); |
277 | 280 | }); |
281 | }; | |
282 | ||
283 | ||
284 | var loadCustomFields = function () { | |
285 | var deferred = $q.defer(); | |
286 | ServerAPI.getCustomFields().then( | |
287 | function(response){ | |
288 | $scope.customFields = response.data; | |
289 | deferred.resolve($scope.customFields); | |
290 | }, function(){ | |
291 | deferred.reject(); | |
292 | }); | |
278 | 293 | }; |
279 | 294 | |
280 | 295 | var defineColumns = function() { |
800 | 815 | }, |
801 | 816 | vuln: function() { |
802 | 817 | return vulns[0]; |
818 | }, | |
819 | customFields: function () { | |
820 | return $scope.customFields; | |
803 | 821 | } |
804 | 822 | } |
805 | 823 | }); |
1066 | 1084 | }, |
1067 | 1085 | workspace: function() { |
1068 | 1086 | return $scope.workspace; |
1087 | }, | |
1088 | customFields: function () { | |
1089 | return $scope.customFields; | |
1069 | 1090 | } |
1070 | 1091 | } |
1071 | 1092 | }); |
0 | // Faraday Penetration Test IDE | |
1 | // Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) | |
2 | // See the file 'doc/LICENSE' for the license information | |
3 | ||
4 | angular.module('faradayApp') | |
5 | .directive('autofocus', ['$timeout', function ($timeout) { | |
6 | return { | |
7 | restrict: 'A', | |
8 | link: function ($scope, $element) { | |
9 | $timeout(function () { | |
10 | $element[0].focus(); | |
11 | }); | |
12 | } | |
13 | } | |
14 | }]);⏎ |
0 | // Faraday Penetration Test IDE | |
1 | // Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) | |
2 | // See the file 'doc/LICENSE' for the license information | |
3 | ||
4 | angular.module('faradayApp') | |
5 | .directive('checkCustomType', function () { | |
6 | return { | |
7 | restrict: 'A', | |
8 | link: function (scope, elm, attrs, ctrl) { | |
9 | elm.on('keydown', function (event) { | |
10 | if (attrs.checkCustomType === 'int') { | |
11 | if (event.shiftKey) { | |
12 | event.preventDefault(); | |
13 | return false; | |
14 | } | |
15 | //console.log(event.which); | |
16 | if ([8, 13, 27, 37, 38, 39, 40].indexOf(event.which) > -1) { | |
17 | // backspace, enter, escape, arrows | |
18 | return true; | |
19 | } else if (event.which >= 48 && event.which <= 57) { | |
20 | // numbers 0 to 9 | |
21 | return true; | |
22 | } else if (event.which >= 96 && event.which <= 105) { | |
23 | // numpad number | |
24 | return true; | |
25 | } | |
26 | else { | |
27 | event.preventDefault(); | |
28 | return false; | |
29 | } | |
30 | }else { | |
31 | return true; | |
32 | } | |
33 | ||
34 | }); | |
35 | } | |
36 | } | |
37 | });⏎ |
0 | // Faraday Penetration Test IDE | |
1 | // Copyright (C) 2018 Infobyte LLC (http://www.infobytesec.com/) | |
2 | // See the file 'doc/LICENSE' for the license information | |
3 | ||
4 | angular.module('faradayApp') | |
5 | .directive('customField', [function () { | |
6 | return { | |
7 | restrict: 'E', | |
8 | scope: true, | |
9 | replace: true, | |
10 | template: '<div><div class="tab-pane-header">{{cf.field_display_name}}</div> \n\ | |
11 | <div class="form-group" ng-if="cf.field_type !== \'list\'"> \n\ | |
12 | <label class="sr-only" for="{{cf.field_name}}">{{cf.field_display_name}}</label> \n\ | |
13 | <input type="text" class="form-control input-sm" id="{{cf.field_name}}" name="{{cf.field_name}}" \n\ | |
14 | placeholder="{{cf.field_display_name}}" \n\ | |
15 | ng-model="modal.data.custom_fields[cf.field_display_name]" check-custom-type="{{cf.field_type}}" \n\ | |
16 | uib-tooltip="{{(cf.field_type === \'int\') ? \'Type only numbers\' : \'Input type text\'}}"/> \n\ | |
17 | </div> \n\ | |
18 | <div class="form-group " ng-if="cf.field_type === \'list\'">\n\ | |
19 | <div class="input-group"> \n\ | |
20 | <label class="sr-only" for="{{cf.field_name}}">{{cf.field_display_name}}</label> \n\ | |
21 | <input type="text" class="form-control input-sm" id="{{cf.field_name}}" name="{{cf.field_name}}" \n\ | |
22 | placeholder="{{cf.field_display_name}}" \n\ | |
23 | ng-model="valueField" \n\ | |
24 | uib-tooltip="Input type list"/> \n\ | |
25 | <span class="input-group-addon cursor"><i class="fa fa-plus-circle" ng-click="newValueField(valueField)"></i></span> \n\ | |
26 | </div> \n\ | |
27 | </div> \n\ | |
28 | <div class="col-md-12 reference last-item-field" ng-repeat="item in modal.data.custom_fields[cf.field_display_name] track by $index" ng-class="{\'last-item-field\':$last}" ng-if="cf.field_type === \'list\'"> \n\ | |
29 | <div class="input-group margin-bottom-sm"> \n\ | |
30 | <label class="sr-only" for="vuln-refs-create">{{cf.field_display_name}}</label> \n\ | |
31 | <input type="text" class="form-control" id="vuln-refs-create" placeholder="{{cf.field_display_name}}" \n\ | |
32 | ng-model="item.value" \n\ | |
33 | role="button" readonly/> \n\ | |
34 | <span class="input-group-addon cursor" ng-click="modal.data.custom_fields[cf.field_display_name].splice($index, 1)"> \n\ | |
35 | <i class="fa fa-minus-circle"></i></span> \n\ | |
36 | </div> \n\ | |
37 | </div> \n\ | |
38 | </div></div>', | |
39 | link: function (scope, element, attrs) { | |
40 | ||
41 | scope.newValueField = function (valueField) { | |
42 | if (valueField !== "" && valueField !== undefined) { | |
43 | if(scope.modal.data.custom_fields[scope.cf.field_display_name] == null ) | |
44 | scope.modal.data.custom_fields[scope.cf.field_display_name] = []; | |
45 | ||
46 | // we need to check if the ref already exists | |
47 | if (scope.modal.data.custom_fields[scope.cf.field_display_name].filter(function(field) {return field.value === valueField}).length === 0) { | |
48 | scope.modal.data.custom_fields[scope.cf.field_display_name].push({value: valueField}); | |
49 | scope.valueField = ""; | |
50 | } | |
51 | angular.element('#'+scope.cf.field_name).val(""); | |
52 | } | |
53 | } | |
54 | } | |
55 | } | |
56 | }]); |
2 | 2 | <!-- See the file 'doc/LICENSE' for the license information --> |
3 | 3 | |
4 | 4 | <form name="formEdit" novalidate> |
5 | <div class="modal-header"> | |
6 | <div class="modal-button"> | |
7 | <button class="btn btn-success" ng-click="modal.ok()" ng-disabled="formEdit.$invalid || modal.data.severity === undefined">OK</button> | |
8 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
5 | <!--<div class="modal-header">--> | |
6 | <!--<div class="modal-button">--> | |
7 | <!--<button class="btn btn-success" ng-click="modal.ok()"--> | |
8 | <!--ng-disabled="formEdit.$invalid || modal.data.severity === undefined">OK--> | |
9 | <!--</button>--> | |
10 | <!--<button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button>--> | |
11 | <!--</div>--> | |
12 | <!--<h3 class="modal-title">Vulnerability edit</h3>--> | |
13 | <!--</div>--> | |
14 | ||
15 | ||
16 | <div class="modal-body"> | |
17 | ||
18 | <div class="mt-3"> | |
19 | <div class="modal-data-name" ng-init="modal.isNameEditable = false"> | |
20 | <div ng-if="modal.isNameEditable == false && modal.data.name !== undefined"> | |
21 | <span class="data-name">{{modal.data.name}}</span> | |
22 | <span class="edit-name-icon" ng-click="modal.isNameEditable = true"><i | |
23 | class="fa fa-pencil fa-lg" aria-hidden="true"></i></span> | |
24 | </div> | |
25 | ||
26 | <div ng-if="modal.isNameEditable == true || modal.data.name == undefined"> | |
27 | <div class="form-group" ng-class="{'has-error': formEdit.name.$invalid }"> | |
28 | <label class="sr-only" for="inp-edit-name">Vuln name</label> | |
29 | <input type="text" class="form-control" id="inp-edit-name" | |
30 | ng-model="modal.data.name" name="name" placeholder="Vuln name" | |
31 | ng-blur="modal.isNameEditable = modal.data.name == undefined " | |
32 | autofocus required> | |
33 | </div> | |
34 | </div> | |
35 | ||
36 | </div> | |
37 | ||
38 | <div class="edit-vulns-dropdowns row" ng-init="modal.updateBtnSeverityColor(modal.data.severity);modal.updateBtnStatusColor(modal.data.status)"> | |
39 | ||
40 | <div class="btn-group col-md-3 col-sm-6 col-xs-6"> | |
41 | <button type="button" class="dropdown-toggle btn-change-property primary-btn" | |
42 | data-toggle="dropdown" | |
43 | id="btn-chg-severity" | |
44 | title="{{modal.data.severity}}"> | |
45 | {{modal.data.severity | uppercase}} | |
46 | </button> | |
47 | <button type="button" class="dropdown-toggle secondary-btn btn-change-property" | |
48 | data-toggle="dropdown" | |
49 | id="caret-chg-severity" | |
50 | title="Change severity"> | |
51 | <span> <i class="fa fa-angle-down fa-lg" aria-hidden="true"></i> </span> | |
52 | </button> | |
53 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
54 | <li> | |
55 | <a class="ws" | |
56 | ng-click="modal.changeSeverity('unclassified')">UNCLASSIFIED</a> | |
57 | <a class="ws" | |
58 | ng-click="modal.changeSeverity('info')">INFO</a> | |
59 | <a class="ws" | |
60 | ng-click="modal.changeSeverity('low')">LOW</a> | |
61 | <a class="ws" | |
62 | ng-click="modal.changeSeverity('med')">MEDIUM</a> | |
63 | <a class="ws" | |
64 | ng-click="modal.changeSeverity('high')">HIGH</a> | |
65 | <a class="ws" | |
66 | ng-click="modal.changeSeverity('critical')">CRITICAL</a> | |
67 | </li> | |
68 | </ul> | |
69 | </div> | |
70 | ||
71 | ||
72 | <div class="btn-group col-md-3 col-sm-6 col-xs-6"> | |
73 | <button type="button" class="dropdown-toggle btn-change-property primary-btn btn-primary-white" | |
74 | data-toggle="dropdown" | |
75 | id="btn-chg-ease_resolution" | |
76 | title="{{modal.data.easeofresolution}}"> | |
77 | {{modal.data.easeofresolution || "Ease of Resolution"}} | |
78 | </button> | |
79 | <button type="button" class="dropdown-toggle secondary-btn btn-change-property btn-secondary-white" | |
80 | data-toggle="dropdown" | |
81 | id="caret-ease_resolution" | |
82 | title="Change Ease of Resolution"> | |
83 | <span> <i class="fa fa-angle-down fa-lg" aria-hidden="true"></i> </span> | |
84 | </button> | |
85 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
86 | <li> | |
87 | <a class="ws" | |
88 | ng-click="modal.data.easeofresolution = null">Undetermined</a> | |
89 | <a class="ws" | |
90 | ng-click="modal.data.easeofresolution = 'trivial'">Trivial</a> | |
91 | <a class="ws" | |
92 | ng-click="modal.data.easeofresolution = 'simple'">Simple</a> | |
93 | <a class="ws" | |
94 | ng-click="modal.data.easeofresolution = 'moderate'">Moderate</a> | |
95 | <a class="ws" | |
96 | ng-click="modal.data.easeofresolution = 'difficult'">Difficult</a> | |
97 | <a class="ws" | |
98 | ng-click="modal.data.easeofresolution = 'infeasible'">Infeasible</a> | |
99 | </li> | |
100 | </ul> | |
101 | </div> | |
102 | ||
103 | ||
104 | <div class="btn-group col-md-3 col-sm-6 col-xs-6"> | |
105 | <button type="button" class="dropdown-toggle btn-change-property primary-btn text-capitalize" | |
106 | data-toggle="dropdown" | |
107 | id="btn-chg-status" | |
108 | title="{{modal.data.status}}"> | |
109 | {{modal.data.status || "Status"}} | |
110 | </button> | |
111 | <button type="button" class="dropdown-toggle secondary-btn btn-change-property" | |
112 | data-toggle="dropdown" | |
113 | id="caret-chg-status" | |
114 | title="Change Status"> | |
115 | <span> <i class="fa fa-angle-down fa-lg" aria-hidden="true"></i> </span> | |
116 | </button> | |
117 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
118 | <li> | |
119 | <a class="ws" | |
120 | ng-click="modal.changeStatus('opened')">Opened</a> | |
121 | <a class="ws" | |
122 | ng-click="modal.changeStatus('closed')">Closed</a> | |
123 | <a class="ws" | |
124 | ng-click="modal.changeStatus('re-opened')">Re-opened</a> | |
125 | <a class="ws" | |
126 | ng-click="modal.changeStatus('risk-accepted')">Risk-accepted</a> | |
127 | </li> | |
128 | </ul> | |
129 | </div> | |
130 | ||
131 | <div class="col-md-3 col-sm-6 col-xs-6"> | |
132 | <label class="chbox-container"> | |
133 | <div class="tab-pane-header"><h4>Confirmed</h4></div> | |
134 | <input type="checkbox" ng-checked="modal.data.confirmed === true" ng-model="modal.data.confirmed"> | |
135 | <span class="checkmark"></span> | |
136 | </label> | |
137 | </div> | |
138 | ||
139 | </div> | |
140 | ||
141 | ||
142 | <!-- Nav tabs --> | |
143 | <ul class="nav nav-tabs" id="nav-tabs-container"> | |
144 | <li class="nav-item active" ng-class="{'has-error': formEdit.desc.$invalid}"> | |
145 | <a class="nav-link active" data-toggle="tab" data-target="#general" | |
146 | href="javascript:;">General</a> | |
147 | </li> | |
148 | <li class="nav-item"> | |
149 | <a class="nav-link" data-toggle="tab" data-target="#technical_details" href="javascript:;">Technical | |
150 | Details</a> | |
151 | </li> | |
152 | <li class="nav-item"> | |
153 | <a class="nav-link" data-toggle="tab" data-target="#tab-evidence" href="javascript:;">Evidence</a> | |
154 | </li> | |
155 | <li class="nav-item"> | |
156 | <a class="nav-link" data-toggle="tab" data-target="#tab-custom-fields" href="javascript:;">Custom Fields</a> | |
157 | </li> | |
158 | </ul> | |
159 | ||
160 | <!-- Tab panes --> | |
161 | <div class="tab-content"> | |
162 | <div id="general" class="container tab-pane-container tab-pane active"><br> | |
163 | ||
164 | <div class="col-md-12"> | |
165 | <div class="tab-pane-header">Search vulnerability database templates | |
166 | <a | |
167 | href="https://github.com/infobyte/faraday/wiki/vulnerabilities-database" | |
168 | target="_blank"><span class="glyphicon glyphicon-question-sign" | |
169 | title="Read more about vulnerability templates in the official Faraday Documentation"></span></a> | |
170 | </div> | |
171 | <div class="form-group"> | |
172 | <input type="text" ng-model="modal.cwe_selected" class="form-control input-sm" | |
173 | placeholder="Search for vulnerability templates" | |
174 | uib-typeahead="cwe as cwe.name for cwe in modal.cweList | filter:{name: $viewValue} | limitTo:10" | |
175 | typeahead-on-select="modal.populate($item, $model, $label)"> | |
176 | </div> | |
177 | </div> | |
178 | ||
179 | <div class="col-md-12 custom-divider"></div> | |
180 | ||
181 | ||
182 | <div class="col-md-12"> | |
183 | <div class="tab-pane-header">Description</div> | |
184 | <div class="form-group" ng-class="{'has-error': formEdit.desc.$invalid }"> | |
185 | <label class="sr-only" for="vuln-data">Vuln description</label> | |
186 | <textarea class="form-control" id="vuln-desc" name="desc" | |
187 | ng-model="modal.data.desc" placeholder="Description" | |
188 | style="margin: 0 2px 0 0; height: 239px; width: 810px;" required></textarea> | |
189 | </div><!-- .form-group --> | |
190 | </div> | |
191 | ||
192 | ||
193 | <div class="form-group margin-top-22px"> | |
194 | <div class="col-md-12"> | |
195 | <div class="tab-pane-header">References</div> | |
196 | <div class="input-group margin-bottom-sm"> | |
197 | <label class="sr-only" for="vuln-refs">References</label> | |
198 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" | |
199 | ng-model="modal.new_ref"/> | |
200 | <span class="input-group-addon cursor" ng-click="modal.newReference()"><i | |
201 | class="fa fa-plus-circle"></i></span> | |
202 | </div> | |
203 | </div> | |
204 | <div class="col-md-12 reference" ng-repeat="reference in modal.data.refs"> | |
205 | <div class="input-group margin-bottom-sm"> | |
206 | <label class="sr-only" for="vuln-refs-create">References</label> | |
207 | <input type="text" class="form-control" id="vuln-refs-create" placeholder="Reference" | |
208 | ng-model="reference.value" ng-click="modal.openReference(reference.value)" | |
209 | role="button" | |
210 | readonly/> | |
211 | <span class="input-group-addon cursor" ng-click="modal.data.refs.splice($index, 1)"><i | |
212 | class="fa fa-minus-circle"></i></span> | |
213 | </div> | |
214 | </div> | |
215 | </div><!-- .form-group --> | |
216 | ||
217 | ||
218 | <div class="col-md-12 margin-top-22px"> | |
219 | <div class="tab-pane-header">Resolution</div> | |
220 | <div class="form-group"> | |
221 | <label class="sr-only" for="vuln-data">Vuln resolution</label> | |
222 | <textarea class="form-control" id="vuln-resolution" rows="4" | |
223 | ng-model="modal.data.resolution" placeholder="Resolution"></textarea> | |
224 | </div><!-- .form-group --> | |
225 | </div> | |
226 | ||
227 | ||
228 | <div class="form-group margin-top-22px"> | |
229 | <div class="col-md-12"> | |
230 | <div class="tab-pane-header">Policy Violations</div> | |
231 | <div class="input-group margin-bottom-sm"> | |
232 | <label class="sr-only" for="vuln-policyviolations">Policy Violations</label> | |
233 | <input type="text" class="form-control" id="vuln-policyviolations" | |
234 | placeholder="Policy Violations" ng-model="modal.new_policyviolation"/> | |
235 | <span class="input-group-addon cursor" ng-click="modal.newPolicyViolation()"><i | |
236 | class="fa fa-plus-circle"></i></span> | |
237 | </div> | |
238 | </div> | |
239 | <div class="col-md-12 reference" ng-repeat="policyviolation in modal.data.policyviolations"> | |
240 | <div class="input-group margin-bottom-sm"> | |
241 | <label class="sr-only" for="vuln-policyviolations-value">Policy Violation</label> | |
242 | <input type="text" class="form-control" id="vuln-policyviolations-value" | |
243 | placeholder="Policy Violation" ng-model="policyviolation.value" disabled/> | |
244 | <span class="input-group-addon cursor" | |
245 | ng-click="modal.data.policyviolations.splice($index, 1)"><i | |
246 | class="fa fa-minus-circle"></i></span> | |
247 | </div> | |
248 | </div> | |
249 | </div><!-- .form-group --> | |
250 | ||
251 | <div class="col-md-12 margin-bottom-15px margin-top-22px"> | |
252 | <div class="tab-pane-header">Impact</div> | |
253 | <h4><span ng-repeat="(key, value) in modal.data.impact" class="normal-size" | |
254 | style="cursor: pointer;"> | |
255 | <span ng-class="{'label-impact label-default-impact': !value, 'label-impact label-success-impact': value}" | |
256 | ng-click="modal.toggleImpact(key)">{{key}}</span> | |
257 | </span></h4><!-- .normal-size --> | |
258 | </div> | |
259 | ||
260 | </div> | |
261 | <div id="technical_details" class="container tab-pane-container tab-pane fade"><br> | |
262 | <div class="col-md-12"> | |
263 | <div class="tab-pane-header">Data</div> | |
264 | <div class="form-group"> | |
265 | <label class="sr-only" for="vuln-data">Vuln data</label> | |
266 | <textarea class="form-control" id="vuln-data" rows="5" | |
267 | ng-model="modal.data.data" placeholder="Data"></textarea> | |
268 | </div><!-- .form-group --> | |
269 | </div> | |
270 | ||
271 | <div class="col-md-6 col-sm-12 col-xs-12" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
272 | <div class="tab-pane-header">Request</div> | |
273 | <div class="form-group"> | |
274 | <label class="sr-only" for="vuln-request">Vuln request</label> | |
275 | <textarea class="form-control" id="vuln-request" rows="8" | |
276 | ng-model="modal.data.request" placeholder="Request"></textarea> | |
277 | </div><!-- .form-group --> | |
278 | </div> | |
279 | ||
280 | <div class="col-md-6 col-sm-12 col-xs-12" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
281 | <div class="tab-pane-header">Response</div> | |
282 | <div class="form-group"> | |
283 | <label class="sr-only" for="vuln-response">Vuln response</label> | |
284 | <textarea class="form-control" id="vuln-response" rows="8" | |
285 | ng-model="modal.data.response" placeholder="Response"></textarea> | |
286 | </div><!-- .form-group --> | |
287 | </div> | |
288 | ||
289 | <div class="margin-top-22px" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
290 | <div class="col-md-4"> | |
291 | <div class="tab-pane-header">Method</div> | |
292 | <div class="form-group"> | |
293 | <label class="sr-only control-label" for="vuln-method">Method</label> | |
294 | <input type="text" class="form-control" id="vuln-method" placeholder="Method" | |
295 | ng-model="modal.data.method"/> | |
296 | </div><!-- .form-group --> | |
297 | </div> | |
298 | ||
299 | <div class="col-md-3"> | |
300 | <div class="tab-pane-header">Param Name</div> | |
301 | <div class="form-group"> | |
302 | <label class="sr-only control-label" for="vuln-pname">Param Name</label> | |
303 | <input type="text" class="form-control" id="vuln-pname" placeholder="Param name" | |
304 | ng-model="modal.data.pname"/> | |
305 | </div><!-- .form-group --> | |
306 | </div> | |
307 | ||
308 | <div class="col-md-5"> | |
309 | <div class="tab-pane-header">Params</div> | |
310 | <div class="form-group"> | |
311 | <label class="sr-only control-label" for="vuln-params">Params</label> | |
312 | <input type="text" class="form-control" id="vuln-params" placeholder="Params" | |
313 | ng-model="modal.data.params"/> | |
314 | </div><!-- .form-group --> | |
315 | </div> | |
316 | ||
317 | <div class="col-md-4"> | |
318 | <div class="tab-pane-header">Path</div> | |
319 | <div class="form-group"> | |
320 | <label class="sr-only control-label" for="vuln-path">Path</label> | |
321 | <input type="text" class="form-control" id="vuln-path" placeholder="Path" | |
322 | ng-model="modal.data.path"/> | |
323 | </div><!-- .form-group --> | |
324 | </div> | |
325 | ||
326 | <div class="col-md-4"> | |
327 | <div class="tab-pane-header">Query</div> | |
328 | <div class="form-group"> | |
329 | <label class="sr-only control-label" for="vuln-query">Query</label> | |
330 | <input type="text" class="form-control" id="vuln-query" placeholder="Query" | |
331 | ng-model="modal.data.query"/> | |
332 | </div><!-- .form-group --> | |
333 | </div> | |
334 | ||
335 | <div class="col-md-4"> | |
336 | <div class="tab-pane-header">Website</div> | |
337 | <div class="form-group"> | |
338 | <label class="sr-only control-label" for="vuln-website">Website</label> | |
339 | <input type="text" class="form-control" id="vuln-website" placeholder="Website" | |
340 | ng-model="modal.data.website"/> | |
341 | </div><!-- .form-group --> | |
342 | </div> | |
343 | </div> | |
344 | </div> | |
345 | <div id="tab-evidence" class="container tab-pane fade"><br> | |
346 | <div class="col-md-12 margin-bottom-15px"> | |
347 | <div class="tab-pane-header">Evidence</div> | |
348 | <div class="alert alert-danger normal-size" role="alert" ng-if="modal.file_name_error"> | |
349 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
350 | <span class="sr-only">Error:</span> | |
351 | Cannot upload evidence starting with underscore, please choose a different name for the | |
352 | file. | |
353 | </div> | |
354 | <div class="form-group normal-size"> | |
355 | <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" | |
356 | ng-file-change="modal.selectedFiles($files, $event)"/> | |
357 | <p class="help-block">Multiple files are allowed.</p> | |
358 | </div><!-- .form-group --> | |
359 | <div id="evidenceFiles" class="normal-size" ng-if="modal.data._attachments"> | |
360 | <ul> | |
361 | <li ng-repeat="(name, file) in modal.data._attachments"> | |
362 | <div class="btn-group"> | |
363 | <button type="button" class="btn btn-default" | |
364 | ng-click="modal.openEvidence(name)"> | |
365 | <span class="fa {{icons[name]}}" | |
366 | title="Evidence {{name | decodeURIComponent}}"></span> {{name | | |
367 | decodeURIComponent}} | |
368 | </button><!-- ng-repeat --> | |
369 | <button type="button" class="btn btn-danger" | |
370 | ng-click="modal.removeEvidence(name)"> | |
371 | <span class="glyphicon glyphicon-trash"></span> | |
372 | </button> | |
373 | </div> | |
374 | </li> | |
375 | </ul> | |
376 | </div><!-- #evidenceFiles --> | |
377 | </div> | |
378 | ||
379 | </div> | |
380 | ||
381 | <div id="tab-custom-fields" class="container tab-pane-container tab-pane fade"><br> | |
382 | <div class="col-md-12 margin-bottom-15px"> | |
383 | <div class="col-md-12" ng-repeat="cf in modal.customFields | orderBy : 'field_order'"> | |
384 | <custom-field field="{{cf}}"></custom-field> | |
385 | </div> | |
386 | ||
387 | </div> | |
388 | </div> | |
9 | 389 | </div> |
10 | <h3 class="modal-title">Vulnerability edit</h3> | |
11 | </div> | |
12 | <div class="modal-body"> | |
13 | <div class="form-horizontal"> | |
14 | <div class="form-group"> | |
15 | <div class="col-md-12"> | |
16 | <h5>Vulnerability template</h5> | |
17 | <input type="text" ng-model="modal.cwe_selected" class="form-control input-sm" placeholder="Search for vulnerability template" uib-typeahead="cwe as cwe.name for cwe in modal.cweList | filter:{name: $viewValue} | limitTo:10" typeahead-on-select="modal.populate($item, $model, $label)"> | |
18 | </div> | |
390 | ||
391 | ||
392 | <div class="modal-footer"> | |
393 | <div class="modal-button"> | |
394 | <button class="btn btn-success" ng-click="modal.ok()" ng-disabled="formEdit.$invalid">OK</button> | |
395 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
19 | 396 | </div> |
20 | <div class="form-group"> | |
21 | <div class="col-md-3 severities"> | |
22 | <h5>Severity</h5> | |
23 | <button type="button" class="btn btn-default dropdown-toggle color-{{modal.data.severity}}" name="severity" data-toggle="dropdown" title="Change severity" ng-class="{'button-error': modal.data.severity === undefined}"> | |
24 | {{modal.data.severity || 'Edit severity'}} <span class="caret" style="color:#000"></span> | |
25 | </button> | |
26 | <ul id="nav" class="dropdown-menu dropdown-menu-left" role="menu"> | |
27 | <li ng-repeat="s in modal.severities"><a href="" class="ws color-{{s}}" ng-click="modal.data.severity=s">{{s}}</a></li> | |
28 | </ul><!-- WS navigation --> | |
29 | </div> | |
30 | <div class="col-md-3"> | |
31 | <h5>Ease of Resolution</h5> | |
32 | <select class="form-control" ng-model="modal.data.easeofresolution" ng-options="e as e for e in modal.easeofresolution" style="padding:0px 12px;"> | |
33 | <option value=""></option> | |
34 | </select> | |
35 | </div> | |
36 | <div class="col-md-3"> | |
37 | <h5>Status</h5> | |
38 | <select class="form-control" ng-model="modal.data.status" ng-options="e as e for e in modal.statuses" style="padding:0px 12px;"> | |
39 | </select> | |
40 | </div> | |
41 | <div class="col-md-3"> | |
42 | <h5>Confirmed</h5> | |
43 | <input type="checkbox" id="confirmed" ng-model="modal.data.confirmed" /> | |
44 | </div> | |
45 | </div><!-- .form-group --> | |
46 | <div class="form-group" ng-class="{'has-error': formEdit.name.$invalid }"> | |
47 | <div class="col-md-12"> | |
48 | <label class="sr-only" for="vuln-name">Vuln name</label> | |
49 | <input type="text" class="form-control" id="vuln-name" name="name" placeholder="Name" ng-model="modal.data.name" required/> | |
50 | </div> | |
51 | </div><!-- .form-group --> | |
52 | <div class="form-group" ng-class="{'has-error': formEdit.desc.$invalid }"> | |
53 | <div class="col-md-12"> | |
54 | <label class="sr-only" for="vuln-desc">Vuln description</label> | |
55 | <textarea class="form-control" id="vuln-desc" name="desc" placeholder="Description" ng-model="modal.data.desc" required="" style="margin: 0px 2px 0px 0px; height: 239px; width: 867px;"></textarea></textarea> | |
56 | </div> | |
57 | </div><!-- .form-group --> | |
58 | <div class="form-group"> | |
59 | <div class="col-md-12"> | |
60 | <label class="sr-only" for="vuln-data">Vuln data</label> | |
61 | <textarea class="form-control" id="vuln-data" placeholder="Data" ng-model="modal.data.data"></textarea> | |
62 | </div> | |
63 | </div><!-- .form-group --> | |
64 | <div class="form-group"> | |
65 | <div class="col-md-12"> | |
66 | <div class="input-group margin-bottom-sm"> | |
67 | <label class="sr-only" for="vuln-refs">References</label> | |
68 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="modal.new_ref"/> | |
69 | <span class="input-group-addon cursor" ng-click="modal.newReference()"><i class="fa fa-plus-circle"></i></span> | |
70 | </div> | |
71 | </div> | |
72 | <div class="col-md-12 reference" ng-repeat="reference in modal.data.refs"> | |
73 | <div class="input-group margin-bottom-sm"> | |
74 | <label class="sr-only" for="vuln-refs">References</label> | |
75 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="reference.value" ng-click="modal.openReference(reference.value)" role="button" readonly /> | |
76 | <span class="input-group-addon cursor" ng-click="modal.data.refs.splice($index, 1)"><i class="fa fa-minus-circle"></i></span> | |
77 | </div> | |
78 | </div> | |
79 | </div><!-- .form-group --> | |
80 | <div class="form-group"> | |
81 | <div class="col-md-12"> | |
82 | <label class="sr-only" for="vuln-resolution">Vuln Resolution</label> | |
83 | <textarea class="form-control" id="vuln-resolution" placeholder="Resolution" ng-model="modal.data.resolution"></textarea> | |
84 | </div> | |
85 | </div><!-- .form-group --> | |
86 | <div class="form-group"> | |
87 | <div class="col-md-12"> | |
88 | <div class="input-group margin-bottom-sm"> | |
89 | <label class="sr-only" for="vuln-policyviolations">Policy Violations</label> | |
90 | <input type="text" class="form-control" id="vuln-policyviolations" placeholder="Policy Violations" ng-model="modal.new_policyviolation"/> | |
91 | <span class="input-group-addon cursor" ng-click="modal.newPolicyViolation()"><i class="fa fa-plus-circle"></i></span> | |
92 | </div> | |
93 | </div> | |
94 | <div class="col-md-12 reference" ng-repeat="policyviolation in modal.data.policyviolations"> | |
95 | <div class="input-group margin-bottom-sm"> | |
96 | <label class="sr-only" for="vuln-policyviolations">Policy Violation</label> | |
97 | <input type="text" class="form-control" id="vuln-policyviolations" placeholder="Policy Violation" ng-model="policyviolation.value" disabled/> | |
98 | <span class="input-group-addon cursor" ng-click="modal.data.policyviolations.splice($index, 1)"><i class="fa fa-minus-circle"></i></span> | |
99 | </div> | |
100 | </div> | |
101 | </div><!-- .form-group --> | |
102 | <div ng-if="modal.vuln.type === 'VulnerabilityWeb'"> | |
103 | <div class="form-group"> | |
104 | <div class="col-md-4"> | |
105 | <label class="sr-only control-label" for="vuln-method">Method</label> | |
106 | <input type="text" class="form-control input-error" id="vuln-method" placeholder="Method" ng-model="modal.data.method"/> | |
107 | </div> | |
108 | <div class="col-md-3"> | |
109 | <label class="sr-only control-label" for="vuln-pname">Param Name</label> | |
110 | <input type="text" class="form-control input-error" id="vuln-pname" placeholder="Param name" ng-model="modal.data.pname"/> | |
111 | </div> | |
112 | <div class="col-md-5"> | |
113 | <label class="sr-only control-label" for="vuln-params">Params</label> | |
114 | <input type="text" class="form-control input-error" id="vuln-params" placeholder="Params" ng-model="modal.data.params"/> | |
115 | </div> | |
116 | </div><!-- .form-group --> | |
117 | <div class="form-group"> | |
118 | <div class="col-md-4"> | |
119 | <label class="sr-only control-label" for="vuln-path">Path</label> | |
120 | <input type="text" class="form-control input-error" id="vuln-path" placeholder="Path" ng-model="modal.data.path"/> | |
121 | </div> | |
122 | <div class="col-md-4"> | |
123 | <label class="sr-only control-label" for="vuln-query">Query</label> | |
124 | <input type="text" class="form-control input-error" id="vuln-query" placeholder="Query" ng-model="modal.data.query"/> | |
125 | </div> | |
126 | <div class="col-md-4"> | |
127 | <label class="sr-only control-label" for="vuln-website">Website</label> | |
128 | <input type="text" class="form-control input-error" id="vuln-website" placeholder="Website" ng-model="modal.data.website"/> | |
129 | </div> | |
130 | </div><!-- .form-group --> | |
131 | <div class="form-group"> | |
132 | <div class="col-md-12"> | |
133 | <label class="sr-only control-label" for="vuln-request">Request</label> | |
134 | <textarea class="form-control input-error" id="vuln-request" placeholder="Request" ng-model="modal.data.request"></textarea> | |
135 | </div> | |
136 | </div><!-- .form-group --> | |
137 | <div class="form-group"> | |
138 | <div class="col-md-12"> | |
139 | <label class="sr-only control-label" for="vuln-response">Response</label> | |
140 | <textarea class="form-control input-error" id="vuln-response" placeholder="Response" ng-model="modal.data.response"></textarea> | |
141 | </div> | |
142 | </div><!-- .form-group --> | |
143 | </div><!-- ng-if --> | |
144 | </div><!-- .form-horizontal --> | |
145 | ||
146 | <h4>Impact</h4> | |
147 | <h4><span ng-repeat="(key, value) in modal.data.impact" class="normal-size" style="cursor: pointer;"> | |
148 | <span ng-class="{'label-impact label-default-impact': !value, 'label-impact label-success-impact': value}" ng-click="modal.toggleImpact(key)">{{key}}</span> | |
149 | </span></h4><!-- .normal-size --> | |
150 | <div> | |
151 | ||
152 | <div> | |
153 | <h4>Evidence</h4> | |
154 | <div class="alert alert-danger normal-size" role="alert" ng-if="modal.file_name_error"> | |
155 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
156 | <span class="sr-only">Error:</span> | |
157 | Cannot upload evidence starting with underscore, please choose a different name for the file. | |
158 | </div> | |
159 | <div class="form-group normal-size"> | |
160 | <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" ng-file-change="modal.selectedFiles($files, $event)"/> | |
161 | <p class="help-block">Multiple files are allowed.</p> | |
162 | </div><!-- .form-group --> | |
163 | <div id="evidenceFiles" class="normal-size" ng-if="modal.data._attachments"> | |
164 | <ul> | |
165 | <li ng-repeat="(name, file) in modal.data._attachments"> | |
166 | <div class="btn-group"> | |
167 | <button type="button" class="btn btn-default" ng-click="modal.openEvidence(name)"> | |
168 | <span class="fa {{icons[name]}}" title="Evidence {{name | decodeURIComponent}}"></span> {{name | decodeURIComponent}} | |
169 | </button><!-- ng-repeat --> | |
170 | <button type="button" class="btn btn-danger" ng-click="modal.removeEvidence(name)"> | |
171 | <span class="glyphicon glyphicon-trash"></span> | |
172 | </button> | |
173 | </div> | |
174 | </li> | |
175 | </ul> | |
176 | </div><!-- #evidenceFiles --> | |
177 | </div><!-- ng-if --> | |
178 | <div class="modal-footer"> | |
179 | <div class="modal-button"> | |
180 | <button class="btn btn-success" ng-click="modal.ok()" ng-disabled="formEdit.$invalid">OK</button> | |
181 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
182 | 397 | </div> |
398 | ||
399 | ||
400 | <!--</div>--> | |
183 | 401 | </div> |
184 | 402 | </form> |
3 | 3 | |
4 | 4 | <form name="form" novalidate> |
5 | 5 | <div class="modal-header"> |
6 | <div class="modal-button btn-toolbar"> | |
7 | <button class="btn btn-success" ng-click="modal.ok()" ng-disabled="form.$invalid || modal.data.severity === undefined || (modal.data.type === 'VulnerabilityWeb' && modal.host_parents) || modal.data.parents.length == 0">OK</button> | |
8 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
9 | </div> | |
6 | <!--<div class="modal-button btn-toolbar">--> | |
7 | <!--<button class="btn btn-success" ng-click="modal.ok()" ng-disabled="form.$invalid || modal.data.severity === undefined || (modal.data.type === 'VulnerabilityWeb' && modal.host_parents) || modal.data.parents.length == 0">OK</button>--> | |
8 | <!--<button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button>--> | |
9 | <!--</div>--> | |
10 | 10 | <h3 class="modal-title">Vulnerability creation</h3> |
11 | 11 | </div> |
12 | 12 | <div class="modal-body"> |
13 | <div class="form-horizontal"> | |
14 | <h5>Target</h5> | |
15 | <div class="form-group"> | |
16 | <div class="col-md-10"> | |
17 | <div class="form-group input-accordion"> | |
18 | <input type="text" ng-model="modal.target_filter" class="form-control input-sm" placeholder="Search targets" ng-change="modal.currentPage = 0"> | |
19 | </div> | |
20 | </div> | |
21 | <div class="col-md-2"> | |
22 | <div class="btn-group btn-small-margin"> | |
23 | <button type="button" class="btn btn-default btn-sm" title="Select page" ng-click="modal.setTargets(true, modal.currentPage*modal.pageSize, modal.pageSize)"> | |
24 | Select page | |
25 | </button> | |
26 | <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" title="Select options"> | |
27 | <span class="caret"></span> | |
28 | </button> | |
29 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
30 | <li ng-show="modal.target_filter && modal.targets_filtered.length > 0"> | |
31 | <a class="ws" ng-click="modal.setTargets(true, 0, modal.targets_filtered.length)">Select all hosts in search</a> | |
32 | </li> | |
33 | <li> | |
34 | <a class="ws" ng-click="modal.setTargets(false, 0, modal.targets.length)">Select all hosts</a> | |
35 | </li> | |
36 | <li> | |
37 | <a class="ws" ng-click="modal.setTargets(false, 0, 0)">Clear selection</a> | |
38 | </li> | |
39 | </ul> | |
40 | </div><!-- .btn-group --> | |
41 | </div> | |
13 | <div class="mt-3"> | |
14 | ||
15 | <div class="edit-vulns-dropdowns row" ng-init="modal.changeSeverity('unclassified')"> | |
16 | ||
17 | <div class="btn-group col-md-3 col-sm-6 col-xs-6"> | |
18 | <button type="button" class="dropdown-toggle btn-change-property primary-btn" | |
19 | data-toggle="dropdown" | |
20 | id="btn-chg-severity" | |
21 | title="{{modal.data.severity}}"> | |
22 | {{modal.data.severity || "Add Severity" | uppercase }} | |
23 | </button> | |
24 | <button type="button" class="dropdown-toggle secondary-btn btn-change-property" | |
25 | data-toggle="dropdown" | |
26 | id="caret-chg-severity" | |
27 | title="Change severity"> | |
28 | <span> <i class="fa fa-angle-down fa-lg" aria-hidden="true"></i> </span> | |
29 | </button> | |
30 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
31 | <li> | |
32 | <a class="ws" | |
33 | ng-click="modal.changeSeverity('unclassified')">UNCLASSIFIED</a> | |
34 | <a class="ws" | |
35 | ng-click="modal.changeSeverity('info')">INFO</a> | |
36 | <a class="ws" | |
37 | ng-click="modal.changeSeverity('low')">LOW</a> | |
38 | <a class="ws" | |
39 | ng-click="modal.changeSeverity('med')">MEDIUM</a> | |
40 | <a class="ws" | |
41 | ng-click="modal.changeSeverity('high')">HIGH</a> | |
42 | <a class="ws" | |
43 | ng-click="modal.changeSeverity('critical')">CRITICAL</a> | |
44 | </li> | |
45 | </ul> | |
46 | </div> | |
47 | ||
48 | ||
49 | <div class="btn-group col-md-3 col-sm-6 col-xs-6"> | |
50 | <button type="button" class="dropdown-toggle btn-change-property primary-btn btn-primary-white" | |
51 | data-toggle="dropdown" | |
52 | id="btn-chg-ease_resolution" | |
53 | title="{{modal.data.easeofresolution}}"> | |
54 | {{modal.data.easeofresolution || "Ease of Resolution"}} | |
55 | </button> | |
56 | <button type="button" class="dropdown-toggle secondary-btn btn-change-property btn-secondary-white" | |
57 | data-toggle="dropdown" | |
58 | id="caret-ease_resolution" | |
59 | title="Change Ease of Resolution"> | |
60 | <span> <i class="fa fa-angle-down fa-lg" aria-hidden="true"></i> </span> | |
61 | </button> | |
62 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
63 | <li> | |
64 | <a class="ws" | |
65 | ng-click="modal.data.easeofresolution = null">Undetermined</a> | |
66 | <a class="ws" | |
67 | ng-click="modal.data.easeofresolution = 'trivial'">Trivial</a> | |
68 | <a class="ws" | |
69 | ng-click="modal.data.easeofresolution = 'simple'">Simple</a> | |
70 | <a class="ws" | |
71 | ng-click="modal.data.easeofresolution = 'moderate'">Moderate</a> | |
72 | <a class="ws" | |
73 | ng-click="modal.data.easeofresolution = 'difficult'">Difficult</a> | |
74 | <a class="ws" | |
75 | ng-click="modal.data.easeofresolution = 'infeasible'">Infeasible</a> | |
76 | </li> | |
77 | </ul> | |
78 | </div> | |
79 | ||
80 | <div class="customs-radio-inline"> | |
81 | <label class="radio-container" | |
82 | ng-click="modal.data.type = 'Vulnerability'" | |
83 | title="Change type to Vulnerability"> | |
84 | <h5>Vulnerability</h5> | |
85 | <input type="radio" checked="checked" name="radio" ng-checked="modal.data.type === 'Vulnerability'"> | |
86 | <span class="checkmark"></span> | |
87 | </label> | |
88 | <label class="radio-container" | |
89 | ng-click="modal.data.type = 'VulnerabilityWeb'" | |
90 | title="Change type to Vulnerability Web"> | |
91 | <h5>Vulnerability Web</h5> | |
92 | <input type="radio" name="radio" ng-checked="modal.data.type === 'VulnerabilityWeb'"> | |
93 | <span class="checkmark"></span> | |
94 | </label> | |
95 | </div> | |
96 | ||
42 | 97 | </div> |
43 | <div class="form-group"> | |
44 | <div class="col-md-12"> | |
45 | <uib-accordion close-others="true"> | |
46 | <uib-accordion-group is-open="isopen" ng-repeat="host in modal.targets_filtered = (modal.targets | filter:modal.target_filter) | startFrom:modal.currentPage*modal.pageSize | limitTo:modal.pageSize" template-url="scripts/statusReport/partials/accordion-group.html" is-disabled="host.services.length < 1"> | |
47 | <uib-accordion-heading> | |
48 | <a ng-click="modal.setTarget(host)" ng-class="{'multi-selected': modal.data.parents.indexOf(host) >= 0}">{{host.name}} ({{host.hostnames[0]}})</a> | |
49 | </uib-accordion-heading> | |
50 | <div class="panel-body" ng-repeat="service in host.services"> | |
51 | <a ng-model="service" ng-click="modal.setTarget(service)" ng-class="{'multi-selected': modal.data.parents.indexOf(service) >= 0}">{{service.name}} {{service.ports}}</a> | |
52 | </div> | |
53 | </uib-accordion-group> | |
54 | </uib-accordion> | |
55 | <div class="showPagination" ng-show="modal.targets_filtered.length > modal.pageSize"> | |
98 | ||
99 | <!-- Nav tabs --> | |
100 | <ul class="nav nav-tabs" id="nav-tabs-container"> | |
101 | <li class="nav-item active" ng-class="{'has-error': modal.data.type == 'Vulnerability' && modal.data.parents.length == 0}"> | |
102 | <a class="nav-link" data-toggle="tab" data-target="#hosts" href="javascript:;">Hosts</a> | |
103 | </li> | |
104 | <li class="nav-item" ng-class="{'has-error': form.name.$invalid || form.desc.$invalid}"> | |
105 | <a class="nav-link active" data-toggle="tab" data-target="#general" | |
106 | href="javascript:;">General</a> | |
107 | </li> | |
108 | <li class="nav-item"> | |
109 | <a class="nav-link" data-toggle="tab" data-target="#technical_details" href="javascript:;">Technical | |
110 | Details</a> | |
111 | </li> | |
112 | <li class="nav-item"> | |
113 | <a class="nav-link" data-toggle="tab" data-target="#tab-evidence" href="javascript:;">Evidence</a> | |
114 | </li> | |
115 | <li class="nav-item"> | |
116 | <a class="nav-link" data-toggle="tab" data-target="#tab-custom-fields" href="javascript:;">Custom Fields</a> | |
117 | </li> | |
118 | </ul> | |
119 | ||
120 | ||
121 | <div class="tab-content"> | |
122 | <div id="hosts" class="container tab-pane-container tab-pane active"><br> | |
123 | <div class="col-md-12 margin-bottom-15px"> | |
124 | <div class="form-horizontal"> | |
125 | <div class="tab-pane-header">Target</div> | |
126 | <div class="form-group"> | |
127 | <div class="col-md-10"> | |
128 | <div class="form-group input-accordion"> | |
129 | <input type="text" ng-model="modal.target_filter" class="form-control input-sm" | |
130 | placeholder="Search targets" ng-change="modal.currentPage = 0"> | |
131 | </div> | |
132 | </div> | |
133 | <div class="col-md-2"> | |
134 | <div class="btn-group btn-small-margin"> | |
135 | <button type="button" class="btn btn-default btn-xs" title="Select page" | |
136 | ng-click="modal.setTargets(true, modal.currentPage*modal.pageSize, modal.pageSize)" | |
137 | style="height: 30px!important;"> | |
138 | Select page | |
139 | </button> | |
140 | <button type="button" class="btn btn-default btn-xs dropdown-toggle" | |
141 | style="height: 30px!important;" | |
142 | data-toggle="dropdown" | |
143 | title="Select options"> | |
144 | <span class="caret"></span> | |
145 | </button> | |
146 | <ul class="dropdown-menu dropdown-menu-right" role="menu"> | |
147 | <li ng-show="modal.target_filter && modal.targets_filtered.length > 0"> | |
148 | <a class="ws" | |
149 | ng-click="modal.setTargets(true, 0, modal.targets_filtered.length)">Select | |
150 | all hosts in search</a> | |
151 | </li> | |
152 | <li> | |
153 | <a class="ws" | |
154 | ng-click="modal.setTargets(false, 0, modal.targets.length)">Select | |
155 | all | |
156 | hosts</a> | |
157 | </li> | |
158 | <li> | |
159 | <a class="ws" ng-click="modal.setTargets(false, 0, 0)">Clear | |
160 | selection</a> | |
161 | </li> | |
162 | </ul> | |
163 | </div><!-- .btn-group --> | |
164 | </div> | |
165 | </div> | |
166 | <div class="form-group"> | |
167 | <div class="col-md-12"> | |
168 | <uib-accordion close-others="true"> | |
169 | <uib-accordion-group is-open="isopen" | |
170 | ng-repeat="host in modal.targets_filtered = (modal.targets | filter:modal.target_filter) | startFrom:modal.currentPage*modal.pageSize | limitTo:modal.pageSize" | |
171 | template-url="scripts/statusReport/partials/accordion-group.html" | |
172 | is-disabled="host.services.length < 1"> | |
173 | <uib-accordion-heading> | |
174 | <a ng-click="modal.setTarget(host)" | |
175 | ng-class="{'multi-selected': modal.data.parents.indexOf(host) >= 0}">{{host.name}} | |
176 | ({{host.hostnames[0]}})</a> | |
177 | </uib-accordion-heading> | |
178 | <div class="panel-body" ng-repeat="service in host.services"> | |
179 | <a ng-model="service" ng-click="modal.setTarget(service)" | |
180 | ng-class="{'multi-selected': modal.data.parents.indexOf(service) >= 0}">{{service.name}} | |
181 | {{service.ports}}</a> | |
182 | </div> | |
183 | </uib-accordion-group> | |
184 | </uib-accordion> | |
185 | <div class="showPagination" | |
186 | ng-show="modal.targets_filtered.length > modal.pageSize"> | |
187 | <div class="form-group"> | |
188 | <ul class="pagination"> | |
189 | <li><a ng-hide="modal.currentPage <= 0" | |
190 | ng-click="modal.currentPage = modal.currentPage - 1"><span | |
191 | aria-hidden="true">«</span><span | |
192 | class="sr-only">Previous</span></a></li> | |
193 | <li><a>{{modal.currentPage+1}}/{{ ((modal.targets_filtered.length / | |
194 | modal.pageSize) | | |
195 | integer) + 1}}</a></li> | |
196 | <li> | |
197 | <a ng-hide="modal.currentPage >= ((modal.targets_filtered.length / modal.pageSize) | integer)" | |
198 | ng-click="modal.currentPage = modal.currentPage + 1"><span | |
199 | aria-hidden="true">»</span><span | |
200 | class="sr-only">Next</span></a></li> | |
201 | </ul> | |
202 | <ng-form name="goToPage"> | |
203 | <div class="col-md-2"> | |
204 | <input type="number" class="form-control" | |
205 | ng-model="modal.newCurrentPage" | |
206 | placeholder="Go to page"/> | |
207 | </div> | |
208 | <button class="btn btn-danger" ng-click="modal.go()">GO</button> | |
209 | </ng-form> | |
210 | </div> | |
211 | </div> | |
212 | </div> | |
213 | </div> | |
214 | <div class="alert alert-danger target_not_selected" role="alert" | |
215 | ng-hide="modal.data.parents.length > 0"> | |
216 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
217 | <span class="sr-only">Error:</span> | |
218 | There is no target selected | |
219 | </div> | |
220 | <div class="alert alert-danger target_not_selected" role="alert" | |
221 | ng-show="modal.data.type === 'VulnerabilityWeb' && modal.host_parents"> | |
222 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
223 | <span class="sr-only">Error:</span> | |
224 | Trying to create a Web Vulnerability with one or more Host parents. Please deselect the | |
225 | Host targets or | |
226 | <a href="" ng-click="modal.resetTarget()">click here to deselect all targets</a> | |
227 | </div> | |
228 | </div> | |
229 | ||
230 | </div> | |
231 | </div> | |
232 | ||
233 | <div id="general" class="container tab-pane-container tab-pane"><br> | |
234 | <div class="col-md-12"> | |
235 | <div class="tab-pane-header">Search vulnerability database templates | |
236 | <a | |
237 | href="https://github.com/infobyte/faraday/wiki/vulnerabilities-database" | |
238 | target="_blank"><span class="glyphicon glyphicon-question-sign" | |
239 | title="Read more about vulnerability templates in the official Faraday Documentation"></span></a> | |
240 | </div> | |
56 | 241 | <div class="form-group"> |
57 | <ul class="pagination"> | |
58 | <li><a ng-hide="modal.currentPage <= 0" ng-click="modal.currentPage = modal.currentPage - 1"><span aria-hidden="true">«</span><span class="sr-only">Previous</span></a></li> | |
59 | <li><a>{{modal.currentPage+1}}/{{ ((modal.targets_filtered.length / modal.pageSize) | integer) + 1}}</a></li> | |
60 | <li><a ng-hide="modal.currentPage >= ((modal.targets_filtered.length / modal.pageSize) | integer)" ng-click="modal.currentPage = modal.currentPage + 1"><span aria-hidden="true">»</span><span class="sr-only">Next</span></a></li> | |
242 | <input type="text" ng-model="modal.cwe_selected" class="form-control input-sm" | |
243 | placeholder="Search for vulnerability templates" | |
244 | uib-typeahead="cwe as cwe.name for cwe in modal.cweList | filter:{name: $viewValue} | limitTo:10" | |
245 | typeahead-on-select="modal.populate($item, $model, $label)"> | |
246 | </div> | |
247 | </div> | |
248 | ||
249 | <div class="col-md-12 custom-divider"></div> | |
250 | ||
251 | <div class="col-md-12"> | |
252 | <div class="tab-pane-header">Name</div> | |
253 | <div class="form-group" ng-class="{'has-error': form.name.$invalid }"> | |
254 | <label class="sr-only" for="vuln-name">Vuln name</label> | |
255 | <input type="text" class="form-control input-sm" id="vuln-name" name="name" | |
256 | placeholder="Name" | |
257 | ng-model="modal.data.name" required/> | |
258 | </div><!-- .form-group --> | |
259 | </div> | |
260 | ||
261 | <div class="col-md-12"> | |
262 | <div class="tab-pane-header">Description</div> | |
263 | <div class="form-group" ng-class="{'has-error': form.desc.$invalid }"> | |
264 | <label class="sr-only" for="vuln-data">Vuln description</label> | |
265 | <textarea class="form-control" id="vuln-desc" name="desc" | |
266 | ng-model="modal.data.desc" required placeholder="Description" | |
267 | style="margin: 0 2px 0 0; height: 239px; width: 810px;"></textarea> | |
268 | </div><!-- .form-group --> | |
269 | </div> | |
270 | ||
271 | ||
272 | <div class="form-group margin-top-22px"> | |
273 | <div class="col-md-12"> | |
274 | <div class="tab-pane-header">References</div> | |
275 | <div class="input-group margin-bottom-sm"> | |
276 | <label class="sr-only" for="vuln-refs">References</label> | |
277 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" | |
278 | ng-model="modal.new_ref"/> | |
279 | <span class="input-group-addon cursor" ng-click="modal.newReference()"><i | |
280 | class="fa fa-plus-circle"></i></span> | |
281 | </div> | |
282 | </div> | |
283 | <div class="col-md-12 reference" ng-repeat="reference in modal.data.refs"> | |
284 | <div class="input-group margin-bottom-sm"> | |
285 | <label class="sr-only" for="vuln-refs-create">References</label> | |
286 | <input type="text" class="form-control" id="vuln-refs-create" placeholder="Reference" | |
287 | ng-model="reference.value" ng-click="modal.openReference(reference.value)" | |
288 | role="button" | |
289 | readonly/> | |
290 | <span class="input-group-addon cursor" ng-click="modal.data.refs.splice($index, 1)"><i | |
291 | class="fa fa-minus-circle"></i></span> | |
292 | </div> | |
293 | </div> | |
294 | </div><!-- .form-group --> | |
295 | ||
296 | ||
297 | <div class="col-md-12 margin-top-22px"> | |
298 | <div class="tab-pane-header">Resolution</div> | |
299 | <div class="form-group"> | |
300 | <label class="sr-only" for="vuln-data">Vuln resolution</label> | |
301 | <textarea class="form-control" id="vuln-resolution" rows="4" | |
302 | ng-model="modal.data.resolution" placeholder="Resolution"></textarea> | |
303 | </div><!-- .form-group --> | |
304 | </div> | |
305 | ||
306 | ||
307 | <div class="form-group margin-top-22px"> | |
308 | <div class="col-md-12"> | |
309 | <div class="tab-pane-header">Policy Violations</div> | |
310 | <div class="input-group margin-bottom-sm"> | |
311 | <label class="sr-only" for="vuln-policyviolations">Policy Violations</label> | |
312 | <input type="text" class="form-control" id="vuln-policyviolations" | |
313 | placeholder="Policy Violations" ng-model="modal.new_policyviolation"/> | |
314 | <span class="input-group-addon cursor" ng-click="modal.newPolicyViolation()"><i | |
315 | class="fa fa-plus-circle"></i></span> | |
316 | </div> | |
317 | </div> | |
318 | <div class="col-md-12 reference" ng-repeat="policyviolation in modal.data.policyviolations"> | |
319 | <div class="input-group margin-bottom-sm"> | |
320 | <label class="sr-only" for="vuln-policyviolations-value">Policy Violation</label> | |
321 | <input type="text" class="form-control" id="vuln-policyviolations-value" | |
322 | placeholder="Policy Violation" ng-model="policyviolation.value" disabled/> | |
323 | <span class="input-group-addon cursor" | |
324 | ng-click="modal.data.policyviolations.splice($index, 1)"><i | |
325 | class="fa fa-minus-circle"></i></span> | |
326 | </div> | |
327 | </div> | |
328 | </div><!-- .form-group --> | |
329 | ||
330 | ||
331 | <div class="col-md-12 margin-bottom-15px margin-top-22px"> | |
332 | <div class="tab-pane-header">Impact</div> | |
333 | <h4><span ng-repeat="(key, value) in modal.data.impact" class="normal-size" | |
334 | style="cursor: pointer;"> | |
335 | <span ng-class="{'label-impact label-default-impact': !value, 'label-impact label-success-impact': value}" | |
336 | ng-click="modal.toggleImpact(key)">{{key}}</span> | |
337 | </span></h4><!-- .normal-size --> | |
338 | </div> | |
339 | ||
340 | </div> | |
341 | ||
342 | <div id="technical_details" class="container tab-pane-container tab-pane"><br> | |
343 | <div class="col-md-12"> | |
344 | <div class="tab-pane-header">Data</div> | |
345 | <div class="form-group"> | |
346 | <label class="sr-only" for="vuln-data">Vuln data</label> | |
347 | <textarea class="form-control" id="vuln-data" rows="5" | |
348 | ng-model="modal.data.data" placeholder="Data"></textarea> | |
349 | </div><!-- .form-group --> | |
350 | </div> | |
351 | ||
352 | <div class="col-md-6 col-sm-12 col-xs-12" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
353 | <div class="tab-pane-header">Request</div> | |
354 | <div class="form-group"> | |
355 | <label class="sr-only" for="vuln-request">Vuln request</label> | |
356 | <textarea class="form-control" id="vuln-request" rows="8" | |
357 | ng-model="modal.data.request" placeholder="Request"></textarea> | |
358 | </div><!-- .form-group --> | |
359 | </div> | |
360 | ||
361 | <div class="col-md-6 col-sm-12 col-xs-12" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
362 | <div class="tab-pane-header">Response</div> | |
363 | <div class="form-group"> | |
364 | <label class="sr-only" for="vuln-response">Vuln response</label> | |
365 | <textarea class="form-control" id="vuln-response" rows="8" | |
366 | ng-model="modal.data.response" placeholder="Response"></textarea> | |
367 | </div><!-- .form-group --> | |
368 | </div> | |
369 | ||
370 | <div class="margin-top-22px" ng-show="modal.data.type === 'VulnerabilityWeb'"> | |
371 | <div class="col-md-4"> | |
372 | <div class="tab-pane-header">Method</div> | |
373 | <div class="form-group"> | |
374 | <label class="sr-only control-label" for="vuln-method">Method</label> | |
375 | <input type="text" class="form-control" id="vuln-method" placeholder="Method" | |
376 | ng-model="modal.data.method"/> | |
377 | </div><!-- .form-group --> | |
378 | </div> | |
379 | ||
380 | <div class="col-md-3"> | |
381 | <div class="tab-pane-header">Param Name</div> | |
382 | <div class="form-group"> | |
383 | <label class="sr-only control-label" for="vuln-pname">Param Name</label> | |
384 | <input type="text" class="form-control" id="vuln-pname" placeholder="Param name" | |
385 | ng-model="modal.data.pname"/> | |
386 | </div><!-- .form-group --> | |
387 | </div> | |
388 | ||
389 | <div class="col-md-5"> | |
390 | <div class="tab-pane-header">Params</div> | |
391 | <div class="form-group"> | |
392 | <label class="sr-only control-label" for="vuln-params">Params</label> | |
393 | <input type="text" class="form-control" id="vuln-params" placeholder="Params" | |
394 | ng-model="modal.data.params"/> | |
395 | </div><!-- .form-group --> | |
396 | </div> | |
397 | ||
398 | <div class="col-md-4"> | |
399 | <div class="tab-pane-header">Path</div> | |
400 | <div class="form-group"> | |
401 | <label class="sr-only control-label" for="vuln-path">Path</label> | |
402 | <input type="text" class="form-control" id="vuln-path" placeholder="Path" | |
403 | ng-model="modal.data.path"/> | |
404 | </div><!-- .form-group --> | |
405 | </div> | |
406 | ||
407 | <div class="col-md-4"> | |
408 | <div class="tab-pane-header">Query</div> | |
409 | <div class="form-group"> | |
410 | <label class="sr-only control-label" for="vuln-query">Query</label> | |
411 | <input type="text" class="form-control" id="vuln-query" placeholder="Query" | |
412 | ng-model="modal.data.query"/> | |
413 | </div><!-- .form-group --> | |
414 | </div> | |
415 | ||
416 | <div class="col-md-4"> | |
417 | <div class="tab-pane-header">Website</div> | |
418 | <div class="form-group"> | |
419 | <label class="sr-only control-label" for="vuln-website">Website</label> | |
420 | <input type="text" class="form-control" id="vuln-website" placeholder="Website" | |
421 | ng-model="modal.data.website"/> | |
422 | </div><!-- .form-group --> | |
423 | </div> | |
424 | </div> | |
425 | </div> | |
426 | ||
427 | <div id="tab-evidence" class="container tab-pane fade"><br> | |
428 | <div class="col-md-12 margin-bottom-15px"> | |
429 | <div class="tab-pane-header">Evidence</div> | |
430 | <div class="alert alert-danger normal-size" role="alert" ng-if="modal.file_name_error"> | |
431 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
432 | <span class="sr-only">Error:</span> | |
433 | Cannot upload evidence starting with underscore, please choose a different name for the | |
434 | file. | |
435 | </div> | |
436 | <div class="form-group normal-size"> | |
437 | <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" | |
438 | ng-file-change="modal.selectedFiles($files, $event)"/> | |
439 | <p class="help-block">Multiple files are allowed.</p> | |
440 | </div><!-- .form-group --> | |
441 | <div id="evidenceFiles" class="normal-size" ng-if="modal.data._attachments"> | |
442 | <ul> | |
443 | <li ng-repeat="(name, file) in modal.data._attachments"> | |
444 | <div class="btn-group"> | |
445 | <button type="button" class="btn btn-default" | |
446 | ng-click="modal.openEvidence(name)"> | |
447 | <span class="fa {{icons[name]}}" | |
448 | title="Evidence {{name | decodeURIComponent}}"></span> {{name | | |
449 | decodeURIComponent}} | |
450 | </button><!-- ng-repeat --> | |
451 | <button type="button" class="btn btn-danger" | |
452 | ng-click="modal.removeEvidence(name)"> | |
453 | <span class="glyphicon glyphicon-trash"></span> | |
454 | </button> | |
455 | </div> | |
456 | </li> | |
61 | 457 | </ul> |
62 | <ng-form name="goToPage"> | |
63 | <div class="col-md-2"> | |
64 | <input type="number" class="form-control" ng-model="modal.newCurrentPage" placeholder="Go to page"/> | |
65 | </div> | |
66 | <button class="btn btn-danger" ng-click="modal.go()">GO</button> | |
67 | </ng-form> | |
68 | </div> | |
69 | </div> | |
70 | </div> | |
71 | </div> | |
72 | <div class="alert alert-danger target_not_selected" role="alert" ng-hide="modal.data.parents.length > 0"> | |
73 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
74 | <span class="sr-only">Error:</span> | |
75 | There is no target selected | |
76 | </div> | |
77 | <div class="alert alert-danger target_not_selected" role="alert" ng-show="modal.data.type === 'VulnerabilityWeb' && modal.host_parents"> | |
78 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
79 | <span class="sr-only">Error:</span> | |
80 | Trying to create a Vulnerability Web with Host parents. Please select only Service targets. Deselect the Host targets or <a href="" ng-click="modal.resetTarget()">click here to deselect all targets</a> | |
458 | </div><!-- #evidenceFiles --> | |
459 | </div> | |
460 | ||
461 | </div> | |
462 | ||
463 | <div id="tab-custom-fields" class="container tab-pane-container tab-pane fade"><br> | |
464 | <div class="col-md-12 margin-bottom-15px"> | |
465 | <div class="col-md-12" ng-repeat="cf in modal.customFields | orderBy : 'field_order'"> | |
466 | <custom-field field="{{cf}}"></custom-field> | |
467 | </div> | |
468 | </div> | |
81 | 469 | </div> |
82 | 470 | </div> |
83 | 471 | |
84 | <div class="form-horizontal"> | |
85 | <div class="form-group"> | |
86 | <div class="col-md-12"> | |
87 | <h5>Search vulnerability database templates <a href="https://github.com/infobyte/faraday/wiki/vulnerabilities-database" target="_blank"><span class="glyphicon glyphicon-question-sign" title="Read more about vulnerability templates in the official Faraday Documentation"></span></a></h5> | |
88 | <input type="text" ng-model="modal.cwe_selected" class="form-control input-sm" placeholder="Search for vulnerability templates" uib-typeahead="cwe as cwe.name for cwe in modal.cweList | filter:{name: $viewValue} | limitTo:10" typeahead-on-select="modal.populate($item, $model, $label)"> | |
89 | </div> | |
472 | <div class="modal-footer"> | |
473 | <div class="modal-button btn-toolbar"> | |
474 | <button class="btn btn-success" ng-click="modal.ok()" | |
475 | ng-disabled="form.$invalid || modal.data.severity === undefined || (modal.data.type === 'VulnerabilityWeb' && modal.host_parents) || modal.data.parents.length == 0"> | |
476 | OK | |
477 | </button> | |
478 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
90 | 479 | </div> |
91 | <div class="form-group"> | |
92 | <div class="col-md-4"> | |
93 | <h5>Type</h5> | |
94 | <select class="form-control" ng-model="modal.data.type" ng-options="option.value as option.name for option in modal.vuln_types" style="padding:0px 12px;"> | |
95 | </select> | |
96 | </div> | |
97 | <div class="col-md-4 severities"> | |
98 | <h5>Severity</h5> | |
99 | <button type="button" class="btn btn-default dropdown-toggle color-{{modal.data.severity}}" name="severity" data-toggle="dropdown" title="Change severity" ng-class="{'button-error': modal.data.severity === undefined}"> | |
100 | {{modal.data.severity || 'Add severity'}} <span class="caret"></span> | |
101 | </button> | |
102 | <ul id="nav" class="dropdown-menu dropdown-menu-left" role="menu"> | |
103 | <li ng-repeat="s in modal.severities"><a href="" class="ws color-{{s}}" ng-click="modal.data.severity=s">{{s}}</a></li> | |
104 | </ul><!-- WS navigation --> | |
105 | </div> | |
106 | <div class="col-md-4"> | |
107 | <h5>Ease of Resolution</h5> | |
108 | <select class="form-control" ng-model="modal.data.easeofresolution" ng-options="e for e in modal.easeofresolution" style="padding:0px 12px;"> | |
109 | <option value=""></option> | |
110 | </select> | |
111 | </div> | |
112 | </div><!-- .form-group --> | |
113 | <div class="form-group" ng-class="{'has-error': form.name.$invalid }"> | |
114 | <div class="col-md-12"> | |
115 | <label class="sr-only" for="vuln-name">Vuln name</label> | |
116 | <input type="text" class="form-control" id="vuln-name" name="name" placeholder="Name" ng-model="modal.data.name" required/> | |
117 | </div> | |
118 | </div><!-- .form-group --> | |
119 | <div class="form-group" ng-class="{'has-error': form.desc.$invalid }"> | |
120 | <div class="col-md-12"> | |
121 | <label class="sr-only" for="vuln-desc">Vuln description</label> | |
122 | <textarea class="form-control" id="vuln-desc" name="desc" placeholder="Description" ng-model="modal.data.desc" required="" style="margin: 0px 2px 0px 0px; height: 239px; width: 867px;"></textarea></textarea> | |
123 | </div> | |
124 | </div><!-- .form-group --> | |
125 | <div class="form-group"> | |
126 | <div class="col-md-12"> | |
127 | <label class="sr-only" for="vuln-data">Vuln data</label> | |
128 | <textarea class="form-control" id="vuln-data" placeholder="Data" ng-model="modal.data.data"></textarea> | |
129 | </div> | |
130 | </div><!-- .form-group --> | |
131 | <div class="form-group"> | |
132 | <div class="col-md-12"> | |
133 | <div class="input-group margin-bottom-sm"> | |
134 | <label class="sr-only" for="vuln-refs">References</label> | |
135 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="modal.new_ref"/> | |
136 | <span class="input-group-addon cursor" ng-click="modal.newReference()"><i class="fa fa-plus-circle"></i></span> | |
137 | </div> | |
138 | </div> | |
139 | <div class="col-md-12 reference" ng-repeat="reference in modal.data.refs"> | |
140 | <div class="input-group margin-bottom-sm"> | |
141 | <label class="sr-only" for="vuln-refs">References</label> | |
142 | <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="reference.value" disabled/> | |
143 | <span class="input-group-addon cursor" ng-click="modal.data.refs.splice($index, 1)"><i class="fa fa-minus-circle"></i></span> | |
144 | </div> | |
145 | </div> | |
146 | </div><!-- .form-group --> | |
147 | <div class="form-group"> | |
148 | <div class="col-md-12"> | |
149 | <label class="sr-only" for="vuln-resolution">Vuln Resolution</label> | |
150 | <textarea class="form-control" id="vuln-resolution" placeholder="Resolution" ng-model="modal.data.resolution"></textarea> | |
151 | </div> | |
152 | </div><!-- .form-group --> | |
153 | <div class="form-group"> | |
154 | <div class="col-md-12"> | |
155 | <div class="input-group margin-bottom-sm"> | |
156 | <label class="sr-only" for="vuln-policyviolations">Policy Violations</label> | |
157 | <input type="text" class="form-control" id="vuln-policyviolations" placeholder="Policy Violations" ng-model="modal.new_policyviolation"/> | |
158 | <span class="input-group-addon cursor" ng-click="modal.newPolicyViolation()"><i class="fa fa-plus-circle"></i></span> | |
159 | </div> | |
160 | </div> | |
161 | <div class="col-md-12 reference" ng-repeat="policyviolation in modal.data.policyviolations"> | |
162 | <div class="input-group margin-bottom-sm"> | |
163 | <label class="sr-only" for="vuln-policyviolations">Policy Violation</label> | |
164 | <input type="text" class="form-control" id="vuln-policyviolations" placeholder="Policy Violation" ng-model="policyviolation.value" disabled/> | |
165 | <span class="input-group-addon cursor" ng-click="modal.data.policyviolations.splice($index, 1)"><i class="fa fa-minus-circle"></i></span> | |
166 | </div> | |
167 | </div> | |
168 | </div><!-- .form-group --> | |
169 | </div> | |
170 | ||
171 | <div class="animate-switch-container" ng-switch on="modal.data.type"> | |
172 | <div class="animate-switch" ng-switch-when="VulnerabilityWeb"> | |
173 | <div class="form-horizontal"> | |
174 | <div class="form-group"> | |
175 | <div class="col-md-4"> | |
176 | <label class="sr-only control-label" for="vuln-method">Method</label> | |
177 | <input type="text" class="form-control" id="vuln-method" placeholder="Method" ng-model="modal.data.method"/> | |
178 | </div> | |
179 | <div class="col-md-3"> | |
180 | <label class="sr-only control-label" for="vuln-pname">Param Name</label> | |
181 | <input type="text" class="form-control" id="vuln-pname" placeholder="Param name" ng-model="modal.data.pname"/> | |
182 | </div> | |
183 | <div class="col-md-5"> | |
184 | <label class="sr-only control-label" for="vuln-params">Params</label> | |
185 | <input type="text" class="form-control" id="vuln-params" placeholder="Params" ng-model="modal.data.params"/> | |
186 | </div> | |
187 | </div><!-- .form-group --> | |
188 | <div class="form-group"> | |
189 | <div class="col-md-4"> | |
190 | <label class="sr-only control-label" for="vuln-path">Path</label> | |
191 | <input type="text" class="form-control" id="vuln-path" placeholder="Path" ng-model="modal.data.path"/> | |
192 | </div> | |
193 | <div class="col-md-4"> | |
194 | <label class="sr-only control-label" for="vuln-query">Query</label> | |
195 | <input type="text" class="form-control" id="vuln-query" placeholder="Query" ng-model="modal.data.query"/> | |
196 | </div> | |
197 | <div class="col-md-4"> | |
198 | <label class="sr-only control-label" for="vuln-website">Website</label> | |
199 | <input type="text" class="form-control" id="vuln-website" placeholder="Website" ng-model="modal.data.website"/> | |
200 | </div> | |
201 | </div><!-- .form-group --> | |
202 | <div class="form-group"> | |
203 | <div class="col-md-12"> | |
204 | <label class="sr-only control-label" for="vuln-request">Request</label> | |
205 | <textarea class="form-control" id="vuln-request" placeholder="Request" ng-model="modal.data.request"></textarea> | |
206 | </div> | |
207 | </div><!-- .form-group --> | |
208 | <div class="form-group"> | |
209 | <div class="col-md-12"> | |
210 | <label class="sr-only control-label" for="vuln-response">Response</label> | |
211 | <textarea class="form-control" id="vuln-response" placeholder="Response" ng-model="modal.data.response"></textarea> | |
212 | </div> | |
213 | </div><!-- .form-group --> | |
214 | </div><!-- .form-horizontal --> | |
215 | </div><!-- .animate-switch --> | |
216 | <div class="animate-switch" ng-switch-when="Vulnerability"></div> | |
217 | </div><!-- .animate-switch-container --> | |
218 | ||
219 | <h4>Impact</h4> | |
220 | <h4><span ng-repeat="(key, value) in modal.data.impact" class="normal-size" style="cursor: pointer;"> | |
221 | <span ng-class="{'label-impact label-default-impact': !value, 'label-impact label-success-impact': value}" ng-click="modal.toggleImpact(key)">{{key}}</span> | |
222 | </span></h4><!-- .normal-size --> | |
223 | <div> | |
224 | <h4>Evidence</h4> | |
225 | <div class="alert alert-danger normal-size" role="alert" ng-if="modal.file_name_error"> | |
226 | <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
227 | <span class="sr-only">Error:</span> | |
228 | Cannot upload evidence starting with underscore, please choose a different name for the file. | |
229 | </div> | |
230 | <div class="form-group normal-size"> | |
231 | <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" ng-file-change="modal.selectedFiles($files, $event)"/> | |
232 | <p class="help-block">Multiple files are allowed.</p> | |
233 | </div><!-- .form-group --> | |
234 | <div id="evidenceFiles" class="normal-size" ng-if="modal.data._attachments"> | |
235 | <ul> | |
236 | <li ng-repeat="e in modal.data._attachments | orderObjectBy:'name':true | orderBy:'name'"> | |
237 | <div class="btn-group"> | |
238 | <button type="button" class="btn btn-default"> | |
239 | <span class="fa {{icons[e.name]}}" title="Evidence {{e.name}}"></span> {{e.name}} | |
240 | </button><!-- ng-repeat --> | |
241 | <button type="button" class="btn btn-danger" ng-click="modal.removeEvidence(e.name)"> | |
242 | <span class="glyphicon glyphicon-trash"></span> | |
243 | </button> | |
244 | </div> | |
245 | </li> | |
246 | </ul> | |
247 | </div><!-- #evidenceFiles --> | |
248 | </div><!-- .modal-body --> | |
249 | <div class="modal-footer"> | |
250 | <div class="modal-button btn-toolbar"> | |
251 | <button class="btn btn-success" ng-click="modal.ok()" ng-disabled="form.$invalid || modal.data.severity === undefined || (modal.data.type === 'VulnerabilityWeb' && modal.host_parents) || modal.data.parents.length == 0">OK</button> | |
252 | <button class="btn btn-danger" ng-click="modal.cancel()">Cancel</button> | |
253 | 480 | </div> |
254 | 481 | </div> |
255 | 482 | </form> |
139 | 139 | break; |
140 | 140 | |
141 | 141 | default: |
142 | if(expression.substr(i, 3) === 'not' && !isOpenQuotes){ | |
142 | if(expression.substr(i, 3) === 'not' && expression.charAt(i-1) === ' ' | |
143 | && expression.charAt(i+3) === ' ' && !isOpenQuotes){ | |
143 | 144 | tokens.push('not'); |
144 | 145 | i = i + 2; |
145 | 146 | canAddToken = true; |
146 | 147 | } |
147 | 148 | |
148 | else if(expression.substr(i, 3) === 'and' && !isOpenQuotes){ | |
149 | else if(expression.substr(i, 3) === 'and' && expression.charAt(i-1) === ' ' | |
150 | && expression.charAt(i+3) === ' ' && !isOpenQuotes){ | |
149 | 151 | tokens.push('and'); |
150 | 152 | canAddToken = true; |
151 | 153 | i = i + 2; |
152 | 154 | } |
153 | 155 | |
154 | else if(expression.substr(i, 2) === 'or' && !isOpenQuotes){ | |
156 | else if(expression.substr(i, 2) === 'or' && expression.charAt(i-1) === ' ' | |
157 | && expression.charAt(i+2) === ' ' && !isOpenQuotes){ | |
155 | 158 | tokens.push('or'); |
156 | 159 | canAddToken = true; |
157 | 160 | i++; |
46 | 46 | this.ws = ""; |
47 | 47 | this.status = "opened"; |
48 | 48 | this.policyviolations = ""; |
49 | this.custom_fields = {}; | |
49 | 50 | |
50 | 51 | if(data) { |
51 | 52 | if(data.name === undefined || data.name === "") { |
58 | 59 | var public_properties = [ |
59 | 60 | '_attachments', 'confirmed', 'data', 'desc', 'easeofresolution', |
60 | 61 | 'impact', 'name', 'owned', 'policyviolations', 'refs', 'resolution', |
61 | 'severity', 'status', | |
62 | 'severity', 'status', 'custom_fields' | |
62 | 63 | ]; |
63 | 64 | |
64 | 65 | var saved_properties = public_properties.concat( |
80 | 81 | self.ws = ws; |
81 | 82 | if(data.parent !== undefined) self.parent = data.parent; |
82 | 83 | if(data.parent_type !== undefined) self.parent_type = data.parent_type; |
84 | if(data.custom_fields !== undefined) self.custom_fields = data.custom_fields; | |
83 | 85 | |
84 | 86 | self.public_properties.forEach(function(property) { |
85 | 87 | if(data[property] !== undefined) self[property] = data[property]; |
133 | 133 | $scope.insert = function (workspace) { |
134 | 134 | delete workspace.selected; |
135 | 135 | workspacesFact.put(workspace).then(function (resp) { |
136 | workspace.active = resp.data.active; | |
136 | 137 | workspace.stats = resp.data.stats; |
137 | 138 | $scope.onSuccessInsert(workspace) |
138 | 139 | }, |
8 | 8 | import os |
9 | 9 | import sys |
10 | 10 | import json |
11 | import random | |
12 | import string | |
11 | 13 | import inspect |
14 | ||
12 | 15 | import pytest |
16 | import psycopg2 | |
17 | from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT | |
18 | ||
13 | 19 | from factory import Factory |
14 | 20 | from flask.testing import FlaskClient |
15 | 21 | from flask_principal import Identity, identity_changed |
20 | 26 | from server.app import create_app |
21 | 27 | from server.models import db |
22 | 28 | from test_cases import factories |
23 | ||
29 | from server import config | |
24 | 30 | |
25 | 31 | # Discover factories to automatically register them to pytest-factoryboy and to |
26 | 32 | # override its session |
69 | 75 | def pytest_addoption(parser): |
70 | 76 | # currently for tests using sqlite and memory have problem while using transactions |
71 | 77 | # we need to review sqlite configuraitons for persistence using PRAGMA. |
78 | parser.addoption('--use-postgresql', action='store_true', | |
79 | help="Forces the tests to be executed in postgresql " | |
80 | "using server.ini credentials") | |
72 | 81 | parser.addoption('--connection-string', |
73 | 82 | help="Database connection string. Defaults to in-memory " |
74 | 83 | "sqlite if not specified:") |
88 | 97 | def app(request): |
89 | 98 | connection_string = request.config.getoption( |
90 | 99 | '--connection-string') |
91 | if not connection_string: | |
100 | use_postgresql = request.config.getoption( | |
101 | '--use-postgresql') | |
102 | sqlite = False | |
103 | postgres_user, postgres_password = None, None | |
104 | ||
105 | if use_postgresql and not connection_string: | |
106 | connection_string = config.database.connection_string | |
107 | if connection_string: | |
108 | postgres_user, postgres_password = connection_string.split('://')[1].split('@')[0].split(':') | |
109 | ||
110 | if postgres_user and postgres_password: | |
111 | host = connection_string.split('://')[1].split('@')[1].split('/')[0] | |
112 | con = psycopg2.connect(dbname='postgres', | |
113 | user=postgres_user, | |
114 | host=host, | |
115 | password=postgres_password) | |
116 | ||
117 | con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) | |
118 | cur = con.cursor() | |
119 | db_name = ''.join(random.SystemRandom().choice(string.ascii_uppercase) for _ in range(20)) | |
120 | cur.execute("CREATE DATABASE \"%s\" ;" % db_name) | |
121 | connection_string = 'postgresql+psycopg2://{postgres_user}:{postgres_password}@{host}/{db_name}'.format( | |
122 | postgres_user=postgres_user, | |
123 | postgres_password=postgres_password, | |
124 | host=host, | |
125 | db_name=db_name, | |
126 | ) | |
127 | con.close() | |
128 | else: | |
129 | sqlite = True | |
92 | 130 | connection_string = 'sqlite:///' |
131 | ||
93 | 132 | app = create_app(db_connection_string=connection_string, testing=True) |
94 | 133 | app.test_client_class = CustomClient |
95 | 134 | |
98 | 137 | ctx.push() |
99 | 138 | |
100 | 139 | def teardown(): |
140 | with ctx: | |
141 | db.session.close() | |
142 | db.engine.dispose() | |
101 | 143 | ctx.pop() |
144 | if not sqlite: | |
145 | postgres_user, postgres_password = connection_string.split('://')[1].split('@')[0].split(':') | |
146 | host = connection_string.split('://')[1].split('@')[1].split('/')[0] | |
147 | con = psycopg2.connect(dbname='postgres', | |
148 | user=postgres_user, | |
149 | host=host, | |
150 | password=postgres_password) | |
151 | ||
152 | con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) | |
153 | cur = con.cursor() | |
154 | cur.execute("DROP DATABASE \"%s\" ;" % db_name) | |
102 | 155 | |
103 | 156 | request.addfinalizer(teardown) |
104 | 157 | app.config['NPLUSONE_RAISE'] = not request.config.getoption( |
109 | 162 | @pytest.fixture(scope='function') |
110 | 163 | def database(app, request): |
111 | 164 | """Session-wide test database.""" |
112 | ||
113 | def teardown(): | |
114 | if db.engine.dialect.name == 'sqlite': | |
115 | # since sqlite was created in a temp file we skip the drops. | |
116 | return | |
117 | try: | |
118 | db.engine.execute('DROP TABLE vulnerability CASCADE') | |
119 | except Exception: | |
120 | pass | |
121 | try: | |
122 | db.engine.execute('DROP TABLE vulnerability_template CASCADE') | |
123 | except Exception: | |
124 | pass | |
125 | db.drop_all() | |
126 | 165 | |
127 | 166 | # Disable check_vulnerability_host_service_source_code constraint because |
128 | 167 | # it doesn't work in sqlite |
136 | 175 | db.init_app(app) |
137 | 176 | db.create_all() |
138 | 177 | |
139 | request.addfinalizer(teardown) | |
140 | 178 | return db |
141 | 179 | |
142 | 180 |
36 | 36 | VulnerabilityTemplate, |
37 | 37 | VulnerabilityWeb, |
38 | 38 | Workspace, |
39 | ReferenceTemplate, CommandObject, Comment) | |
39 | ReferenceTemplate, | |
40 | CommandObject, | |
41 | Comment, | |
42 | CustomFieldsSchema | |
43 | ) | |
40 | 44 | |
41 | 45 | # Make partials for start and end date. End date must be after start date |
42 | 46 | FuzzyStartTime = lambda: ( |
58 | 62 | |
59 | 63 | class FaradayFactory(factory.alchemy.SQLAlchemyModelFactory): |
60 | 64 | |
61 | # id = factory.Sequence(lambda n: n) | |
62 | pass | |
63 | ||
64 | 65 | @classmethod |
65 | 66 | def build_dict(cls, **kwargs): |
66 | 67 | ret = factory.build(dict, FACTORY_CLASS=cls) |
165 | 166 | |
166 | 167 | class Meta: |
167 | 168 | model = SourceCode |
169 | sqlalchemy_session = db.session | |
170 | ||
171 | ||
172 | class CustomFieldsSchemaFactory(factory.alchemy.SQLAlchemyModelFactory): | |
173 | ||
174 | class Meta: | |
175 | model = CustomFieldsSchema | |
168 | 176 | sqlalchemy_session = db.session |
169 | 177 | |
170 | 178 |
0 | ''' | |
1 | Faraday Penetration Test IDE | |
2 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
3 | See the file 'doc/LICENSE' for the license information | |
4 | ||
5 | ''' | |
6 | import os | |
7 | import pytest | |
8 | from io import BytesIO | |
9 | from datetime import timedelta, datetime | |
10 | ||
11 | from test_cases.factories import WorkspaceFactory, VulnerabilityFactory, CommandFactory | |
12 | ||
13 | @pytest.mark.usefixtures('logged_user') | |
14 | class TestActivityFeed(): | |
15 | def test_activity_feed(self, test_client, session): | |
16 | ws = WorkspaceFactory.create(name="abc") | |
17 | command = CommandFactory.create(workspace=ws, tool="nessus") | |
18 | session.add(ws) | |
19 | session.add(command) | |
20 | session.commit() | |
21 | ||
22 | res = test_client.get( | |
23 | '/v2/ws/{ws_name}/activities/' | |
24 | .format(ws_name=ws.name) | |
25 | ) | |
26 | ||
27 | assert res.status_code == 200 | |
28 | activities = res.json['activities'][0] | |
29 | assert activities['hosts_count'] == 1 | |
30 | assert activities['vulnerabilities_count'] == 1 | |
31 | assert activities['tool'] == 'nessus' | |
32 | ||
33 | ||
34 | def test_load_itime(self, test_client, session): | |
35 | ws = WorkspaceFactory.create(name="abc") | |
36 | command = CommandFactory.create(workspace=ws) | |
37 | session.add(ws) | |
38 | session.add(command) | |
39 | session.commit() | |
40 | ||
41 | # Timestamp of 14/12/2018 | |
42 | itime = 1544745600.0 | |
43 | data = { | |
44 | 'command': command.command, | |
45 | 'tool' : command.tool, | |
46 | 'itime': itime | |
47 | ||
48 | } | |
49 | ||
50 | res = test_client.put( | |
51 | '/v2/ws/{ws_name}/activities/{id}/' | |
52 | .format(ws_name=ws.name, id=command.id), | |
53 | data=data, | |
54 | ) | |
55 | ||
56 | # Changing res.json['itime'] to timestamp format of itime | |
57 | res_itime = res.json['itime'] / 1000 | |
58 | assert res.status_code == 200 | |
59 | assert res_itime == itime⏎ |
0 | import pytest | |
1 | ||
2 | from test_cases.factories import CustomFieldsSchemaFactory | |
3 | from test_cases.test_api_non_workspaced_base import ReadOnlyAPITests | |
4 | ||
5 | from server.api.modules.custom_fields import CustomFieldsSchemaView | |
6 | from server.models import ( | |
7 | CustomFieldsSchema | |
8 | ) | |
9 | ||
10 | @pytest.mark.usefixtures('logged_user') | |
11 | class TestVulnerabilityCustomFields(ReadOnlyAPITests): | |
12 | model = CustomFieldsSchema | |
13 | factory = CustomFieldsSchemaFactory | |
14 | api_endpoint = 'custom_fields_schema' | |
15 | #unique_fields = ['ip'] | |
16 | #update_fields = ['ip', 'description', 'os'] | |
17 | view_class = CustomFieldsSchemaView | |
18 | ||
19 | def test_custom_fields_data(self, session, test_client): | |
20 | add_text_field = CustomFieldsSchemaFactory.create( | |
21 | table_name='vulnerability', | |
22 | field_name='cvss', | |
23 | field_type='text', | |
24 | field_order=1, | |
25 | field_display_name='CVSS', | |
26 | ) | |
27 | session.add(add_text_field) | |
28 | session.commit() | |
29 | ||
30 | res = test_client.get(self.url()) # '/v2/custom_fields_schema/') | |
31 | assert res.status_code == 200 | |
32 | assert {u'field_type': u'text', u'field_name': u'cvss', u'field_display_name': u'CVSS', u'field_order': 1} in res.json |
0 | ''' | |
1 | Faraday Penetration Test IDE | |
2 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
3 | See the file 'doc/LICENSE' for the license information | |
4 | ||
5 | ''' | |
6 | ||
7 | import pytest | |
8 | ||
9 | @pytest.mark.usefixtures('logged_user') | |
10 | class TestGetExploits(): | |
11 | def test_get_exploit(self, test_client): | |
12 | cve_id = "CVE-2018-1999045" | |
13 | res = test_client.get('v2/vulners/exploits/{id}'.format(id=cve_id)) | |
14 | assert res.status_code == 200 | |
15 | ||
16 | def test_key_error(self, test_client): | |
17 | cve_id = "CVE-2018-1999035ERROR" | |
18 | res = test_client.get('v2/vulners/exploits/{id}'.format(id=cve_id)) | |
19 | assert res.status_code == 400 | |
20 | ||
21 | def test_get_exploit_with_modules(self, test_client): | |
22 | cve_id = "CVE-2016-9299" | |
23 | res = test_client.get('v2/vulners/exploits/{id}'.format(id=cve_id)) | |
24 | assert res.status_code == 200 | |
25 | assert res.json.get('metasploit') != [] | |
26 | assert res.json.get('exploitdb') != [] |
24 | 24 | assert response.json['Faraday Server'] == 'Running' |
25 | 25 | # to avoid side effects |
26 | 26 | os.chdir(current_dir) |
27 | ||
28 | def test_get_config(self, test_client): | |
29 | res = test_client.get('/config') | |
30 | assert res.status_code == 200 | |
31 | assert res.json['lic_db'] == 'faraday_licenses' |
15 | 15 | |
16 | 16 | |
17 | 17 | @pytest.mark.usefixtures('logged_user') |
18 | class GenericAPITest: | |
18 | class GenericAPITest(object): | |
19 | 19 | |
20 | 20 | model = None |
21 | 21 | factory = None |
281 | 281 | res = test_client.post(self.url(), data=data) |
282 | 282 | assert res.status_code == 400 |
283 | 283 | assert res.json['messages']['_schema'] == res.json['messages']['_schema'] |
284 | ||
285 | def test_load_ports_without_list(self, test_client): | |
286 | data = { | |
287 | "name": "ports", | |
288 | "description": "testing ports load", | |
289 | "owned": False, | |
290 | "ports": 21, | |
291 | "protocol": "tcp", | |
292 | "status": "open", | |
293 | } | |
294 | res = test_client.post(self.url(), data=data) | |
295 | assert res.status_code == 400 | |
296 | ||
297 | def test_load_ports_with_empty_list(self, test_client): | |
298 | data = { | |
299 | "name": "ports", | |
300 | "description": "testing ports load", | |
301 | "owned": False, | |
302 | "ports": [], | |
303 | "protocol": "tcp", | |
304 | "status": "open", | |
305 | } | |
306 | res = test_client.post(self.url(), data=data) | |
307 | assert res.status_code == 400 | |
308 | ||
309 | def test_load_ports_with_negative_value(self, test_client): | |
310 | data = { | |
311 | "name": "ports", | |
312 | "description": "testing ports load", | |
313 | "owned": False, | |
314 | "ports": [-1], | |
315 | "protocol": "tcp", | |
316 | "status": "open", | |
317 | } | |
318 | res = test_client.post(self.url(), data=data) | |
319 | assert res.status_code == 400 |
0 | ''' | |
1 | Faraday Penetration Test IDE | |
2 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
3 | See the file 'doc/LICENSE' for the license information | |
4 | ||
5 | ''' | |
6 | ||
7 | import pytest | |
8 | ||
9 | @pytest.mark.usefixtures('logged_user') | |
10 | class TestSessionLogged(): | |
11 | def test_session_when_user_is_logged(self, test_client): | |
12 | res = test_client.get('/session') | |
13 | assert res.status_code == 200 | |
14 | ||
15 | class TestSessionNotLogged(): | |
16 | def test_session_when_user_is_not_logged(self, test_client): | |
17 | res = test_client.get('/session') | |
18 | assert res.status_code == 401 |
0 | ''' | |
1 | Faraday Penetration Test IDE | |
2 | Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) | |
3 | See the file 'doc/LICENSE' for the license information | |
4 | ||
5 | ''' | |
6 | ||
7 | import os | |
8 | import pytest | |
9 | from io import BytesIO | |
10 | from mock import Mock, patch | |
11 | ||
12 | from test_cases.factories import WorkspaceFactory | |
13 | from config.configuration import getInstanceConfiguration | |
14 | ||
15 | @pytest.mark.usefixtures('logged_user') | |
16 | class TestFileUpload(): | |
17 | ||
18 | def test_file_upload(self, test_client, session): | |
19 | ws = WorkspaceFactory.create(name="abc") | |
20 | session.add(ws) | |
21 | session.commit() | |
22 | path = os.path.join( | |
23 | os.path.dirname(os.path.realpath(__file__)), | |
24 | 'data', | |
25 | 'nmap_plugin_with_api.xml') | |
26 | ||
27 | with open(path,'r') as report: | |
28 | file_contents = report.read() | |
29 | session_response = test_client.get('/session') | |
30 | csrf_token = session_response.json.get('csrf_token') | |
31 | data = { | |
32 | 'file' : (BytesIO(file_contents), 'nmap_report.xml'), | |
33 | 'csrf_token' : csrf_token | |
34 | } | |
35 | ||
36 | res = test_client.post( | |
37 | '/v2/ws/{ws_name}/upload_report'.format(ws_name=ws.name), | |
38 | data=data, | |
39 | use_json_data=False) | |
40 | ||
41 | assert res.status_code == 200 | |
42 | ||
43 | ||
44 | def test_no_file_in_request(self, test_client, session): | |
45 | ws = WorkspaceFactory.create(name="abc") | |
46 | session.add(ws) | |
47 | session.commit() | |
48 | ||
49 | res = test_client.post( | |
50 | '/v2/ws/{ws_name}/upload_report'.format(ws_name=ws.name)) | |
51 | ||
52 | assert res.status_code == 400 | |
53 | ||
54 | ||
55 | def test_request_without_csrf_token(self, test_client, session): | |
56 | ws = WorkspaceFactory.create(name="abc") | |
57 | session.add(ws) | |
58 | session.commit() | |
59 | path = os.path.join( | |
60 | os.path.dirname(os.path.realpath(__file__)), | |
61 | 'data', | |
62 | 'nmap_plugin_with_api.xml') | |
63 | ||
64 | with open(path,'r') as report: | |
65 | file_contents = report.read() | |
66 | ||
67 | data = { | |
68 | 'file' : (BytesIO(file_contents), 'nmap_report.xml'), | |
69 | } | |
70 | ||
71 | res = test_client.post( | |
72 | '/v2/ws/{ws_name}/upload_report'.format(ws_name=ws.name), | |
73 | data=data, | |
74 | use_json_data=False) | |
75 | ||
76 | assert res.status_code == 403 | |
77 | ||
78 | ||
79 | def test_request_with_workspace_deactivate(self, test_client, session): | |
80 | ws = WorkspaceFactory.create(name="abc") | |
81 | ws.active = False | |
82 | session.add(ws) | |
83 | session.commit() | |
84 | path = os.path.join( | |
85 | os.path.dirname(os.path.realpath(__file__)), | |
86 | 'data', | |
87 | 'nmap_plugin_with_api.xml') | |
88 | ||
89 | with open(path,'r') as report: | |
90 | file_contents = report.read() | |
91 | ||
92 | session_response = test_client.get('/session') | |
93 | csrf_token = session_response.json.get('csrf_token') | |
94 | data = { | |
95 | 'file' : (BytesIO(file_contents), 'nmap_report.xml'), | |
96 | 'csrf_token' : csrf_token | |
97 | } | |
98 | res = test_client.post( | |
99 | '/v2/ws/{ws_name}/upload_report'.format(ws_name=ws.name), | |
100 | data=data, | |
101 | use_json_data=False) | |
102 | ||
103 | assert res.status_code == 404 |
16 | 16 | from hypothesis import given |
17 | 17 | from hypothesis.strategies import text, lists, integers, one_of, none |
18 | 18 | from depot.manager import DepotManager |
19 | ||
20 | from test_cases.conftest import ignore_nplusone | |
21 | 19 | |
22 | 20 | try: |
23 | 21 | from urllib import urlencode |
47 | 45 | from test_cases.factories import ServiceFactory, CommandFactory, \ |
48 | 46 | CommandObjectFactory, HostFactory, EmptyCommandFactory, \ |
49 | 47 | UserFactory, VulnerabilityWebFactory, VulnerabilityFactory, \ |
50 | ReferenceFactory, PolicyViolationFactory, HostnameFactory, WorkspaceFactory | |
48 | ReferenceFactory, PolicyViolationFactory, HostnameFactory, \ | |
49 | WorkspaceFactory, CustomFieldsSchemaFactory | |
51 | 50 | |
52 | 51 | CURRENT_PATH = os.path.dirname(os.path.abspath(__file__)) |
53 | 52 | |
345 | 344 | '{0}/attachment/notexistingattachment.png/'.format(vuln_id)) |
346 | 345 | assert res.status_code == 404 |
347 | 346 | |
348 | @ignore_nplusone | |
347 | @pytest.mark.usefixtures('ignore_nplusone') | |
349 | 348 | def test_update_vuln_add_attachment_on_update(self, test_client, session): |
350 | 349 | host = HostFactory.create(workspace=self.workspace) |
351 | 350 | vuln = VulnerabilityFactory.create(workspace=self.workspace, host_id=host.id) |
351 | session.add(vuln) | |
352 | 352 | session.commit() # flush host_with_hostnames |
353 | 353 | attachment = NamedTemporaryFile() |
354 | 354 | file_content = 'test file' |
375 | 375 | file_content = 'new test file' |
376 | 376 | new_attachment.write(file_content) |
377 | 377 | new_attachment.seek(0) |
378 | raw_data = self._create_put_data( | |
379 | 'Updated with attachment', | |
380 | 'Updated vuln', | |
381 | 'open', | |
382 | host.id, | |
383 | 'Host', | |
384 | attachments=[new_attachment] | |
385 | ) | |
378 | 386 | res = test_client.put(self.url(obj=vuln, workspace=self.workspace), |
379 | 387 | data=raw_data) |
380 | 388 | assert res.status_code == 200 |
1578 | 1586 | def test_add_attachment_to_vuln(self, test_client, session, host_with_hostnames): |
1579 | 1587 | ws = WorkspaceFactory.create(name='abc') |
1580 | 1588 | session.add(ws) |
1581 | vuln = VulnerabilityFactory.create(workspace=self.workspace) | |
1589 | vuln = VulnerabilityFactory.create(workspace=ws) | |
1582 | 1590 | session.add(vuln) |
1583 | 1591 | session.commit() |
1584 | 1592 | file_contents = 'my file contents' |
1593 | 1601 | file_id = session.query(Vulnerability).filter_by(id=vuln.id).first().evidence[0].content['file_id'] |
1594 | 1602 | depot = DepotManager.get() |
1595 | 1603 | assert file_contents == depot.get(file_id).read() |
1604 | ||
1605 | def test_delete_attachment_from_vuln(self, test_client, session, host_with_hostnames): | |
1606 | session.commit() # flush host_with_hostnames | |
1607 | ws_name = host_with_hostnames.workspace.name | |
1608 | attachment = NamedTemporaryFile() | |
1609 | file_content = 'test file' | |
1610 | attachment.write(file_content) | |
1611 | attachment.seek(0) | |
1612 | vuln = _create_post_data_vulnerability( | |
1613 | name='Testing vuln', | |
1614 | vuln_type='Vulnerability', | |
1615 | parent_id=host_with_hostnames.id, | |
1616 | parent_type='Host', | |
1617 | refs=[], | |
1618 | policyviolations=[], | |
1619 | attachments=[attachment] | |
1620 | ) | |
1621 | res = test_client.post('/v2/ws/{workspace}/vulns/'\ | |
1622 | .format(workspace=ws_name), data=vuln) | |
1623 | assert res.status_code == 201 | |
1624 | ||
1625 | filename = attachment.name.split('/')[-1] | |
1626 | vuln_id = res.json['_id'] | |
1627 | res = test_client.delete( | |
1628 | '/v2/ws/{workspace}/vulns/{vulnerability}/attachment/{file_name}/' | |
1629 | .format(workspace=ws_name, vulnerability=vuln_id, file_name=filename) | |
1630 | ) | |
1631 | assert res.status_code == 200 | |
1632 | ||
1633 | query_test = session.query(Vulnerability).filter_by(id=vuln_id).first().evidence | |
1634 | assert query_test == [] | |
1635 | ||
1636 | @pytest.mark.skip("NplusOneError") | |
1637 | def test_vuln_filter(self, test_client, session, workspace): | |
1638 | new_host = HostFactory.create(workspace=workspace) | |
1639 | session.commit() | |
1640 | ||
1641 | raw_data = _create_post_data_vulnerability( | |
1642 | name='vuln_1', | |
1643 | vuln_type='Vulnerability', | |
1644 | parent_id=new_host.id, | |
1645 | parent_type='Host', | |
1646 | refs=[], | |
1647 | policyviolations=[], | |
1648 | description='helloworld', | |
1649 | severity='medium', | |
1650 | ) | |
1651 | res = test_client.post('/v2/ws/{workspace}/vulns/' | |
1652 | .format(workspace=workspace.name), data=raw_data) | |
1653 | ||
1654 | data = { | |
1655 | 'q': '{"filters":[{"name":"severity","op":"eq","val":"medium"}]}' | |
1656 | } | |
1657 | res = test_client.get('/v2/ws/{name}/vulns/filter' | |
1658 | .format(name=workspace.name), query_string=data) | |
1659 | ||
1660 | assert res.status_code == 200 | |
1661 | ||
1662 | value = res.json['vulnerabilities'][0]['value'] | |
1663 | assert value['name'] == 'vuln_1' | |
1664 | ||
1665 | def test_invalid_vuln_filters(self, test_client, session, workspace): | |
1666 | data = { | |
1667 | "q": {"filters":[{"name":"severity","op":"eq","val":"medium"}]} | |
1668 | } | |
1669 | res = test_client.get('/v2/ws/{name}/vulns/filter'.format(name=workspace.name), query_string=data) | |
1670 | assert res.status_code == 400 | |
1671 | ||
1672 | def test_vuln_filter_exception(self, test_client, workspace, session): | |
1673 | vuln = VulnerabilityFactory.create(workspace=workspace, severity="medium") | |
1674 | session.add(vuln) | |
1675 | session.commit() | |
1676 | data = { | |
1677 | 'q': '{"filters":[{"name":"severity","op":"eq","val":"medium"}]}' | |
1678 | } | |
1679 | res = test_client.get('/v2/ws/{name}/vulns/filter'.format(name=workspace.name), query_string=data) | |
1680 | assert res.status_code == 200 | |
1681 | assert res.json['count'] == 0 | |
1682 | ||
1683 | def test_vuln_web_filter_exception(self, test_client, workspace, session): | |
1684 | vuln = VulnerabilityWebFactory.create(workspace=workspace, severity="medium") | |
1685 | session.add(vuln) | |
1686 | session.commit() | |
1687 | data = { | |
1688 | 'q': '{"filters":[{"name":"severity","op":"eq","val":"medium"}]}' | |
1689 | } | |
1690 | res = test_client.get('/v2/ws/{name}/vulns/filter'.format(name=workspace.name), query_string=data) | |
1691 | assert res.status_code == 200 | |
1692 | assert res.json['count'] == 0 | |
1693 | ||
1694 | def test_add_vuln_without_parent_id(self, test_client): | |
1695 | raw_data = _create_post_data_vulnerability( | |
1696 | name='New vulns', | |
1697 | vuln_type='Vulnerability', | |
1698 | parent_id=0, | |
1699 | parent_type="Host", | |
1700 | refs=[], | |
1701 | policyviolations=[], | |
1702 | ) | |
1703 | with pytest.raises(Exception) as err: | |
1704 | res = test_client.post(self.url(), data=raw_data) | |
1705 | assert err.typename == 'AssertionError' | |
1706 | ||
1707 | def test_add_vuln_with_unknown_parent_type(self, test_client, session, host_with_hostnames): | |
1708 | session.commit() | |
1709 | raw_data = _create_post_data_vulnerability( | |
1710 | name='New vulns', | |
1711 | vuln_type='Vulnerability', | |
1712 | parent_id=host_with_hostnames.id, | |
1713 | parent_type="invalid_host", | |
1714 | refs=[], | |
1715 | policyviolations=[], | |
1716 | ) | |
1717 | res = test_client.post(self.url(), data=raw_data) | |
1718 | assert res.json['messages']['_schema'][0] == 'Unknown parent type' | |
1719 | ||
1720 | def test_add_empty_attachment(self, test_client, session, workspace): | |
1721 | vuln = VulnerabilityFactory.create(workspace=workspace) | |
1722 | session.add(vuln) | |
1723 | session.commit() | |
1724 | ||
1725 | res = test_client.post( | |
1726 | '/v2/ws/{ws_name}/vulns/{id}/attachment/' | |
1727 | .format(ws_name=workspace.name,id=vuln.id)) | |
1728 | assert res.status_code == 400 | |
1729 | ||
1730 | def test_get_attachment_with_invalid_workspace_and_vuln(self, test_client): | |
1731 | res = test_client.get( | |
1732 | '/v2/ws/{ws_name}/vulns/{vuln_id}/attachment/{name}/' | |
1733 | .format(ws_name="invalid_ws", vuln_id="invalid_vuln", name="random_name")) | |
1734 | assert res.status_code == 404 | |
1735 | ||
1736 | def test_delete_attachment_with_invalid_workspace_and_vuln(self, test_client): | |
1737 | res = test_client.delete( | |
1738 | '/v2/ws/{ws_name}/vulns/{vuln_id}/attachment/{name}/' | |
1739 | .format(ws_name="invalid_ws",vuln_id="invalid_vuln", name="random_name")) | |
1740 | assert res.status_code == 404 | |
1741 | ||
1742 | def test_delete_invalid_attachment(self, test_client, workspace, session): | |
1743 | vuln = VulnerabilityFactory.create(workspace=workspace) | |
1744 | session.add(vuln) | |
1745 | session.commit() | |
1746 | res = test_client.delete( | |
1747 | '/v2/ws/{ws_name}/vulns/{vuln_id}/attachment/{name}/' | |
1748 | .format(ws_name=workspace.name,vuln_id=vuln.id, name="random_name")) | |
1749 | assert res.status_code == 404 | |
1750 | ||
1751 | ||
1752 | @pytest.mark.usefixtures('logged_user') | |
1753 | class TestCustomFieldVulnerability(ReadOnlyAPITests): # TODO migration: use read write api tests | |
1754 | model = Vulnerability | |
1755 | factory = factories.VulnerabilityFactory | |
1756 | api_endpoint = 'vulns' | |
1757 | view_class = VulnerabilityView | |
1758 | ||
1759 | def test_create_vuln_with_custom_fields_shown(self, test_client, second_workspace, session): | |
1760 | host = HostFactory.create(workspace=self.workspace) | |
1761 | custom_field_schema = CustomFieldsSchemaFactory( | |
1762 | field_name='cvss', | |
1763 | field_type='str', | |
1764 | field_display_name='CVSS', | |
1765 | table_name='vulnerability' | |
1766 | ) | |
1767 | session.add(host) | |
1768 | session.add(custom_field_schema) | |
1769 | session.commit() | |
1770 | data = { | |
1771 | 'name': 'Test Alert policy_violations', | |
1772 | 'severity': 'informational', | |
1773 | 'creator': 'Zap', | |
1774 | 'parent_type': 'Host', | |
1775 | 'parent': host.id, | |
1776 | 'type': 'Vulnerability', | |
1777 | 'custom_fields': { | |
1778 | 'CVSS': '321321', | |
1779 | } | |
1780 | } | |
1781 | res = test_client.post(self.url(), data=data) | |
1782 | ||
1783 | assert res.status_code == 201 | |
1784 | assert res.json['custom_fields']['CVSS'] == '321321' | |
1785 | ||
1786 | def test_create_vuln_with_custom_fields_using_field_name_fails(self, test_client, second_workspace, session): | |
1787 | host = HostFactory.create(workspace=self.workspace) | |
1788 | custom_field_schema = CustomFieldsSchemaFactory( | |
1789 | field_name='cvss', | |
1790 | field_type='str', | |
1791 | field_display_name='CVSS', | |
1792 | table_name='vulnerability' | |
1793 | ) | |
1794 | session.add(host) | |
1795 | session.add(custom_field_schema) | |
1796 | session.commit() | |
1797 | data = { | |
1798 | 'name': 'Test Alert policy_violations', | |
1799 | 'severity': 'informational', | |
1800 | 'creator': 'Zap', | |
1801 | 'parent_type': 'Host', | |
1802 | 'parent': host.id, | |
1803 | 'type': 'Vulnerability', | |
1804 | 'custom_fields': { | |
1805 | 'cvss': '321321', # here we use the field_name and not the display_name | |
1806 | } | |
1807 | } | |
1808 | res = test_client.post(self.url(), data=data) | |
1809 | ||
1810 | assert res.status_code == 400 | |
1811 | ||
1812 | def test_create_vuln_with_custom_fields_list(self, test_client, second_workspace, session): | |
1813 | host = HostFactory.create(workspace=self.workspace) | |
1814 | custom_field_schema = CustomFieldsSchemaFactory( | |
1815 | field_name='changes', | |
1816 | field_type='list', | |
1817 | field_display_name='Changes', | |
1818 | table_name='vulnerability' | |
1819 | ) | |
1820 | session.add(host) | |
1821 | session.add(custom_field_schema) | |
1822 | session.commit() | |
1823 | data = { | |
1824 | 'name': 'Test Alert policy_violations', | |
1825 | 'severity': 'informational', | |
1826 | 'creator': 'Zap', | |
1827 | 'parent_type': 'Host', | |
1828 | 'parent': host.id, | |
1829 | 'type': 'Vulnerability', | |
1830 | 'custom_fields': { | |
1831 | 'Changes': ['1', '2', '3'], | |
1832 | } | |
1833 | } | |
1834 | res = test_client.post(self.url(), data=data) | |
1835 | ||
1836 | assert res.status_code == 201 | |
1837 | assert res.json['custom_fields']['Changes'] == ['1', '2', '3'] | |
1838 | ||
1839 | def test_create_vuln_with_custom_fields_with_invalid_type_fails(self, test_client, second_workspace, session): | |
1840 | host = HostFactory.create(workspace=self.workspace) | |
1841 | custom_field_schema = CustomFieldsSchemaFactory( | |
1842 | field_name='cvss', | |
1843 | field_type='int', | |
1844 | field_display_name='CVSS', | |
1845 | table_name='vulnerability' | |
1846 | ) | |
1847 | session.add(host) | |
1848 | session.add(custom_field_schema) | |
1849 | session.commit() | |
1850 | data = { | |
1851 | 'name': 'Test Alert policy_violations', | |
1852 | 'severity': 'informational', | |
1853 | 'creator': 'Zap', | |
1854 | 'parent_type': 'Host', | |
1855 | 'parent': host.id, | |
1856 | 'type': 'Vulnerability', | |
1857 | 'custom_fields': { | |
1858 | 'CVSS': 'pepe', | |
1859 | } | |
1860 | } | |
1861 | res = test_client.post(self.url(), data=data) | |
1862 | ||
1863 | assert res.status_code == 400 | |
1864 | ||
1865 | def test_create_vuln_with_invalid_custom_fields_fails(self, test_client, second_workspace, session): | |
1866 | host = HostFactory.create(workspace=self.workspace) | |
1867 | session.add(host) | |
1868 | session.commit() | |
1869 | data = { | |
1870 | 'name': 'Test Alert policy_violations', | |
1871 | 'severity': 'informational', | |
1872 | 'creator': 'Zap', | |
1873 | 'parent_type': 'Host', | |
1874 | 'parent': host.id, | |
1875 | 'type': 'Vulnerability', | |
1876 | 'custom_fields': { | |
1877 | 'CVSS': '321321', | |
1878 | } | |
1879 | } | |
1880 | res = test_client.post(self.url(), data=data) | |
1881 | ||
1882 | assert res.status_code == 400 | |
1883 | ||
1884 | ||
1885 | @pytest.mark.usefixtures('logged_user') | |
1886 | class TestVulnerabilityCustomFields(ReadOnlyAPITests): | |
1887 | model = Vulnerability | |
1888 | factory = factories.VulnerabilityFactory | |
1889 | api_endpoint = 'vulns' | |
1890 | #unique_fields = ['ip'] | |
1891 | #update_fields = ['ip', 'description', 'os'] | |
1892 | view_class = VulnerabilityView | |
1893 | ||
1894 | def test_custom_field_cvss(self, session, test_client): | |
1895 | add_text_field = CustomFieldsSchemaFactory.create( | |
1896 | table_name='vulnerability', | |
1897 | field_name='cvss', | |
1898 | field_type='text', | |
1899 | field_display_name='CVSS', | |
1900 | ) | |
1901 | session.add(add_text_field) | |
1902 | session.commit() | |
1596 | 1903 | |
1597 | 1904 | |
1598 | 1905 | def test_type_filter(workspace, session, |
8 | 8 | |
9 | 9 | from server.models import Workspace, Scope |
10 | 10 | from server.api.modules.workspaces import WorkspaceView |
11 | from test_cases.conftest import ignore_nplusone | |
12 | 11 | from test_cases.test_api_non_workspaced_base import ReadWriteAPITests |
13 | 12 | from test_cases import factories |
14 | 13 | |
198 | 197 | assert set(res.json['scope']) == set(desired_scope) |
199 | 198 | assert set(s.name for s in workspace.scope) == set(desired_scope) |
200 | 199 | |
201 | @ignore_nplusone | |
200 | @pytest.mark.skip # TODO fix fox sqlite | |
202 | 201 | def test_list_retrieves_all_items_from(self, test_client): |
203 | 202 | super(TestWorkspaceAPI, self).test_list_retrieves_all_items_from(test_client) |
204 | 203 | |
204 | def test_workspace_activation(self, test_client, workspace, session): | |
205 | workspace.active = False | |
206 | session.add(workspace) | |
207 | session.commit() | |
208 | res = test_client.put('{url}{id}/activate/' | |
209 | .format(url=self.url(), | |
210 | id=workspace.name)) | |
211 | assert res.status_code == 200 | |
212 | ||
213 | res = test_client.get('{url}{id}/'.format(url=self.url(),id=workspace.name)) | |
214 | active = res.json.get('active') | |
215 | assert active == True | |
216 | ||
217 | active_query = session.query(Workspace).filter_by(id=workspace.id).first().active | |
218 | assert active_query == True | |
219 | ||
220 | def test_workspace_deactivation(self, test_client, workspace, session): | |
221 | workspace.active = True | |
222 | session.add(workspace) | |
223 | session.commit() | |
224 | res = test_client.put('{url}{id}/deactivate/' | |
225 | .format(url=self.url(), | |
226 | id=workspace.name)) | |
227 | assert res.status_code == 200 | |
228 | ||
229 | res = test_client.get('{url}{id}/'.format(url=self.url(),id=workspace.name)) | |
230 | active = res.json.get('active') | |
231 | assert active == False | |
232 | ||
233 | active_query = session.query(Workspace).filter_by(id=workspace.id).first().active | |
234 | assert active_query == False |
0 | import os | |
1 | import time | |
2 | import signal | |
3 | import subprocess | |
4 | from datetime import datetime | |
5 | from server.utils import daemonize | |
6 | ||
7 | ||
8 | def test_start_and_kill_faraday_server(): | |
9 | """ | |
10 | Starts the server and then send a signal to kill the | |
11 | process gracefully. | |
12 | The idea is to catch a broken faraday-server.py | |
13 | After sending the signal we wait for 15 seconds and | |
14 | if the server didn't stop we fail the test also. | |
15 | """ | |
16 | current_path = os.path.dirname(os.path.abspath(__file__)) | |
17 | server_port = 5988 | |
18 | while daemonize.is_server_running(server_port) and server_port < 6500: | |
19 | server_port += 1 | |
20 | ||
21 | if server_port > 6500: | |
22 | raise Exception('No free ports could be found') | |
23 | ||
24 | server_script = os.path.join(current_path, '..', 'faraday-server.py') | |
25 | command = ['/usr/bin/env', 'python2.7', server_script, '--port', '{0}'.format(server_port)] | |
26 | subproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
27 | start = datetime.now() | |
28 | while subproc.returncode is None: | |
29 | now = datetime.now() | |
30 | delta = now - start | |
31 | if delta.seconds > 40: | |
32 | raise UserWarning('Faraday server test timeout!') | |
33 | if delta.seconds > 4: | |
34 | subproc.send_signal(signal.SIGTERM) | |
35 | subproc.wait() | |
36 | subproc.poll() | |
37 | delta = now - start | |
38 | subproc.poll() | |
39 | time.sleep(0.1) | |
40 | out, err = subproc.communicate() | |
41 | assert subproc.returncode == 0, err |
40 | 40 | # We use it to test all model classes. |
41 | 41 | # to add more tests you need to add items in the list or more objects in the dict. |
42 | 42 | |
43 | OBJ_DATA = { | |
43 | OBJ_DATA = [ | |
44 | 44 | # the key is the object being tested |
45 | Host: [{ | |
45 | { | |
46 | 'class': Host, | |
46 | 47 | 'factory': HostFactory, |
47 | 48 | # api_end_point is used to assert the generated url. |
48 | 49 | 'api_end_point': 'hosts', |
70 | 71 | 'owned': False, |
71 | 72 | 'owner': 'leo', |
72 | 73 | 'parent': None, |
73 | 'type': 'Host' | |
74 | }, | |
75 | }], | |
76 | Service: [{ | |
74 | 'type': 'Host', | |
75 | 'mac': '' | |
76 | }, | |
77 | }, | |
78 | { | |
79 | 'class': Service, | |
77 | 80 | 'factory': ServiceFactory, |
78 | 81 | 'api_end_point': 'services', |
79 | 82 | 'parent': { |
104 | 107 | 'owner': 'leo', |
105 | 108 | 'type': 'Service' |
106 | 109 | }, |
107 | }], | |
108 | Vuln: [{ | |
110 | }, | |
111 | { | |
112 | 'class': Vuln, | |
109 | 113 | 'factory': VulnerabilityFactory, |
110 | 114 | 'api_end_point': 'vulns', |
111 | 115 | 'parent': { |
138 | 142 | 'status': 'opened', |
139 | 143 | 'resolution': None, |
140 | 144 | }, |
141 | }], | |
142 | VulnWeb: [{ | |
145 | }, | |
146 | { | |
147 | 'class': VulnWeb, | |
143 | 148 | 'factory': VulnerabilityWebFactory, |
144 | 149 | 'api_end_point': 'vulns', |
145 | 150 | 'parent': { |
189 | 194 | 'query': 'query test', |
190 | 195 | 'response': 'repsonse data', |
191 | 196 | }, |
192 | }], | |
193 | Credential: [{ | |
197 | }, | |
198 | { | |
199 | 'class': Credential, | |
194 | 200 | 'factory': CredentialFactory, |
195 | 201 | 'api_end_point': 'credential', |
196 | 202 | 'parent': { |
216 | 222 | 'username': 'username1', |
217 | 223 | 'type': 'Cred', |
218 | 224 | }, |
219 | }], | |
220 | Note: [{ | |
225 | }, | |
226 | { | |
227 | 'class': Note, | |
221 | 228 | 'factory': CommentFactory, |
222 | 229 | 'api_end_point': 'comment', |
223 | 230 | # parent not used |
245 | 252 | 'owner': 'leo', |
246 | 253 | 'text': 'Text from Note', |
247 | 254 | 'type': 'Note'}, |
248 | }], | |
249 | Command: [{ | |
255 | }, | |
256 | { | |
257 | 'class': Command, | |
250 | 258 | 'factory': EmptyCommandFactory, |
251 | 259 | 'api_end_point': 'commands', |
252 | 260 | # parent not used |
280 | 288 | 'user': 'leonardo', |
281 | 289 | 'workspace': u'test' |
282 | 290 | } |
283 | }] | |
284 | } | |
291 | } | |
292 | ] | |
285 | 293 | |
286 | 294 | |
287 | 295 | # the following dict is used to parametrize find (GET) tests |
288 | 296 | # mocked_response is the json returned by the api |
289 | 297 | # serialized_expected_results the expected serialized result. |
290 | GET_OBJ_DATA = { | |
291 | VulnWeb: [ | |
298 | GET_OBJ_DATA = [ | |
292 | 299 | { |
300 | 'class': VulnWeb, | |
293 | 301 | 'factory': VulnerabilityWebFactory, |
294 | 302 | 'api_end_point': 'vulns', |
295 | 303 | 'get_properties_function': get_vuln_web_properties, |
382 | 390 | "pname": "pname" |
383 | 391 | } |
384 | 392 | |
385 | } | |
386 | ], | |
387 | Vuln: [ | |
393 | }, | |
388 | 394 | { |
395 | 'class': Vuln, | |
389 | 396 | 'factory': VulnerabilityFactory, |
390 | 397 | 'api_end_point': 'vulns', |
391 | 398 | 'get_properties_function': get_vuln_properties, |
466 | 473 | 'status': 'opened' |
467 | 474 | } |
468 | 475 | |
469 | } | |
470 | ], | |
471 | Host: [ | |
476 | }, | |
472 | 477 | { |
478 | 'class': Host, | |
473 | 479 | 'factory': HostFactory, |
474 | 480 | 'api_end_point': 'hosts', |
475 | 481 | 'get_properties_function': get_host_properties, |
494 | 500 | 'os': 'Linux 2.6.9', |
495 | 501 | 'hostnames': [], |
496 | 502 | 'owned': False, |
497 | 'owner': 'leonardo'} | |
498 | ||
499 | } | |
500 | ], | |
501 | Service: [ | |
503 | 'owner': 'leonardo', | |
504 | 'mac': ''} | |
505 | ||
506 | }, | |
502 | 507 | { |
508 | 'class': Service, | |
503 | 509 | 'factory': ServiceFactory, |
504 | 510 | 'api_end_point': 'services', |
505 | 511 | 'parent': { |
548 | 554 | 'owner': 'leonardo' |
549 | 555 | } |
550 | 556 | |
551 | } | |
552 | ], | |
553 | Credential: [{ | |
557 | }, | |
558 | { | |
559 | 'class': Credential, | |
554 | 560 | 'factory': ServiceFactory, |
555 | 561 | 'api_end_point': 'credential', |
556 | 562 | 'parent': { |
592 | 598 | 'password': 'secretpassword', |
593 | 599 | 'username': 'user1' |
594 | 600 | } |
595 | }], | |
596 | Credential: [{ | |
601 | }, | |
602 | { | |
603 | 'class': Credential, | |
597 | 604 | 'factory': ServiceFactory, |
598 | 605 | 'api_end_point': 'credential', |
599 | 606 | 'parent': { |
635 | 642 | 'password': 'secretpassword', |
636 | 643 | 'username': 'user1' |
637 | 644 | } |
638 | }], | |
639 | Command: [{ | |
645 | }, | |
646 | { | |
647 | 'class': Command, | |
640 | 648 | 'factory': ServiceFactory, |
641 | 649 | 'api_end_point': 'commands', |
642 | 650 | 'parent': { |
667 | 675 | 'itime': 1513365824, |
668 | 676 | 'params': '/home/lcubo/.faraday/report/dsadsa/nessus_report_Remote.nessus', |
669 | 677 | 'user': 'lcubo'} |
670 | }] | |
671 | } | |
678 | } | |
679 | ] | |
672 | 680 | |
673 | 681 | class MockResponse: |
674 | 682 | def __init__(self, json_data, status_code): |
682 | 690 | @pytest.mark.usefixtures('logged_user') |
683 | 691 | class TestMapperManager(): |
684 | 692 | |
685 | @pytest.mark.parametrize("obj_class, many_test_data", OBJ_DATA.items()) | |
686 | def test_save_without_command(self, obj_class, many_test_data, monkeypatch, session): | |
693 | @pytest.mark.parametrize("many_test_data", OBJ_DATA) | |
694 | def test_save_without_command(self, many_test_data, monkeypatch, session): | |
687 | 695 | """ |
688 | 696 | This test verifies that the request made to the api are the expected ones |
689 | 697 | """ |
698 | obj_class = many_test_data['class'] | |
690 | 699 | workspace = WorkspaceFactory.create(name='test') |
691 | 700 | session.commit() |
692 | 701 | mapper_manager = MapperManager() |
693 | 702 | mapper_manager.createMappers(workspace.name) |
694 | ||
695 | for test_data in many_test_data: | |
696 | raw_data = test_data['data'] | |
697 | if test_data['parent']: | |
698 | parent = test_data['parent']['parent_factory'].create() | |
699 | session.commit() | |
700 | test_data['data']['parent'] = parent.id | |
701 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
702 | if obj_class not in [Note, Command]: | |
703 | test_data['expected_payload']['parent'] = parent.id | |
704 | if obj_class in [Vuln, Credential]: | |
705 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
706 | def mock_server_post(test_data, post_url, update=False, expected_response=201, **params): | |
707 | assert post_url == '{0}/ws/test/{1}/'.format( | |
708 | _create_server_api_url(), test_data['api_end_point']) | |
709 | assert expected_response == 201 | |
710 | assert update == False | |
711 | if obj_class not in [Command]: | |
712 | metadata = params.pop('metadata') | |
713 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
714 | assert params == test_data['expected_payload'] | |
715 | return { | |
716 | 'id': 1, | |
717 | 'ok': True, | |
718 | 'rev': '' | |
719 | } | |
720 | ||
721 | monkeypatch.setattr(persistence.server.server, '_post', partial(mock_server_post, test_data)) | |
722 | obj = obj_class(raw_data, workspace.name) | |
723 | mapper_manager.save(obj) | |
724 | ||
725 | @pytest.mark.parametrize("obj_class, many_test_data", OBJ_DATA.items()) | |
726 | def test_save_with_command(self, obj_class, many_test_data, monkeypatch, session): | |
703 | test_data = many_test_data | |
704 | raw_data = test_data['data'] | |
705 | if test_data['parent']: | |
706 | parent = test_data['parent']['parent_factory'].create() | |
707 | session.commit() | |
708 | test_data['data']['parent'] = parent.id | |
709 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
710 | if obj_class not in [Note, Command]: | |
711 | test_data['expected_payload']['parent'] = parent.id | |
712 | if obj_class in [Vuln, Credential]: | |
713 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
714 | def mock_server_post(test_data, post_url, update=False, expected_response=201, **params): | |
715 | assert post_url == '{0}/ws/test/{1}/'.format( | |
716 | _create_server_api_url(), test_data['api_end_point']) | |
717 | assert expected_response == 201 | |
718 | assert update == False | |
719 | if obj_class not in [Command]: | |
720 | metadata = params.pop('metadata') | |
721 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
722 | assert params == test_data['expected_payload'] | |
723 | return { | |
724 | 'id': 1, | |
725 | 'ok': True, | |
726 | 'rev': '' | |
727 | } | |
728 | ||
729 | monkeypatch.setattr(persistence.server.server, '_post', partial(mock_server_post, test_data)) | |
730 | obj = obj_class(raw_data, workspace.name) | |
731 | mapper_manager.save(obj) | |
732 | ||
733 | @pytest.mark.parametrize("many_test_data", OBJ_DATA) | |
734 | def test_save_with_command(self, many_test_data, monkeypatch, session): | |
735 | obj_class = many_test_data['class'] | |
727 | 736 | if obj_class == Command: |
728 | 737 | return |
729 | 738 | workspace = WorkspaceFactory.create(name='test') |
731 | 740 | session.commit() |
732 | 741 | mapper_manager = MapperManager() |
733 | 742 | mapper_manager.createMappers(workspace.name) |
734 | for test_data in many_test_data: | |
735 | raw_data = test_data['data'] | |
736 | if test_data['parent']: | |
737 | parent = test_data['parent']['parent_factory'].create() | |
738 | session.commit() | |
739 | ||
740 | test_data['data']['parent'] = parent.id | |
741 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
742 | if obj_class not in [Note]: | |
743 | test_data['expected_payload']['parent'] = parent.id | |
744 | if obj_class in [Vuln, Credential]: | |
745 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
746 | def mock_server_post(test_data, post_url, update=False, expected_response=201, **params): | |
747 | assert post_url == '{0}/ws/test/{1}/?command_id={2}'.format(_create_server_api_url(), test_data['api_end_point'], params['command_id']) | |
748 | assert expected_response == 201 | |
749 | assert update == False | |
750 | metadata = params.pop('metadata') | |
751 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
752 | params.pop('command_id') | |
753 | test_data['expected_payload'].pop('command_id') | |
754 | assert params == test_data['expected_payload'] | |
755 | return { | |
756 | 'id': 1, | |
757 | 'ok': True, | |
758 | 'rev': '' | |
759 | } | |
760 | ||
761 | monkeypatch.setattr(persistence.server.server, '_post', partial(mock_server_post, test_data)) | |
762 | obj = obj_class(raw_data, workspace.name) | |
763 | mapper_manager.save(obj, command.id) | |
764 | ||
765 | @pytest.mark.parametrize("obj_class, many_test_data", OBJ_DATA.items()) | |
766 | def test_update_without_command(self, obj_class, many_test_data, monkeypatch, session): | |
743 | test_data = many_test_data | |
744 | raw_data = test_data['data'] | |
745 | if test_data['parent']: | |
746 | parent = test_data['parent']['parent_factory'].create() | |
747 | session.commit() | |
748 | ||
749 | test_data['data']['parent'] = parent.id | |
750 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
751 | if obj_class not in [Note]: | |
752 | test_data['expected_payload']['parent'] = parent.id | |
753 | if obj_class in [Vuln, Credential]: | |
754 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
755 | def mock_server_post(test_data, post_url, update=False, expected_response=201, **params): | |
756 | assert post_url == '{0}/ws/test/{1}/?command_id={2}'.format(_create_server_api_url(), test_data['api_end_point'], params['command_id']) | |
757 | assert expected_response == 201 | |
758 | assert update == False | |
759 | metadata = params.pop('metadata') | |
760 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
761 | params.pop('command_id') | |
762 | test_data['expected_payload'].pop('command_id') | |
763 | assert params == test_data['expected_payload'] | |
764 | return { | |
765 | 'id': 1, | |
766 | 'ok': True, | |
767 | 'rev': '' | |
768 | } | |
769 | ||
770 | monkeypatch.setattr(persistence.server.server, '_post', partial(mock_server_post, test_data)) | |
771 | obj = obj_class(raw_data, workspace.name) | |
772 | mapper_manager.save(obj, command.id) | |
773 | ||
774 | @pytest.mark.parametrize("many_test_data", OBJ_DATA) | |
775 | def test_update_without_command(self, many_test_data, monkeypatch, session): | |
776 | obj_class = many_test_data['class'] | |
767 | 777 | workspace = WorkspaceFactory.create(name='test') |
768 | 778 | mapper_manager = MapperManager() |
769 | 779 | mapper_manager.createMappers(workspace.name) |
770 | ||
771 | for test_data in many_test_data: | |
772 | relational_model = test_data['factory'].create() | |
773 | session.add(relational_model) | |
780 | test_data = many_test_data | |
781 | relational_model = test_data['factory'].create() | |
782 | session.add(relational_model) | |
783 | session.commit() | |
784 | raw_data = test_data['data'] | |
785 | if test_data['parent']: | |
786 | parent = test_data['parent']['parent_factory'].create() | |
787 | session.add(parent) | |
774 | 788 | session.commit() |
775 | raw_data = test_data['data'] | |
776 | if test_data['parent']: | |
777 | parent = test_data['parent']['parent_factory'].create() | |
778 | session.add(parent) | |
779 | session.commit() | |
780 | ||
781 | test_data['data']['parent'] = parent.id | |
782 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
783 | if obj_class not in [Note, Command]: | |
784 | test_data['expected_payload']['parent'] = parent.id | |
785 | if obj_class in [Vuln, Credential]: | |
786 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
787 | def mock_server_put(test_data, put_url, update=False, expected_response=201, **params): | |
788 | assert put_url == '{0}/ws/test/{1}/{2}/'.format(_create_server_api_url(), test_data['api_end_point'], test_data['id']) | |
789 | assert expected_response == 200 | |
790 | assert update == False | |
791 | if obj_class not in [Command]: | |
792 | metadata = params.pop('metadata') | |
793 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
794 | params.pop('command_id', None) | |
795 | test_data['expected_payload'].pop('command_id', None) | |
796 | assert params == test_data['expected_payload'] | |
797 | ||
798 | return { | |
799 | 'id': 1, | |
800 | 'ok': True, | |
801 | 'rev': '' | |
802 | } | |
803 | ||
804 | raw_data['id'] = relational_model.id | |
805 | test_data['id'] = relational_model.id | |
806 | monkeypatch.setattr(persistence.server.server, '_put', partial(mock_server_put, test_data)) | |
807 | ||
808 | obj = obj_class(raw_data, workspace.name) | |
809 | mapper_manager.update(obj) | |
810 | ||
811 | @pytest.mark.parametrize("obj_class, many_test_data", OBJ_DATA.items()) | |
812 | def test_update_with_command(self, obj_class, many_test_data, monkeypatch, session): | |
789 | ||
790 | test_data['data']['parent'] = parent.id | |
791 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
792 | if obj_class not in [Note, Command]: | |
793 | test_data['expected_payload']['parent'] = parent.id | |
794 | if obj_class in [Vuln, Credential]: | |
795 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
796 | def mock_server_put(test_data, put_url, update=False, expected_response=201, **params): | |
797 | assert put_url == '{0}/ws/test/{1}/{2}/'.format(_create_server_api_url(), test_data['api_end_point'], test_data['id']) | |
798 | assert expected_response == 200 | |
799 | assert update == False | |
800 | if obj_class not in [Command]: | |
801 | metadata = params.pop('metadata') | |
802 | assert metadata['owner'] == test_data['expected_payload']['owner'] | |
803 | params.pop('command_id', None) | |
804 | test_data['expected_payload'].pop('command_id', None) | |
805 | assert params == test_data['expected_payload'] | |
806 | ||
807 | return { | |
808 | 'id': 1, | |
809 | 'ok': True, | |
810 | 'rev': '' | |
811 | } | |
812 | ||
813 | raw_data['id'] = relational_model.id | |
814 | test_data['id'] = relational_model.id | |
815 | monkeypatch.setattr(persistence.server.server, '_put', partial(mock_server_put, test_data)) | |
816 | ||
817 | obj = obj_class(raw_data, workspace.name) | |
818 | mapper_manager.update(obj) | |
819 | ||
820 | @pytest.mark.parametrize("many_test_data", OBJ_DATA) | |
821 | def test_update_with_command(self, many_test_data, monkeypatch, session): | |
822 | obj_class = many_test_data['class'] | |
813 | 823 | if obj_class in [Command]: |
814 | 824 | return |
815 | 825 | workspace = WorkspaceFactory.create(name='test') |
819 | 829 | mapper_manager = MapperManager() |
820 | 830 | mapper_manager.createMappers(workspace.name) |
821 | 831 | |
822 | for test_data in many_test_data: | |
823 | raw_data = test_data['data'] | |
824 | if test_data['parent']: | |
825 | parent = test_data['parent']['parent_factory'].create() | |
826 | session.add(parent) | |
827 | session.commit() | |
828 | test_data['data']['parent'] = parent.id | |
829 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
830 | test_data['expected_payload']['parent'] = parent.id | |
831 | if obj_class in [Vuln, Credential]: | |
832 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
833 | relational_model = test_data['factory'].create() | |
834 | session.add(relational_model) | |
832 | test_data = many_test_data | |
833 | raw_data = test_data['data'] | |
834 | if test_data['parent']: | |
835 | parent = test_data['parent']['parent_factory'].create() | |
836 | session.add(parent) | |
835 | 837 | session.commit() |
836 | def mock_server_put(put_url, update=False, expected_response=201, **params): | |
837 | assert put_url == '{0}/ws/test/{1}/{2}/?command_id={3}'.format( | |
838 | _create_server_api_url(), | |
839 | test_data['api_end_point'], | |
840 | test_data['id'], | |
841 | params['command_id']) | |
842 | assert expected_response == 200 | |
843 | assert update == False | |
844 | return { | |
845 | 'id': 1, | |
846 | 'ok': True, | |
847 | 'rev': '' | |
848 | } | |
849 | ||
850 | raw_data['id'] = relational_model.id | |
851 | test_data['id'] = relational_model.id | |
852 | monkeypatch.setattr(persistence.server.server, '_put', mock_server_put) | |
853 | obj = obj_class(raw_data, workspace.name) | |
854 | mapper_manager.update(obj, command.id) | |
855 | ||
856 | @pytest.mark.parametrize("obj_class, many_test_data", GET_OBJ_DATA.items()) | |
857 | def test_find_obj_by_id(self, obj_class, many_test_data, session, monkeypatch): | |
858 | for test_data in many_test_data: | |
859 | persisted_obj = test_data['factory'].create() | |
860 | session.add(persisted_obj) | |
861 | session.commit() | |
862 | mapper_manager = MapperManager() | |
863 | mapper_manager.createMappers(persisted_obj.workspace.name) | |
864 | ||
865 | def mock_unsafe_io_with_server(host, test_data, server_io_function, server_expected_response, server_url, **payload): | |
866 | mocked_response = test_data['mocked_response'] | |
867 | assert '{0}/ws/{1}/{2}/{3}/'.format( | |
868 | _create_server_api_url(), | |
869 | persisted_obj.workspace.name, | |
870 | test_data['api_end_point'], | |
871 | persisted_obj.id) == server_url | |
872 | return MockResponse(mocked_response, 200) | |
873 | ||
874 | monkeypatch.setattr(persistence.server.server, '_unsafe_io_with_server', partial(mock_unsafe_io_with_server, persisted_obj, test_data)) | |
875 | found_obj = mapper_manager.find(obj_class.class_signature, persisted_obj.id) | |
876 | serialized_obj = test_data['get_properties_function'](found_obj) | |
877 | if obj_class not in [Command]: | |
878 | metadata = serialized_obj.pop('metadata') | |
879 | assert serialized_obj == test_data['serialized_expected_results']⏎ | |
838 | test_data['data']['parent'] = parent.id | |
839 | test_data['data']['parent_type'] = test_data['parent']['parent_type'] | |
840 | test_data['expected_payload']['parent'] = parent.id | |
841 | if obj_class in [Vuln, Credential]: | |
842 | test_data['expected_payload']['parent_type'] = test_data['parent']['parent_type'] | |
843 | relational_model = test_data['factory'].create() | |
844 | session.add(relational_model) | |
845 | session.commit() | |
846 | def mock_server_put(put_url, update=False, expected_response=201, **params): | |
847 | assert put_url == '{0}/ws/test/{1}/{2}/?command_id={3}'.format( | |
848 | _create_server_api_url(), | |
849 | test_data['api_end_point'], | |
850 | test_data['id'], | |
851 | params['command_id']) | |
852 | assert expected_response == 200 | |
853 | assert update == False | |
854 | return { | |
855 | 'id': 1, | |
856 | 'ok': True, | |
857 | 'rev': '' | |
858 | } | |
859 | ||
860 | raw_data['id'] = relational_model.id | |
861 | test_data['id'] = relational_model.id | |
862 | monkeypatch.setattr(persistence.server.server, '_put', mock_server_put) | |
863 | obj = obj_class(raw_data, workspace.name) | |
864 | mapper_manager.update(obj, command.id) | |
865 | ||
866 | @pytest.mark.parametrize("many_test_data", GET_OBJ_DATA) | |
867 | def test_find_obj_by_id(self, many_test_data, session, monkeypatch): | |
868 | obj_class = many_test_data['class'] | |
869 | test_data = many_test_data | |
870 | persisted_obj = test_data['factory'].create() | |
871 | session.add(persisted_obj) | |
872 | session.commit() | |
873 | mapper_manager = MapperManager() | |
874 | mapper_manager.createMappers(persisted_obj.workspace.name) | |
875 | ||
876 | def mock_unsafe_io_with_server(host, test_data, server_io_function, server_expected_response, server_url, **payload): | |
877 | mocked_response = test_data['mocked_response'] | |
878 | assert '{0}/ws/{1}/{2}/{3}/'.format( | |
879 | _create_server_api_url(), | |
880 | persisted_obj.workspace.name, | |
881 | test_data['api_end_point'], | |
882 | persisted_obj.id) == server_url | |
883 | return MockResponse(mocked_response, 200) | |
884 | ||
885 | monkeypatch.setattr(persistence.server.server, '_unsafe_io_with_server', partial(mock_unsafe_io_with_server, persisted_obj, test_data)) | |
886 | found_obj = mapper_manager.find(obj_class.class_signature, persisted_obj.id) | |
887 | serialized_obj = test_data['get_properties_function'](found_obj) | |
888 | if obj_class not in [Command]: | |
889 | metadata = serialized_obj.pop('metadata') | |
890 | assert serialized_obj == test_data['serialized_expected_results'] |