Codebase list python-faraday / ca7b7ee
Imported Upstream version 1.0.10 Sophie Brun 9 years ago
431 changed file(s) with 26802 addition(s) and 5700 deletion(s). Raw diff Collapse all Expand all
3434 .project
3535 .pydevproject
3636
37 # ui_mranea
38 lib-ubuntu13-10-i686.tgz
39 lib-ubuntu13-10-i686/
40 views/reports/_attachments/reports/push.sh
41 views/upload
42 views/reports/_attachments/pushreports.py
37 # Tests nodejs
38 node_modules
39
40 # Couch
41 .couchadmin
66 * Federico Kirschbaum
77 * Matias Ariel Ré Medina
88 * Francisco Amato
9 * Franco Linares
10 * Micaela Ranea Sánchez
911
1012 Project contributors
1113
1214 * Andrés López Luksenberg
13 * Mica Ranea
1415 * Juan Urbano
1516 * Elian Gidoni
16
17
18
19
20 More information on the main contributors to the tool can be found in
21 docs/contributors.txt.
22
3434
3535 $ git clone https://github.com/infobyte/faraday.git faraday-dev
3636 $ cd faraday-dev
37 $ ./install
37 $ ./install.sh
3838
3939
4040
4545
4646 $ ./faraday.py
4747
48 Plugins types:
49 ---
50 We have 3 kind of plugins:
51 * Plugins that intercept commands (directly detected when you execute commands in the console)
52 * Plugins that import file reports (you have to copy the report to $HOME/.faraday/report/[workspacename] and faraday will automatically detect the report, process and added to the HostTree.
53 * Plugins connectors or online (BeEF, Metasploit, Burp) connect directly with external API or database or connect with Faraday RPC API.
54
55 Get it now!
56 ---
57 [![Download Tarball](https://raw.github.com/wiki/infobyte/faraday/images/download.png)]
58 (https://github.com/infobyte/faraday/tarball/master)
4859
4960 Links
5061 ---
88
99 New features in the latest update
1010 =====================================
11
12
13
14 Apr 17, 2015:
15 ---
16 * You can get the new version here:
17 * https://github.com/infobyte/faraday/archive/v1.0.10.tar.gz
18
19 Changes:
20
21 * Styles changes in WEB UI: fancy component selection, improved workspaces selection.
22
23 Bugfixes:
24 * Date on Workspace creation
25 * Tables in Firefox
26
27
28 Apr 7, 2015:
29 ---
30 You can get the new version here:
31 * https://github.com/infobyte/faraday/archive/v1.0.9.tar.gz
32
33 Changes:
34
35 * Performance improvement in the dashboard
36 * Fix bug OSX install
37 * Bug fixes
38
39
40 Mar 9, 2015:
41 ---
42 You can get the new version here:
43
44 * https://github.com/infobyte/faraday/archive/v1.0.8.tar.gz
45
46 Changes:
47
48 * WcScan script and plugin (scripts/wcscan.py)
49 * New Dashboard D3 with AngularJS
50 * Easy access to Vulnerability pages in the Status Report
51 * Easy access to the Host pages on the dashboard
52 * Creation and Editing capabilities for the Workspace from the UI Web
53 * Support installation for the latest version of Debian/Ubuntu/Kali
54 * sqlmap version 1.0-dev support updated
55 * API Status Check in both ZSH & QT GUI
56 * Field added for resolution of vulnerabilities classification with plug-ins updated to support the new function.
57 * Field added for rating "ease of resolution" for vulnerabilities
58 * Adjustments for Resolution field
59
60 * New Faraday plugin for Burp. Version 1.2
61 -Corrections for the vulnerabilities duplication for the burp plugin
62 -New tab section to configure the new Vulnerabilities downloads for Faraday
63
64 * Automated backup for couch database
65 * Ability to upload evidence of a vulnerability (as an attachment)
66 * Ability to assign Vulnerability Impact (confidentiality, integrity, availability).
1167
1268 Dec 12, 2014:
1369 ---
0 1.0.10
0 # Faraday Penetration Test IDE - Community Version
0 # Faraday Penetration Test IDE
11 # Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
22 # See the file 'doc/LICENSE' for the license information
33
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 '''
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 '''
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
2020 from model.visitor import VulnsLookupVisitor
2121
2222 import utils.logs as logger
23 from config.configuration import getInstanceConfiguration
24 CONF = getInstanceConfiguration()
2325
2426
2527 _plugin_controller_api = None
3941 _http_server.stop()
4042
4143
42 def startAPIs(plugin_manager, model_controller, mapper_manager):
44 def startAPIs(plugin_manager, model_controller, mapper_manager, hostname=None, port=None):
4345 global _rest_controllers
4446 global _http_server
4547 _rest_controllers = [PluginControllerAPI(plugin_manager, mapper_manager), ModelControllerAPI(model_controller)]
46 #TODO: load API configuration from config file
47 port = 9977
48
49 #TODO: some way to get defaults.. from config?
50 if str(hostname) == "None":
51 hostname = "localhost"
52 if str(port) == "None":
53 port = 9977
54
55 if CONF.getApiRestfulConInfo() is None:
56 CONF.setApiRestfulConInfo(hostname, port)
57
4858 app = Flask('APISController')
4959
5060 _http_server = HTTPServer(WSGIContainer(app))
51 _http_server.listen(port)
61 _http_server.listen(port,address=hostname)
5262
5363 routes = [r for c in _rest_controllers for r in c.getRoutes()]
5464
133143 view_func=self.createCred,
134144 methods=['PUT']))
135145
146 routes.append(Route(path='/status/check',
147 view_func=self.statusCheck,
148 methods=['GET']))
149
150
136151 return routes
137152
138153 def listWebVulns(self):
139154 vulns = self.controller.getWebVulns()
140 j = [{'request': v.request, 'website': v.website, 'path': v.path, 'name': v.name, 'desc': v.desc, 'severity': v.severity} for v in vulns]
155 j = [{'request': v.request, 'website': v.website, 'path': v.path, 'name': v.name,
156 'desc': v.desc, 'severity': v.severity, 'resolution': v.resolution} for v in vulns]
141157 return self.ok(j)
142158
143159 def deleteVuln(self):
193209 name = json_data.get('name', None)
194210 desc = json_data.get('desc', None)
195211 severity = json_data.get('severity', None)
212 resolution = json_data.get('resolution', None)
196213 refs = json_data.get('refs', None)
197214
198215 # forward to controller
199216 for vuln in visitor.vulns:
200 self.controller.editVulnSYNC(vuln, name, desc, severity, refs)
217 self.controller.editVulnSYNC(vuln, name, desc, severity, resolution, refs)
201218
202219 return self.ok("output successfully sent to plugin")
203220
238255 def createVuln(self):
239256 return self._create(
240257 self.controller.newVuln,
241 ['name', 'desc', 'ref', 'severity', 'parent_id'])
258 ['name', 'desc', 'ref', 'severity', 'resolution', 'parent_id'])
242259
243260 def createVulnWeb(self):
244261 return self._create(
245262 self.controller.newVulnWeb,
246 ['name', 'desc', 'ref', 'severity', 'website',
263 ['name', 'desc', 'ref', 'severity', 'resolution', 'website',
247264 'path', 'request', 'response', 'method', 'pname',
248265 'params', 'query', 'category', 'parent_id'])
249266
256273 return self._create(
257274 self.controller.newCred,
258275 ['username', 'password', 'parent_id'])
276
277 def statusCheck(self):
278 return self.ok("Faraday API Status: OK")
259279
260280
261281 class PluginControllerAPI(RESTApi):
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
6060 status=status, version=version, description=description,
6161 parent_id=parent_id)
6262
63 def createVuln(self, name, desc, ref, severity, parent_id):
63 def createVuln(self, name, desc, ref, severity, resolution, parent_id):
6464 return self._create(
6565 "vuln", name=name, desc=desc, ref=ref, severity=severity,
66 parent_id=parent_id)
66 resolution=resolution, parent_id=parent_id)
6767
68 def createVulnWeb(self, name, desc, ref, severity, website, path, request,
69 response, method, pname, params, query, category,
68 def createVulnWeb(self, name, desc, ref, severity, resolution, website, path,
69 request, response, method, pname, params, query, category,
7070 parent_id):
7171 return self._create(
7272 "vulnweb", name=name, desc=desc, ref=ref, severity=severity,
73 website=website, path=path, request=request, response=response,
74 method=method, pname=pname, params=params, query=query,
73 resolution=resolution, website=website, path=path, request=request,
74 response=response, method=method, pname=pname, params=params, query=query,
7575 category=category, parent_id=parent_id)
7676
7777 def createNote(self, name, text, parent_id):
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
0 #!/bin/sh
1
2 ###
3 ## Faraday Penetration Test IDE
4 ## Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
5 ## See the file 'doc/LICENSE' for the license information
6 ###
7
8 ####################################
9 # Backup CouchDB script.
10 ####################################
11
12 # Configure daily cron
13 #0 0 * * * bash $faradaypath/backup/backup_couchdb.sh
14
15
16 # What to backup.
17 #backup_files="/etc/couchdb /var/lib/couchdb /var/log/couchdb"
18 backup_files=$1
19
20
21 # Where to backup to.
22 dest="/mnt/backup"
23 dest=$2
24
25 # Create archive filename.
26 day=$(date +%d_%b_%Y)
27 hostname=$(hostname -s)
28 archive_file="couchdb_$hostname-$day.tgz"
29
30 # Print start status message.
31 echo "Backing up $backup_files to $dest/$archive_file"
32 date
33 echo
34
35 # Backup the files using tar.
36 tar czf $dest/$archive_file $backup_files
37
38 # Print end status message.
39 echo
40 echo "Backup finished"
41 date
42
43 # Long listing of files in $dest to check file sizes.
44 ls -lh $dest
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
1616 webs[host.name]=1
1717
1818 for k,v in webs.iteritems():
19 print "hydra -l '' -p 'telecom' -w 10 telnet://"+k+":23"
20
21
22
23
24
25 # 200.61.47.65
26 # 200.45.69.29
27 # 200.61.47.217
28 # 200.61.47.121
29 # 200.45.69.17
30 # 200.61.47.129
31 # 200.61.47.113
32 # 200.61.47.9
33 # 190.221.164.65
34 # 200.61.47.146
35 # 186.153.146.227
36 # 200.61.47.177
37 # 200.61.47.17
38 # 200.61.47.33
39 # 200.45.69.30
40 # 200.61.47.179
41 # 200.61.47.233
42 # 200.61.47.41
43 # 200.61.47.221
44 # 200.61.47.220
19 print k
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
1717
1818 for k,v in webs.iteritems():
1919 print k
20 # print "hydra -l '' -p 'telecom' -w 10 telnet://"+k+":23"
21
22
23
24
25
26 # 200.61.47.65
27 # 200.45.69.29
28 # 200.61.47.217
29 # 200.61.47.121
30 # 200.45.69.17
31 # 200.61.47.129
32 # 200.61.47.113
33 # 200.61.47.9
34 # 190.221.164.65
35 # 200.61.47.146
36 # 186.153.146.227
37 # 200.61.47.177
38 # 200.61.47.17
39 # 200.61.47.33
40 # 200.45.69.30
41 # 200.61.47.179
42 # 200.61.47.233
43 # 200.61.47.41
44 # 200.61.47.221
45 # 200.61.47.220
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
1717 CONST_API_CON_INFO = "api_con_info"
1818 CONST_API_CON_INFO_HOST = "api_con_info_host"
1919 CONST_API_CON_INFO_PORT = "api_con_info_port"
20 CONST_API_RESTFUL_CON_INFO_PORT = "api_restful_con_info_port"
2021 CONST_APPNAME = "appname"
2122 CONST_AUTH = "auth"
2223 CONST_AUTO_SHARE_WORKSPACE = "auto_share_workspace"
118119 if tree:
119120 self._api_con_info_host = self._getValue(tree, CONST_API_CON_INFO_HOST)
120121 self._api_con_info_port = self._getValue(tree, CONST_API_CON_INFO_PORT)
122 self._api_restful_con_info_port = self._getValue(tree, CONST_API_RESTFUL_CON_INFO_PORT)
121123 self._api_con_info = self._getValue(tree, CONST_API_CON_INFO)
122124 self._appname = self._getValue(tree, CONST_APPNAME)
123125 self._auth = self._getValue(tree, CONST_AUTH)
160162 if str(self._api_con_info_host) == "None" or str(self._api_con_info_port) == "None":
161163 return None
162164 return self._api_con_info_host, int(self._api_con_info_port)
165
166 def getApiRestfulConInfo(self):
167 if str(self._api_con_info_host) == "None" or str(self._api_restful_con_info_port) == "None":
168 return None
169 return self._api_con_info_host, int(self._api_restful_con_info_port)
163170
164
165171 def getApiConInfoHost(self):
166172 return self._api_con_info_host
167173
168174 def getApiConInfoPort(self):
169175 return self._api_con_info_port
170176
177 def getApiRestfulConInfoPort(self):
178 return self._api_restful_con_info_port
179
171180 def getAppname(self):
172181 return self._appname
173182
223232 return self._perspective_view
224233
225234 def getCouchURI(self):
226 return self._couch_uri
235 if self._couch_uri and self._couch_uri.endswith('/'):
236 return self._couch_uri[:-1]
237 else:
238 return self._couch_uri
227239
228240 def getCouchReplics(self):
229241 return self._couch_replics
276288 self._api_con_info = val1, val2
277289 self.setApiConInfoHost(val1)
278290 self.setApiConInfoPort(val2)
291
292 def setApiRestfulConInfo(self, val1, val2):
293 self._api_con_info = val1, val2
294 self.setApiConInfoHost(val1)
295 self.setApiRestfulConInfoPort(val2)
279296
280297 def setApiConInfoHost(self, val):
281298 self._api_con_info_host = val
283300 def setApiConInfoPort(self, val):
284301 self._api_con_info_port = str(val)
285302
303 def setApiRestfulConInfoPort(self, val):
304 self._api_restful_con_info_port = str(val)
305
286306 def setAppname(self, val):
287307 self._appname = val
288308
397417 API_CON_INFO_PORT = Element(CONST_API_CON_INFO_PORT)
398418 API_CON_INFO_PORT.text = str(self.getApiConInfoPort())
399419 ROOT.append(API_CON_INFO_PORT)
420
421 API_RESTFUL_CON_INFO_PORT = Element(CONST_API_RESTFUL_CON_INFO_PORT)
422 API_RESTFUL_CON_INFO_PORT.text = str(self.getApiRestfulConInfoPort())
423 ROOT.append(API_RESTFUL_CON_INFO_PORT)
400424
401425 APPNAME = Element(CONST_APPNAME)
402426 APPNAME.text = self.getAppname()
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2014 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
1010 CONST_FARADAY_PLUGINS_REPO_PATH = 'plugins/repo'
1111 CONST_FARADAY_QTRC_PATH = 'deps/qtrc'
1212 CONST_FARADAY_IMAGES = 'images/'
13 CONST_FARADAY_LOGS_PATH = 'logs/'
1314 CONST_FARADAY_FOLDER_LIST = [ "config", "data", "images",
1415 "persistence", "plugins",
15 "report", "temp", "zsh" ]
16 "report", "temp", "zsh", "logs" ]
1617
1718
1819 CONST_USER_QT_PATH = '~/.qt/'
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
0 MIT:
1 - AngularJS - (https://angularjs.org/)
2 - Bootstrap - (http://getbootstrap.com/)
3 - jQuery - (http://jquery.com/)
4 - normalize.css
5 - font awesome code
6 - jQuery Qtip (http://qtip2.com)
7 - jQuery Tablesorter (http://tablesorter.com)
8 - Angular-route
9 - Angular-selection-model (https://github.com/jtrussell/angular-selection-model)
10 - ui-bootstrap-tpls (http://angular-ui.github.io/bootstrap/)
11 - cryptojs-sha1 (https://code.google.com/p/crypto-js/)
12
13 SIL OFL 1.1:
14 - font awesome fonts (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)
15
16 BSD:
17 - views/reports/_attachments/script/cryptojs-sha1.js
18
19 BSD 3-clause:
20 - D3 - (http://d3js.org)
21
22 Public Domain:
23 - json2
24
25 Apache 2.0:
26 - views/reports/_attachments/script/couch.js
27 - jquery couch
28
29 CeCILL-V2:
30 - pyqonsole - (http://www.logilab.fr/)
31
32 GPL-3:
33 - Qt3
34 - Sip
35
36 GPL-2:
37 - dotnessus_v2.py - (http://code.google.com/p/pynessus/)
38
39
618618 copy of the Program in return for a fee.
619619
620620 END OF TERMS AND CONDITIONS
621
622 _________________________________________________________________________________
623
624 This license does not apply to the following components and any component which may not be included in the following file: 'doc/LIBRARY_LICENSE'
625
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
+0
-130
doc/Makefile less more
0 # Makefile for Sphinx documentation
1 #
2
3 # You can set these variables from the command line.
4 SPHINXOPTS =
5 SPHINXBUILD = sphinx-build
6 PAPER =
7 BUILDDIR = build
8
9 # Internal variables.
10 PAPEROPT_a4 = -D latex_paper_size=a4
11 PAPEROPT_letter = -D latex_paper_size=letter
12 ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
13
14 .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
15
16 help:
17 @echo "Please use \`make <target>' where <target> is one of"
18 @echo " html to make standalone HTML files"
19 @echo " dirhtml to make HTML files named index.html in directories"
20 @echo " singlehtml to make a single large HTML file"
21 @echo " pickle to make pickle files"
22 @echo " json to make JSON files"
23 @echo " htmlhelp to make HTML files and a HTML help project"
24 @echo " qthelp to make HTML files and a qthelp project"
25 @echo " devhelp to make HTML files and a Devhelp project"
26 @echo " epub to make an epub"
27 @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
28 @echo " latexpdf to make LaTeX files and run them through pdflatex"
29 @echo " text to make text files"
30 @echo " man to make manual pages"
31 @echo " changes to make an overview of all changed/added/deprecated items"
32 @echo " linkcheck to check all external links for integrity"
33 @echo " doctest to run all doctests embedded in the documentation (if enabled)"
34
35 clean:
36 -rm -rf $(BUILDDIR)/*
37
38 html:
39 $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
40 @echo
41 @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
42
43 dirhtml:
44 $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
45 @echo
46 @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
47
48 singlehtml:
49 $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
50 @echo
51 @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
52
53 pickle:
54 $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
55 @echo
56 @echo "Build finished; now you can process the pickle files."
57
58 json:
59 $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
60 @echo
61 @echo "Build finished; now you can process the JSON files."
62
63 htmlhelp:
64 $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
65 @echo
66 @echo "Build finished; now you can run HTML Help Workshop with the" \
67 ".hhp project file in $(BUILDDIR)/htmlhelp."
68
69 qthelp:
70 $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
71 @echo
72 @echo "Build finished; now you can run "qcollectiongenerator" with the" \
73 ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
74 @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Faraday.qhcp"
75 @echo "To view the help file:"
76 @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Faraday.qhc"
77
78 devhelp:
79 $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
80 @echo
81 @echo "Build finished."
82 @echo "To view the help file:"
83 @echo "# mkdir -p $$HOME/.local/share/devhelp/Faraday"
84 @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Faraday"
85 @echo "# devhelp"
86
87 epub:
88 $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
89 @echo
90 @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
91
92 latex:
93 $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
94 @echo
95 @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
96 @echo "Run \`make' in that directory to run these through (pdf)latex" \
97 "(use \`make latexpdf' here to do that automatically)."
98
99 latexpdf:
100 $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
101 @echo "Running LaTeX files through pdflatex..."
102 make -C $(BUILDDIR)/latex all-pdf
103 @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
104
105 text:
106 $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
107 @echo
108 @echo "Build finished. The text files are in $(BUILDDIR)/text."
109
110 man:
111 $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
112 @echo
113 @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
114
115 changes:
116 $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
117 @echo
118 @echo "The overview file is in $(BUILDDIR)/changes."
119
120 linkcheck:
121 $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
122 @echo
123 @echo "Link check complete; look for any errors in the above output " \
124 "or in $(BUILDDIR)/linkcheck/output.txt."
125
126 doctest:
127 $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
128 @echo "Testing of doctests in the sources finished, look at the " \
129 "results in $(BUILDDIR)/doctest/output.txt."
+0
-155
doc/make.bat less more
0 @ECHO OFF
1
2 REM Command file for Sphinx documentation
3
4 if "%SPHINXBUILD%" == "" (
5 set SPHINXBUILD=sphinx-build
6 )
7 set BUILDDIR=build
8 set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
9 if NOT "%PAPER%" == "" (
10 set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
11 )
12
13 if "%1" == "" goto help
14
15 if "%1" == "help" (
16 :help
17 echo.Please use `make ^<target^>` where ^<target^> is one of
18 echo. html to make standalone HTML files
19 echo. dirhtml to make HTML files named index.html in directories
20 echo. singlehtml to make a single large HTML file
21 echo. pickle to make pickle files
22 echo. json to make JSON files
23 echo. htmlhelp to make HTML files and a HTML help project
24 echo. qthelp to make HTML files and a qthelp project
25 echo. devhelp to make HTML files and a Devhelp project
26 echo. epub to make an epub
27 echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
28 echo. text to make text files
29 echo. man to make manual pages
30 echo. changes to make an overview over all changed/added/deprecated items
31 echo. linkcheck to check all external links for integrity
32 echo. doctest to run all doctests embedded in the documentation if enabled
33 goto end
34 )
35
36 if "%1" == "clean" (
37 for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
38 del /q /s %BUILDDIR%\*
39 goto end
40 )
41
42 if "%1" == "html" (
43 %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
44 echo.
45 echo.Build finished. The HTML pages are in %BUILDDIR%/html.
46 goto end
47 )
48
49 if "%1" == "dirhtml" (
50 %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
51 echo.
52 echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
53 goto end
54 )
55
56 if "%1" == "singlehtml" (
57 %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
58 echo.
59 echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
60 goto end
61 )
62
63 if "%1" == "pickle" (
64 %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
65 echo.
66 echo.Build finished; now you can process the pickle files.
67 goto end
68 )
69
70 if "%1" == "json" (
71 %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
72 echo.
73 echo.Build finished; now you can process the JSON files.
74 goto end
75 )
76
77 if "%1" == "htmlhelp" (
78 %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
79 echo.
80 echo.Build finished; now you can run HTML Help Workshop with the ^
81 .hhp project file in %BUILDDIR%/htmlhelp.
82 goto end
83 )
84
85 if "%1" == "qthelp" (
86 %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
87 echo.
88 echo.Build finished; now you can run "qcollectiongenerator" with the ^
89 .qhcp project file in %BUILDDIR%/qthelp, like this:
90 echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Faraday.qhcp
91 echo.To view the help file:
92 echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Faraday.ghc
93 goto end
94 )
95
96 if "%1" == "devhelp" (
97 %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
98 echo.
99 echo.Build finished.
100 goto end
101 )
102
103 if "%1" == "epub" (
104 %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
105 echo.
106 echo.Build finished. The epub file is in %BUILDDIR%/epub.
107 goto end
108 )
109
110 if "%1" == "latex" (
111 %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
112 echo.
113 echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
114 goto end
115 )
116
117 if "%1" == "text" (
118 %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
119 echo.
120 echo.Build finished. The text files are in %BUILDDIR%/text.
121 goto end
122 )
123
124 if "%1" == "man" (
125 %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
126 echo.
127 echo.Build finished. The manual pages are in %BUILDDIR%/man.
128 goto end
129 )
130
131 if "%1" == "changes" (
132 %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
133 echo.
134 echo.The overview file is in %BUILDDIR%/changes.
135 goto end
136 )
137
138 if "%1" == "linkcheck" (
139 %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
140 echo.
141 echo.Link check complete; look for any errors in the above output ^
142 or in %BUILDDIR%/linkcheck/output.txt.
143 goto end
144 )
145
146 if "%1" == "doctest" (
147 %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
148 echo.
149 echo.Testing of doctests in the sources finished, look at the ^
150 results in %BUILDDIR%/doctest/output.txt.
151 goto end
152 )
153
154 :end
00 #!/usr/bin/python
11
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
+0
-280
external/docs/PyQt-x11-gpl-3.18.1/LICENSE less more
0 GNU GENERAL PUBLIC LICENSE
1 Version 2, June 1991
2
3 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
4 675 Mass Ave, Cambridge, MA 02139, USA
5 Everyone is permitted to copy and distribute verbatim copies
6 of this license document, but changing it is not allowed.
7
8 Preamble
9
10 The licenses for most software are designed to take away your
11 freedom to share and change it. By contrast, the GNU General Public
12 License is intended to guarantee your freedom to share and change free
13 software--to make sure the software is free for all its users. This
14 General Public License applies to most of the Free Software
15 Foundation's software and to any other program whose authors commit to
16 using it. (Some other Free Software Foundation software is covered by
17 the GNU Library General Public License instead.) You can apply it to
18 your programs, too.
19
20 When we speak of free software, we are referring to freedom, not
21 price. Our General Public Licenses are designed to make sure that you
22 have the freedom to distribute copies of free software (and charge for
23 this service if you wish), that you receive source code or can get it
24 if you want it, that you can change the software or use pieces of it
25 in new free programs; and that you know you can do these things.
26
27 To protect your rights, we need to make restrictions that forbid
28 anyone to deny you these rights or to ask you to surrender the rights.
29 These restrictions translate to certain responsibilities for you if you
30 distribute copies of the software, or if you modify it.
31
32 For example, if you distribute copies of such a program, whether
33 gratis or for a fee, you must give the recipients all the rights that
34 you have. You must make sure that they, too, receive or can get the
35 source code. And you must show them these terms so they know their
36 rights.
37
38 We protect your rights with two steps: (1) copyright the software, and
39 (2) offer you this license which gives you legal permission to copy,
40 distribute and/or modify the software.
41
42 Also, for each author's protection and ours, we want to make certain
43 that everyone understands that there is no warranty for this free
44 software. If the software is modified by someone else and passed on, we
45 want its recipients to know that what they have is not the original, so
46 that any problems introduced by others will not reflect on the original
47 authors' reputations.
48
49 Finally, any free program is threatened constantly by software
50 patents. We wish to avoid the danger that redistributors of a free
51 program will individually obtain patent licenses, in effect making the
52 program proprietary. To prevent this, we have made it clear that any
53 patent must be licensed for everyone's free use or not licensed at all.
54
55 The precise terms and conditions for copying, distribution and
56 modification follow.
57
58 GNU GENERAL PUBLIC LICENSE
59 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
60
61 0. This License applies to any program or other work which contains
62 a notice placed by the copyright holder saying it may be distributed
63 under the terms of this General Public License. The "Program", below,
64 refers to any such program or work, and a "work based on the Program"
65 means either the Program or any derivative work under copyright law:
66 that is to say, a work containing the Program or a portion of it,
67 either verbatim or with modifications and/or translated into another
68 language. (Hereinafter, translation is included without limitation in
69 the term "modification".) Each licensee is addressed as "you".
70
71 Activities other than copying, distribution and modification are not
72 covered by this License; they are outside its scope. The act of
73 running the Program is not restricted, and the output from the Program
74 is covered only if its contents constitute a work based on the
75 Program (independent of having been made by running the Program).
76 Whether that is true depends on what the Program does.
77
78 1. You may copy and distribute verbatim copies of the Program's
79 source code as you receive it, in any medium, provided that you
80 conspicuously and appropriately publish on each copy an appropriate
81 copyright notice and disclaimer of warranty; keep intact all the
82 notices that refer to this License and to the absence of any warranty;
83 and give any other recipients of the Program a copy of this License
84 along with the Program.
85
86 You may charge a fee for the physical act of transferring a copy, and
87 you may at your option offer warranty protection in exchange for a fee.
88
89 2. You may modify your copy or copies of the Program or any portion
90 of it, thus forming a work based on the Program, and copy and
91 distribute such modifications or work under the terms of Section 1
92 above, provided that you also meet all of these conditions:
93
94 a) You must cause the modified files to carry prominent notices
95 stating that you changed the files and the date of any change.
96
97 b) You must cause any work that you distribute or publish, that in
98 whole or in part contains or is derived from the Program or any
99 part thereof, to be licensed as a whole at no charge to all third
100 parties under the terms of this License.
101
102 c) If the modified program normally reads commands interactively
103 when run, you must cause it, when started running for such
104 interactive use in the most ordinary way, to print or display an
105 announcement including an appropriate copyright notice and a
106 notice that there is no warranty (or else, saying that you provide
107 a warranty) and that users may redistribute the program under
108 these conditions, and telling the user how to view a copy of this
109 License. (Exception: if the Program itself is interactive but
110 does not normally print such an announcement, your work based on
111 the Program is not required to print an announcement.)
112
113 These requirements apply to the modified work as a whole. If
114 identifiable sections of that work are not derived from the Program,
115 and can be reasonably considered independent and separate works in
116 themselves, then this License, and its terms, do not apply to those
117 sections when you distribute them as separate works. But when you
118 distribute the same sections as part of a whole which is a work based
119 on the Program, the distribution of the whole must be on the terms of
120 this License, whose permissions for other licensees extend to the
121 entire whole, and thus to each and every part regardless of who wrote it.
122
123 Thus, it is not the intent of this section to claim rights or contest
124 your rights to work written entirely by you; rather, the intent is to
125 exercise the right to control the distribution of derivative or
126 collective works based on the Program.
127
128 In addition, mere aggregation of another work not based on the Program
129 with the Program (or with a work based on the Program) on a volume of
130 a storage or distribution medium does not bring the other work under
131 the scope of this License.
132
133 3. You may copy and distribute the Program (or a work based on it,
134 under Section 2) in object code or executable form under the terms of
135 Sections 1 and 2 above provided that you also do one of the following:
136
137 a) Accompany it with the complete corresponding machine-readable
138 source code, which must be distributed under the terms of Sections
139 1 and 2 above on a medium customarily used for software interchange; or,
140
141 b) Accompany it with a written offer, valid for at least three
142 years, to give any third party, for a charge no more than your
143 cost of physically performing source distribution, a complete
144 machine-readable copy of the corresponding source code, to be
145 distributed under the terms of Sections 1 and 2 above on a medium
146 customarily used for software interchange; or,
147
148 c) Accompany it with the information you received as to the offer
149 to distribute corresponding source code. (This alternative is
150 allowed only for noncommercial distribution and only if you
151 received the program in object code or executable form with such
152 an offer, in accord with Subsection b above.)
153
154 The source code for a work means the preferred form of the work for
155 making modifications to it. For an executable work, complete source
156 code means all the source code for all modules it contains, plus any
157 associated interface definition files, plus the scripts used to
158 control compilation and installation of the executable. However, as a
159 special exception, the source code distributed need not include
160 anything that is normally distributed (in either source or binary
161 form) with the major components (compiler, kernel, and so on) of the
162 operating system on which the executable runs, unless that component
163 itself accompanies the executable.
164
165 If distribution of executable or object code is made by offering
166 access to copy from a designated place, then offering equivalent
167 access to copy the source code from the same place counts as
168 distribution of the source code, even though third parties are not
169 compelled to copy the source along with the object code.
170
171 4. You may not copy, modify, sublicense, or distribute the Program
172 except as expressly provided under this License. Any attempt
173 otherwise to copy, modify, sublicense or distribute the Program is
174 void, and will automatically terminate your rights under this License.
175 However, parties who have received copies, or rights, from you under
176 this License will not have their licenses terminated so long as such
177 parties remain in full compliance.
178
179 5. You are not required to accept this License, since you have not
180 signed it. However, nothing else grants you permission to modify or
181 distribute the Program or its derivative works. These actions are
182 prohibited by law if you do not accept this License. Therefore, by
183 modifying or distributing the Program (or any work based on the
184 Program), you indicate your acceptance of this License to do so, and
185 all its terms and conditions for copying, distributing or modifying
186 the Program or works based on it.
187
188 6. Each time you redistribute the Program (or any work based on the
189 Program), the recipient automatically receives a license from the
190 original licensor to copy, distribute or modify the Program subject to
191 these terms and conditions. You may not impose any further
192 restrictions on the recipients' exercise of the rights granted herein.
193 You are not responsible for enforcing compliance by third parties to
194 this License.
195
196 7. If, as a consequence of a court judgment or allegation of patent
197 infringement or for any other reason (not limited to patent issues),
198 conditions are imposed on you (whether by court order, agreement or
199 otherwise) that contradict the conditions of this License, they do not
200 excuse you from the conditions of this License. If you cannot
201 distribute so as to satisfy simultaneously your obligations under this
202 License and any other pertinent obligations, then as a consequence you
203 may not distribute the Program at all. For example, if a patent
204 license would not permit royalty-free redistribution of the Program by
205 all those who receive copies directly or indirectly through you, then
206 the only way you could satisfy both it and this License would be to
207 refrain entirely from distribution of the Program.
208
209 If any portion of this section is held invalid or unenforceable under
210 any particular circumstance, the balance of the section is intended to
211 apply and the section as a whole is intended to apply in other
212 circumstances.
213
214 It is not the purpose of this section to induce you to infringe any
215 patents or other property right claims or to contest validity of any
216 such claims; this section has the sole purpose of protecting the
217 integrity of the free software distribution system, which is
218 implemented by public license practices. Many people have made
219 generous contributions to the wide range of software distributed
220 through that system in reliance on consistent application of that
221 system; it is up to the author/donor to decide if he or she is willing
222 to distribute software through any other system and a licensee cannot
223 impose that choice.
224
225 This section is intended to make thoroughly clear what is believed to
226 be a consequence of the rest of this License.
227
228 8. If the distribution and/or use of the Program is restricted in
229 certain countries either by patents or by copyrighted interfaces, the
230 original copyright holder who places the Program under this License
231 may add an explicit geographical distribution limitation excluding
232 those countries, so that distribution is permitted only in or among
233 countries not thus excluded. In such case, this License incorporates
234 the limitation as if written in the body of this License.
235
236 9. The Free Software Foundation may publish revised and/or new versions
237 of the General Public License from time to time. Such new versions will
238 be similar in spirit to the present version, but may differ in detail to
239 address new problems or concerns.
240
241 Each version is given a distinguishing version number. If the Program
242 specifies a version number of this License which applies to it and "any
243 later version", you have the option of following the terms and conditions
244 either of that version or of any later version published by the Free
245 Software Foundation. If the Program does not specify a version number of
246 this License, you may choose any version ever published by the Free Software
247 Foundation.
248
249 10. If you wish to incorporate parts of the Program into other free
250 programs whose distribution conditions are different, write to the author
251 to ask for permission. For software which is copyrighted by the Free
252 Software Foundation, write to the Free Software Foundation; we sometimes
253 make exceptions for this. Our decision will be guided by the two goals
254 of preserving the free status of all derivatives of our free software and
255 of promoting the sharing and reuse of software generally.
256
257 NO WARRANTY
258
259 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
260 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
261 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
262 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
263 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
264 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
265 TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
266 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
267 REPAIR OR CORRECTION.
268
269 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
270 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
271 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
272 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
273 OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
274 TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
275 YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
276 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
277 POSSIBILITY OF SUCH DAMAGES.
278
279 END OF TERMS AND CONDITIONS
+0
-64
external/docs/PyQt-x11-gpl-3.18.1/README less more
0 PyQt - Python Bindings for the Qt Toolkit
1
2
3 INTRODUCTION
4
5 These are the Python bindings for Qt. You must also have the SIP Python
6 bindings generator installed.
7
8 The homepage is http://www.riverbankcomputing.co.uk/pyqt/.
9
10 The homepage of SIP is http://www.riverbankcomputing.co.uk/sip/.
11
12
13 COMMERCIAL VERSION
14
15 If you have the Commercial version of PyQt then you should also have a
16 license file that you downloaded separately. The license file must be copied
17 to the "sip" directory before starting to build PyQt.
18
19
20 INSTALLATION
21
22 Check for any other README files in this directory that relate to your
23 particular platform. Feel free to contribute a README for your platform or to
24 provide updates to any existing documentation.
25
26 The first step is to configure PyQt by running the following command.
27
28 python configure.py
29
30 This assumes that the correct Python interpreter is on your path. Something
31 like the following may be appropriate on Windows.
32
33 c:\python23\python configure.py
34
35 If you have multiple versions of Python installed then make sure you use the
36 interpreter for which you wish to generate bindings for.
37
38 The configure.py script takes many options. Use the "-h" command line option
39 to display a full list of the available options.
40
41 The next step is to build PyQt using your platform's make command.
42
43 make
44
45 The final step is to install PyQt by running the following command. (Depending
46 on your system you may require root or administrator privileges.)
47
48 make install
49
50
51 THE REST OF THE DISTRIBUTION
52
53 The "examples2" and "examples3" directories contain some examples (for Qt v2.x
54 and Qt v3.x respectively) of Python scripts, including versions of the standard
55 Qt tutorials and examples.
56
57 The "doc" directory contains SGML and HTML documentation for the bindings.
58 This documentation includes a section describing the differences visible to
59 the Python programmer between this and the previous version - please read it.
60
61
62 Phil Thompson
63 [email protected]
+0
-68
external/docs/PyQt-x11-gpl-3.18.1/README.AIX less more
0 This file describes some things to be aware of when building SIP (and PyQt)
1 under AIX.
2
3 I had success building SIP V3/V4 (and PyQt) on AIX 4.3.3 and on AIX 5.1 with
4 VisualAge C++ and with gcc.
5
6 VisualAge C++ was version 6.0 but it should also work with version 5.x.
7 The GNU compiler was version 3.3.2 downloaded as a binary from
8 http://aixpdslib.seas.ucla.edu/aixpdslib.html
9
10 The Qt-Version was 3.2.3 but it should also work with previous versions.
11
12 If you are using Python version 2.3.3 or higher, SIP (and PyQt) should build
13 out of the box without any changes.
14
15 If you are using a Python version before 2.3.3, you have to patch Python,
16 because until this version, Python uses the system calls load() and
17 loadbind() to load and bind shared objects. These system calls cannot load
18 and bind C++ shared objects properly (constructors and destructors for static
19 classes are not called with these system calls). Since AIX version 4.2 the
20 system calls dlopen() and dlsym() are available and should be used in
21 preference.
22
23 The following patch changes the configure script of Python to use dlopen()
24 and dlsym() if they are available. It also fixes a bug with the definition of
25 _XOPEN_SOURCE:
26
27 ---8<-------------------------------------------------------------------->8---
28 diff -uNr Python-2.3.2.orig/configure Python-2.3.2/configure
29 --- Python-2.3.2.orig/configure 2003-09-27 10:58:55.000000000 +0200
30 +++ Python-2.3.2/configure 2003-10-28 11:33:58.000000000 +0100
31 @@ -1452,6 +1452,11 @@
32 # but used in struct sockaddr.sa_family. Reported by Tim Rice.
33 SCO_SV/3.2)
34 define_xopen_source=no;;
35 + # On AIX 4, mbstate_t is defined only when _XOPEN_SOURCE == 500 but used in
36 + # wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined or
37 + # has another value. By not (re)defining it, the defaults come in place.
38 + AIX/4)
39 + define_xopen_source=no;;
40 esac
41
42 if test $define_xopen_source = yes
43 @@ -12965,7 +12970,12 @@
44 if test -z "$DYNLOADFILE"
45 then
46 case $ac_sys_system/$ac_sys_release in
47 - AIX*) DYNLOADFILE="dynload_aix.o";;
48 + AIX*) # Use dynload_shlib.c and dlopen() if we have it.
49 + if test "$ac_cv_func_dlopen" = yes
50 + then DYNLOADFILE="dynload_shlib.o"
51 + else DYNLOADFILE="dynload_aix.o"
52 + fi
53 + ;;
54 BeOS*) DYNLOADFILE="dynload_beos.o";;
55 hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
56 Darwin/*) DYNLOADFILE="dynload_next.o";;
57 ---8<-------------------------------------------------------------------->8---
58
59 Note: I did not mix the compilers when building Qt, Python, SIP and PyQt. At
60 least Qt, SIP and PyQt must be built with the same compiler because of
61 different name mangling schemes.
62
63 If you have any problems or questions on building SIP or PyQt on AIX, either
64 send an email to [email protected] or use the PyKDE mailing list.
65
66 Ulrich Berning
67 DESYS GmbH
+0
-44
external/docs/PyQt-x11-gpl-3.18.1/README.SunOS less more
0
1 o Compiler Error: CC -DHAVE_CONFIG_H -I. -I. -I..
2 -I/users/toollib/include/python2.0 -I/users/pyqt/install/sip-3.2.1/include
3 -I/users/pyqt/install/qt-x11-commercial-3.0.4/include -I/usr/openwin/include
4 -c qtcmodule.cpp -KPIC -DPIC -o qtcmodule.o
5 "sipqtProxyqt.h", line 113: Error: Multiple declaration for
6 sipProxyqt::proxySlot(int).
7 "qtcmodule.cpp", line 5393: Error: sipProxyqt::proxySlot(int) already had a
8 body defined.
9
10 This occurs because the Sun Workshop C++ 4.2 compiler (and the Sun Forte
11 C++ 6.x compiler with -compat) can not distinguish between 'bool' and 'int'
12 types in overloaded method signatures and issues a compiler error.
13 In this case bool is declared in qt/include/qglobal.h as
14 'typedef int bool;'. To workaround this '#if 0' out the the declaration
15 and body of 'proxySlot(bool)' in PyQt/qt/sipqtProxyqt.h and
16 PyQt/qt/qtcmodule.cpp. This resolves the compiler error but breaks
17 any 'sig(bool)' type signals. To workaround this, save the
18 PyQt/qt/sipqtProxyqt.moc generated after fixing the compiler error and
19 add the following bits of code:
20
21 ...
22 static const QUParameter param_slot_42[] = {
23 { 0, &static_QUType_bool, 0, QUParameter::In }
24 };
25 static const QUMethod slot_42 = {"proxySlot", 1, param_slot_42 };
26 static const QMetaData slot_tbl[] = {
27 ...
28 { "proxySlot(bool)", &slot_42, QMetaData::Public }
29 };
30 metaObj = QMetaObject::new_metaobject(
31 "sipProxyqt", parentObject,
32 slot_tbl, 43,
33 ...
34 case 42: proxySlot(static_QUType_bool.get(_o+1)); break;
35
36 You will need to comment out the line in PyQt/qt/Makefile that re-generates
37 PyQt/qt/sipqtProxyqt.moc with moc to avoid the above changes from being
38 overwritten.
39
40 In order to test that everything has been done correctly, create a
41 toggle button and connect it's 'toggled(bool)' signal to a python slot,
42 if it works, your done!
43
+0
-6
external/docs/README less more
0 Faraday Embeeded Licenses
1 ===========================
2
3 In this directory you will find the Licenses of the libraries used in this project.
4
5
+0
-133
external/docs/qt-x11-free-3.3.8b/INSTALL less more
0 INSTALLING Qt/X11 Version 3.3.8
1
2
3 You may need to be logged in as root, depending on the permissions of
4 the directories where you choose to install Qt.
5
6
7 1. Unpack the archive if you have not done so already:
8
9 cd /usr/local
10 gunzip qt-x11-free-3.3.8.tar.gz # uncompress the archive
11 tar xvf qt-x11-free-3.3.8.tar # unpack it
12
13 This creates the directory /usr/local/qt-x11-free-3.3.8 containing the
14 files from the main archive.
15
16 Rename qt-x11-free-3.3.8 to qt (or make a symlink):
17
18 mv qt-x11-free-3.3.8 qt
19
20 The rest of this file assumes that Qt is installed in /usr/local/qt.
21
22
23 2. Set some environment variables in the file .profile (or .login,
24 depending on your shell) in your home directory. Create the
25 file if it is not there already.
26
27 QTDIR - the directory in which you're building Qt
28 PATH - to locate the moc program and other Qt tools
29 MANPATH - to access the Qt man pages
30 LD_LIBRARY_PATH - for the shared Qt library
31
32 Note that under IRIX the additional LD_LIBRARYN32_PATH and
33 LD_LIBRARY64_PATH variables are used for specifying library
34 search paths. Set the variable that matches your configuration, or
35 see the rld(5) man page for more information.
36 On AIX set LIBPATH and on HP-UX set SHLIB_PATH instead of LD_LIBRARY_PATH.
37
38 This is done like this:
39
40 In .profile (if your shell is bash, ksh, zsh or sh), add the
41 following lines:
42
43 QTDIR=/usr/local/qt
44 PATH=$QTDIR/bin:$PATH
45 MANPATH=$QTDIR/doc/man:$MANPATH
46 LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
47
48 export QTDIR PATH MANPATH LD_LIBRARY_PATH
49
50 In .login (in case your shell is csh or tcsh), add the following lines:
51
52 setenv QTDIR /usr/local/qt
53 setenv PATH $QTDIR/bin:$PATH
54 setenv MANPATH $QTDIR/doc/man:$MANPATH
55 setenv LD_LIBRARY_PATH $QTDIR/lib:$LD_LIBRARY_PATH
56
57 After you have done this, you will need to login again, or
58 re-source the profile before continuing, so that at least $QTDIR
59 and $PATH are set. Without these the installation will halt with an error
60 message.
61
62 Note that the SGI MIPSpro o32 and Sun WorkShop 5.0 targets are no
63 longer supported as of Qt 3.3.
64
65 3. Install your license file as $HOME/.qt-license.
66 For the free edition and evaluation version, you do not need a license
67 file.
68
69
70 4. Building.
71
72 This step compiles the Qt library, and builds the example programs,
73 the tutorial, and the tools (e.g. Qt Designer).
74
75 Type:
76
77 ./configure
78
79 This will configure the Qt library for your machine. Note that
80 GIF support is turned off by default. Run ./configure -help
81 to get a list of configuration options. Read PLATFORMS for a
82 list of supported platforms.
83
84 To create the library and compile all the examples and the
85 tutorial, type:
86
87 make
88
89 If your platform or compiler is not supported, please contact us at
90 [email protected] so that we can assist you. If it is supported
91 but you have problems, see http://www.trolltech.com/platforms/ for
92 information on known issues.
93
94
95 At this point you have binaries created in $QTDIR (eg. $QTDIR/lib/
96 contains libqt.so). If, however, you would like to have your Qt
97 installed in a non-local installation you can run configure with
98 options splitting Qt into different areas for example:
99
100 ./configure -libdir /usr/local/lib -bindir /usr/local/bin -headerdir /usr/local/include/qt
101
102 If you supplied a custom install directory using the -prefix
103 parameter in step 2, you can:
104
105 make install
106
107 This will install Qt onto your machine using the paths you've set.
108 (See ./configure -help for more information). If you choose to
109 install Qt like this, remember that you must set your
110 LD_LIBRARY_PATH to match your -libdir and your QTDIR to your
111 -headerdir (as described in (2) above).
112
113
114 5. In very few cases you may need to run /sbin/ldconfig or something
115 similar at this point if you are using shared libraries.
116
117 If you have problems running the example programs, e.g. messages like
118
119 can't load library 'libqt.so.3'
120
121 you probably need to put a reference to the qt library in a
122 configuration file and run /sbin/ldconfig as root on your system.
123 And don't forget to set LD_LIBRARY_PATH as explained in (2) above.
124
125
126 6. The online HTML documentation is installed in /usr/local/qt/doc/html/
127 The main page is /usr/local/qt/doc/html/index.html
128 The man pages are installed in /usr/local/qt/doc/man/
129
130
131
132 That's all. Qt is now installed.
+0
-351
external/docs/qt-x11-free-3.3.8b/LICENSE.GPL2 less more
0
1 The Qt GUI Toolkit is Copyright (C) 1994-2008 Trolltech ASA.
2
3 You may use, distribute and copy the Qt GUI Toolkit under the terms of
4 GNU General Public License version 2, which is displayed below.
5
6 -------------------------------------------------------------------------
7
8 GNU GENERAL PUBLIC LICENSE
9 Version 2, June 1991
10
11 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
12 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA
13 Everyone is permitted to copy and distribute verbatim copies
14 of this license document, but changing it is not allowed.
15
16 Preamble
17
18 The licenses for most software are designed to take away your
19 freedom to share and change it. By contrast, the GNU General Public
20 License is intended to guarantee your freedom to share and change free
21 software--to make sure the software is free for all its users. This
22 General Public License applies to most of the Free Software
23 Foundation's software and to any other program whose authors commit to
24 using it. (Some other Free Software Foundation software is covered by
25 the GNU Library General Public License instead.) You can apply it to
26 your programs, too.
27
28 When we speak of free software, we are referring to freedom, not
29 price. Our General Public Licenses are designed to make sure that you
30 have the freedom to distribute copies of free software (and charge for
31 this service if you wish), that you receive source code or can get it
32 if you want it, that you can change the software or use pieces of it
33 in new free programs; and that you know you can do these things.
34
35 To protect your rights, we need to make restrictions that forbid
36 anyone to deny you these rights or to ask you to surrender the rights.
37 These restrictions translate to certain responsibilities for you if you
38 distribute copies of the software, or if you modify it.
39
40 For example, if you distribute copies of such a program, whether
41 gratis or for a fee, you must give the recipients all the rights that
42 you have. You must make sure that they, too, receive or can get the
43 source code. And you must show them these terms so they know their
44 rights.
45
46 We protect your rights with two steps: (1) copyright the software, and
47 (2) offer you this license which gives you legal permission to copy,
48 distribute and/or modify the software.
49
50 Also, for each author's protection and ours, we want to make certain
51 that everyone understands that there is no warranty for this free
52 software. If the software is modified by someone else and passed on, we
53 want its recipients to know that what they have is not the original, so
54 that any problems introduced by others will not reflect on the original
55 authors' reputations.
56
57 Finally, any free program is threatened constantly by software
58 patents. We wish to avoid the danger that redistributors of a free
59 program will individually obtain patent licenses, in effect making the
60 program proprietary. To prevent this, we have made it clear that any
61 patent must be licensed for everyone's free use or not licensed at all.
62
63 The precise terms and conditions for copying, distribution and
64 modification follow.
65
66 GNU GENERAL PUBLIC LICENSE
67 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
68
69 0. This License applies to any program or other work which contains
70 a notice placed by the copyright holder saying it may be distributed
71 under the terms of this General Public License. The "Program", below,
72 refers to any such program or work, and a "work based on the Program"
73 means either the Program or any derivative work under copyright law:
74 that is to say, a work containing the Program or a portion of it,
75 either verbatim or with modifications and/or translated into another
76 language. (Hereinafter, translation is included without limitation in
77 the term "modification".) Each licensee is addressed as "you".
78
79 Activities other than copying, distribution and modification are not
80 covered by this License; they are outside its scope. The act of
81 running the Program is not restricted, and the output from the Program
82 is covered only if its contents constitute a work based on the
83 Program (independent of having been made by running the Program).
84 Whether that is true depends on what the Program does.
85
86 1. You may copy and distribute verbatim copies of the Program's
87 source code as you receive it, in any medium, provided that you
88 conspicuously and appropriately publish on each copy an appropriate
89 copyright notice and disclaimer of warranty; keep intact all the
90 notices that refer to this License and to the absence of any warranty;
91 and give any other recipients of the Program a copy of this License
92 along with the Program.
93
94 You may charge a fee for the physical act of transferring a copy, and
95 you may at your option offer warranty protection in exchange for a fee.
96
97 2. You may modify your copy or copies of the Program or any portion
98 of it, thus forming a work based on the Program, and copy and
99 distribute such modifications or work under the terms of Section 1
100 above, provided that you also meet all of these conditions:
101
102 a) You must cause the modified files to carry prominent notices
103 stating that you changed the files and the date of any change.
104
105 b) You must cause any work that you distribute or publish, that in
106 whole or in part contains or is derived from the Program or any
107 part thereof, to be licensed as a whole at no charge to all third
108 parties under the terms of this License.
109
110 c) If the modified program normally reads commands interactively
111 when run, you must cause it, when started running for such
112 interactive use in the most ordinary way, to print or display an
113 announcement including an appropriate copyright notice and a
114 notice that there is no warranty (or else, saying that you provide
115 a warranty) and that users may redistribute the program under
116 these conditions, and telling the user how to view a copy of this
117 License. (Exception: if the Program itself is interactive but
118 does not normally print such an announcement, your work based on
119 the Program is not required to print an announcement.)
120
121 These requirements apply to the modified work as a whole. If
122 identifiable sections of that work are not derived from the Program,
123 and can be reasonably considered independent and separate works in
124 themselves, then this License, and its terms, do not apply to those
125 sections when you distribute them as separate works. But when you
126 distribute the same sections as part of a whole which is a work based
127 on the Program, the distribution of the whole must be on the terms of
128 this License, whose permissions for other licensees extend to the
129 entire whole, and thus to each and every part regardless of who wrote it.
130
131 Thus, it is not the intent of this section to claim rights or contest
132 your rights to work written entirely by you; rather, the intent is to
133 exercise the right to control the distribution of derivative or
134 collective works based on the Program.
135
136 In addition, mere aggregation of another work not based on the Program
137 with the Program (or with a work based on the Program) on a volume of
138 a storage or distribution medium does not bring the other work under
139 the scope of this License.
140
141 3. You may copy and distribute the Program (or a work based on it,
142 under Section 2) in object code or executable form under the terms of
143 Sections 1 and 2 above provided that you also do one of the following:
144
145 a) Accompany it with the complete corresponding machine-readable
146 source code, which must be distributed under the terms of Sections
147 1 and 2 above on a medium customarily used for software interchange; or,
148
149 b) Accompany it with a written offer, valid for at least three
150 years, to give any third party, for a charge no more than your
151 cost of physically performing source distribution, a complete
152 machine-readable copy of the corresponding source code, to be
153 distributed under the terms of Sections 1 and 2 above on a medium
154 customarily used for software interchange; or,
155
156 c) Accompany it with the information you received as to the offer
157 to distribute corresponding source code. (This alternative is
158 allowed only for noncommercial distribution and only if you
159 received the program in object code or executable form with such
160 an offer, in accord with Subsection b above.)
161
162 The source code for a work means the preferred form of the work for
163 making modifications to it. For an executable work, complete source
164 code means all the source code for all modules it contains, plus any
165 associated interface definition files, plus the scripts used to
166 control compilation and installation of the executable. However, as a
167 special exception, the source code distributed need not include
168 anything that is normally distributed (in either source or binary
169 form) with the major components (compiler, kernel, and so on) of the
170 operating system on which the executable runs, unless that component
171 itself accompanies the executable.
172
173 If distribution of executable or object code is made by offering
174 access to copy from a designated place, then offering equivalent
175 access to copy the source code from the same place counts as
176 distribution of the source code, even though third parties are not
177 compelled to copy the source along with the object code.
178
179 4. You may not copy, modify, sublicense, or distribute the Program
180 except as expressly provided under this License. Any attempt
181 otherwise to copy, modify, sublicense or distribute the Program is
182 void, and will automatically terminate your rights under this License.
183 However, parties who have received copies, or rights, from you under
184 this License will not have their licenses terminated so long as such
185 parties remain in full compliance.
186
187 5. You are not required to accept this License, since you have not
188 signed it. However, nothing else grants you permission to modify or
189 distribute the Program or its derivative works. These actions are
190 prohibited by law if you do not accept this License. Therefore, by
191 modifying or distributing the Program (or any work based on the
192 Program), you indicate your acceptance of this License to do so, and
193 all its terms and conditions for copying, distributing or modifying
194 the Program or works based on it.
195
196 6. Each time you redistribute the Program (or any work based on the
197 Program), the recipient automatically receives a license from the
198 original licensor to copy, distribute or modify the Program subject to
199 these terms and conditions. You may not impose any further
200 restrictions on the recipients' exercise of the rights granted herein.
201 You are not responsible for enforcing compliance by third parties to
202 this License.
203
204 7. If, as a consequence of a court judgment or allegation of patent
205 infringement or for any other reason (not limited to patent issues),
206 conditions are imposed on you (whether by court order, agreement or
207 otherwise) that contradict the conditions of this License, they do not
208 excuse you from the conditions of this License. If you cannot
209 distribute so as to satisfy simultaneously your obligations under this
210 License and any other pertinent obligations, then as a consequence you
211 may not distribute the Program at all. For example, if a patent
212 license would not permit royalty-free redistribution of the Program by
213 all those who receive copies directly or indirectly through you, then
214 the only way you could satisfy both it and this License would be to
215 refrain entirely from distribution of the Program.
216
217 If any portion of this section is held invalid or unenforceable under
218 any particular circumstance, the balance of the section is intended to
219 apply and the section as a whole is intended to apply in other
220 circumstances.
221
222 It is not the purpose of this section to induce you to infringe any
223 patents or other property right claims or to contest validity of any
224 such claims; this section has the sole purpose of protecting the
225 integrity of the free software distribution system, which is
226 implemented by public license practices. Many people have made
227 generous contributions to the wide range of software distributed
228 through that system in reliance on consistent application of that
229 system; it is up to the author/donor to decide if he or she is willing
230 to distribute software through any other system and a licensee cannot
231 impose that choice.
232
233 This section is intended to make thoroughly clear what is believed to
234 be a consequence of the rest of this License.
235
236 8. If the distribution and/or use of the Program is restricted in
237 certain countries either by patents or by copyrighted interfaces, the
238 original copyright holder who places the Program under this License
239 may add an explicit geographical distribution limitation excluding
240 those countries, so that distribution is permitted only in or among
241 countries not thus excluded. In such case, this License incorporates
242 the limitation as if written in the body of this License.
243
244 9. The Free Software Foundation may publish revised and/or new versions
245 of the General Public License from time to time. Such new versions will
246 be similar in spirit to the present version, but may differ in detail to
247 address new problems or concerns.
248
249 Each version is given a distinguishing version number. If the Program
250 specifies a version number of this License which applies to it and "any
251 later version", you have the option of following the terms and conditions
252 either of that version or of any later version published by the Free
253 Software Foundation. If the Program does not specify a version number of
254 this License, you may choose any version ever published by the Free Software
255 Foundation.
256
257 10. If you wish to incorporate parts of the Program into other free
258 programs whose distribution conditions are different, write to the author
259 to ask for permission. For software which is copyrighted by the Free
260 Software Foundation, write to the Free Software Foundation; we sometimes
261 make exceptions for this. Our decision will be guided by the two goals
262 of preserving the free status of all derivatives of our free software and
263 of promoting the sharing and reuse of software generally.
264
265 NO WARRANTY
266
267 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
268 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
269 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
270 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
271 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
272 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
273 TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
274 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
275 REPAIR OR CORRECTION.
276
277 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
278 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
279 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
280 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
281 OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
282 TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
283 YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
284 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
285 POSSIBILITY OF SUCH DAMAGES.
286
287 END OF TERMS AND CONDITIONS
288
289 How to Apply These Terms to Your New Programs
290
291 If you develop a new program, and you want it to be of the greatest
292 possible use to the public, the best way to achieve this is to make it
293 free software which everyone can redistribute and change under these terms.
294
295 To do so, attach the following notices to the program. It is safest
296 to attach them to the start of each source file to most effectively
297 convey the exclusion of warranty; and each file should have at least
298 the "copyright" line and a pointer to where the full notice is found.
299
300 <one line to give the program's name and a brief idea of what it does.>
301 Copyright (C) <year> <name of author>
302
303 This program is free software; you can redistribute it and/or modify
304 it under the terms of the GNU General Public License as published by
305 the Free Software Foundation; either version 2 of the License, or
306 (at your option) any later version.
307
308 This program is distributed in the hope that it will be useful,
309 but WITHOUT ANY WARRANTY; without even the implied warranty of
310 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
311 GNU General Public License for more details.
312
313 You should have received a copy of the GNU General Public License
314 along with this program; if not, write to the Free Software
315 Foundation, Inc., 51 Franklin Steet, Fifth Floor,
316 Boston, MA 02110-1301, USA.
317
318
319 Also add information on how to contact you by electronic and paper mail.
320
321 If the program is interactive, make it output a short notice like this
322 when it starts in an interactive mode:
323
324 Gnomovision version 69, Copyright (C) year name of author
325 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
326 This is free software, and you are welcome to redistribute it
327 under certain conditions; type `show c' for details.
328
329 The hypothetical commands `show w' and `show c' should show the appropriate
330 parts of the General Public License. Of course, the commands you use may
331 be called something other than `show w' and `show c'; they could even be
332 mouse-clicks or menu items--whatever suits your program.
333
334 You should also get your employer (if you work as a programmer) or your
335 school, if any, to sign a "copyright disclaimer" for the program, if
336 necessary. Here is a sample; alter the names:
337
338 Yoyodyne, Inc., hereby disclaims all copyright interest in the program
339 `Gnomovision' (which makes passes at compilers) written by James Hacker.
340
341 <signature of Ty Coon>, 1 April 1989
342 Ty Coon, President of Vice
343
344 This General Public License does not permit incorporating your program into
345 proprietary programs. If your program is a subroutine library, you may
346 consider it more useful to permit linking proprietary applications with the
347 library. If this is what you want to do, use the GNU Library General
348 Public License instead of this License.
349
350 -------------------------------------------------------------------------
+0
-684
external/docs/qt-x11-free-3.3.8b/LICENSE.GPL3 less more
0
1 The Qt GUI Toolkit is Copyright (C) 1994-2008 Trolltech ASA.
2
3 You may use, distribute and copy the Qt GUI Toolkit under the terms of
4 GNU General Public License version 2, which is displayed below.
5
6 -------------------------------------------------------------------------
7
8 GNU GENERAL PUBLIC LICENSE
9 Version 3, 29 June 2007
10
11 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
12 Everyone is permitted to copy and distribute verbatim copies
13 of this license document, but changing it is not allowed.
14
15 Preamble
16
17 The GNU General Public License is a free, copyleft license for
18 software and other kinds of works.
19
20 The licenses for most software and other practical works are designed
21 to take away your freedom to share and change the works. By contrast,
22 the GNU General Public License is intended to guarantee your freedom to
23 share and change all versions of a program--to make sure it remains free
24 software for all its users. We, the Free Software Foundation, use the
25 GNU General Public License for most of our software; it applies also to
26 any other work released this way by its authors. You can apply it to
27 your programs, too.
28
29 When we speak of free software, we are referring to freedom, not
30 price. Our General Public Licenses are designed to make sure that you
31 have the freedom to distribute copies of free software (and charge for
32 them if you wish), that you receive source code or can get it if you
33 want it, that you can change the software or use pieces of it in new
34 free programs, and that you know you can do these things.
35
36 To protect your rights, we need to prevent others from denying you
37 these rights or asking you to surrender the rights. Therefore, you have
38 certain responsibilities if you distribute copies of the software, or if
39 you modify it: responsibilities to respect the freedom of others.
40
41 For example, if you distribute copies of such a program, whether
42 gratis or for a fee, you must pass on to the recipients the same
43 freedoms that you received. You must make sure that they, too, receive
44 or can get the source code. And you must show them these terms so they
45 know their rights.
46
47 Developers that use the GNU GPL protect your rights with two steps:
48 (1) assert copyright on the software, and (2) offer you this License
49 giving you legal permission to copy, distribute and/or modify it.
50
51 For the developers' and authors' protection, the GPL clearly explains
52 that there is no warranty for this free software. For both users' and
53 authors' sake, the GPL requires that modified versions be marked as
54 changed, so that their problems will not be attributed erroneously to
55 authors of previous versions.
56
57 Some devices are designed to deny users access to install or run
58 modified versions of the software inside them, although the manufacturer
59 can do so. This is fundamentally incompatible with the aim of
60 protecting users' freedom to change the software. The systematic
61 pattern of such abuse occurs in the area of products for individuals to
62 use, which is precisely where it is most unacceptable. Therefore, we
63 have designed this version of the GPL to prohibit the practice for those
64 products. If such problems arise substantially in other domains, we
65 stand ready to extend this provision to those domains in future versions
66 of the GPL, as needed to protect the freedom of users.
67
68 Finally, every program is threatened constantly by software patents.
69 States should not allow patents to restrict development and use of
70 software on general-purpose computers, but in those that do, we wish to
71 avoid the special danger that patents applied to a free program could
72 make it effectively proprietary. To prevent this, the GPL assures that
73 patents cannot be used to render the program non-free.
74
75 The precise terms and conditions for copying, distribution and
76 modification follow.
77
78 TERMS AND CONDITIONS
79
80 0. Definitions.
81
82 "This License" refers to version 3 of the GNU General Public License.
83
84 "Copyright" also means copyright-like laws that apply to other kinds of
85 works, such as semiconductor masks.
86
87 "The Program" refers to any copyrightable work licensed under this
88 License. Each licensee is addressed as "you". "Licensees" and
89 "recipients" may be individuals or organizations.
90
91 To "modify" a work means to copy from or adapt all or part of the work
92 in a fashion requiring copyright permission, other than the making of an
93 exact copy. The resulting work is called a "modified version" of the
94 earlier work or a work "based on" the earlier work.
95
96 A "covered work" means either the unmodified Program or a work based
97 on the Program.
98
99 To "propagate" a work means to do anything with it that, without
100 permission, would make you directly or secondarily liable for
101 infringement under applicable copyright law, except executing it on a
102 computer or modifying a private copy. Propagation includes copying,
103 distribution (with or without modification), making available to the
104 public, and in some countries other activities as well.
105
106 To "convey" a work means any kind of propagation that enables other
107 parties to make or receive copies. Mere interaction with a user through
108 a computer network, with no transfer of a copy, is not conveying.
109
110 An interactive user interface displays "Appropriate Legal Notices"
111 to the extent that it includes a convenient and prominently visible
112 feature that (1) displays an appropriate copyright notice, and (2)
113 tells the user that there is no warranty for the work (except to the
114 extent that warranties are provided), that licensees may convey the
115 work under this License, and how to view a copy of this License. If
116 the interface presents a list of user commands or options, such as a
117 menu, a prominent item in the list meets this criterion.
118
119 1. Source Code.
120
121 The "source code" for a work means the preferred form of the work
122 for making modifications to it. "Object code" means any non-source
123 form of a work.
124
125 A "Standard Interface" means an interface that either is an official
126 standard defined by a recognized standards body, or, in the case of
127 interfaces specified for a particular programming language, one that
128 is widely used among developers working in that language.
129
130 The "System Libraries" of an executable work include anything, other
131 than the work as a whole, that (a) is included in the normal form of
132 packaging a Major Component, but which is not part of that Major
133 Component, and (b) serves only to enable use of the work with that
134 Major Component, or to implement a Standard Interface for which an
135 implementation is available to the public in source code form. A
136 "Major Component", in this context, means a major essential component
137 (kernel, window system, and so on) of the specific operating system
138 (if any) on which the executable work runs, or a compiler used to
139 produce the work, or an object code interpreter used to run it.
140
141 The "Corresponding Source" for a work in object code form means all
142 the source code needed to generate, install, and (for an executable
143 work) run the object code and to modify the work, including scripts to
144 control those activities. However, it does not include the work's
145 System Libraries, or general-purpose tools or generally available free
146 programs which are used unmodified in performing those activities but
147 which are not part of the work. For example, Corresponding Source
148 includes interface definition files associated with source files for
149 the work, and the source code for shared libraries and dynamically
150 linked subprograms that the work is specifically designed to require,
151 such as by intimate data communication or control flow between those
152 subprograms and other parts of the work.
153
154 The Corresponding Source need not include anything that users
155 can regenerate automatically from other parts of the Corresponding
156 Source.
157
158 The Corresponding Source for a work in source code form is that
159 same work.
160
161 2. Basic Permissions.
162
163 All rights granted under this License are granted for the term of
164 copyright on the Program, and are irrevocable provided the stated
165 conditions are met. This License explicitly affirms your unlimited
166 permission to run the unmodified Program. The output from running a
167 covered work is covered by this License only if the output, given its
168 content, constitutes a covered work. This License acknowledges your
169 rights of fair use or other equivalent, as provided by copyright law.
170
171 You may make, run and propagate covered works that you do not
172 convey, without conditions so long as your license otherwise remains
173 in force. You may convey covered works to others for the sole purpose
174 of having them make modifications exclusively for you, or provide you
175 with facilities for running those works, provided that you comply with
176 the terms of this License in conveying all material for which you do
177 not control copyright. Those thus making or running the covered works
178 for you must do so exclusively on your behalf, under your direction
179 and control, on terms that prohibit them from making any copies of
180 your copyrighted material outside their relationship with you.
181
182 Conveying under any other circumstances is permitted solely under
183 the conditions stated below. Sublicensing is not allowed; section 10
184 makes it unnecessary.
185
186 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
187
188 No covered work shall be deemed part of an effective technological
189 measure under any applicable law fulfilling obligations under article
190 11 of the WIPO copyright treaty adopted on 20 December 1996, or
191 similar laws prohibiting or restricting circumvention of such
192 measures.
193
194 When you convey a covered work, you waive any legal power to forbid
195 circumvention of technological measures to the extent such circumvention
196 is effected by exercising rights under this License with respect to
197 the covered work, and you disclaim any intention to limit operation or
198 modification of the work as a means of enforcing, against the work's
199 users, your or third parties' legal rights to forbid circumvention of
200 technological measures.
201
202 4. Conveying Verbatim Copies.
203
204 You may convey verbatim copies of the Program's source code as you
205 receive it, in any medium, provided that you conspicuously and
206 appropriately publish on each copy an appropriate copyright notice;
207 keep intact all notices stating that this License and any
208 non-permissive terms added in accord with section 7 apply to the code;
209 keep intact all notices of the absence of any warranty; and give all
210 recipients a copy of this License along with the Program.
211
212 You may charge any price or no price for each copy that you convey,
213 and you may offer support or warranty protection for a fee.
214
215 5. Conveying Modified Source Versions.
216
217 You may convey a work based on the Program, or the modifications to
218 produce it from the Program, in the form of source code under the
219 terms of section 4, provided that you also meet all of these conditions:
220
221 a) The work must carry prominent notices stating that you modified
222 it, and giving a relevant date.
223
224 b) The work must carry prominent notices stating that it is
225 released under this License and any conditions added under section
226 7. This requirement modifies the requirement in section 4 to
227 "keep intact all notices".
228
229 c) You must license the entire work, as a whole, under this
230 License to anyone who comes into possession of a copy. This
231 License will therefore apply, along with any applicable section 7
232 additional terms, to the whole of the work, and all its parts,
233 regardless of how they are packaged. This License gives no
234 permission to license the work in any other way, but it does not
235 invalidate such permission if you have separately received it.
236
237 d) If the work has interactive user interfaces, each must display
238 Appropriate Legal Notices; however, if the Program has interactive
239 interfaces that do not display Appropriate Legal Notices, your
240 work need not make them do so.
241
242 A compilation of a covered work with other separate and independent
243 works, which are not by their nature extensions of the covered work,
244 and which are not combined with it such as to form a larger program,
245 in or on a volume of a storage or distribution medium, is called an
246 "aggregate" if the compilation and its resulting copyright are not
247 used to limit the access or legal rights of the compilation's users
248 beyond what the individual works permit. Inclusion of a covered work
249 in an aggregate does not cause this License to apply to the other
250 parts of the aggregate.
251
252 6. Conveying Non-Source Forms.
253
254 You may convey a covered work in object code form under the terms
255 of sections 4 and 5, provided that you also convey the
256 machine-readable Corresponding Source under the terms of this License,
257 in one of these ways:
258
259 a) Convey the object code in, or embodied in, a physical product
260 (including a physical distribution medium), accompanied by the
261 Corresponding Source fixed on a durable physical medium
262 customarily used for software interchange.
263
264 b) Convey the object code in, or embodied in, a physical product
265 (including a physical distribution medium), accompanied by a
266 written offer, valid for at least three years and valid for as
267 long as you offer spare parts or customer support for that product
268 model, to give anyone who possesses the object code either (1) a
269 copy of the Corresponding Source for all the software in the
270 product that is covered by this License, on a durable physical
271 medium customarily used for software interchange, for a price no
272 more than your reasonable cost of physically performing this
273 conveying of source, or (2) access to copy the
274 Corresponding Source from a network server at no charge.
275
276 c) Convey individual copies of the object code with a copy of the
277 written offer to provide the Corresponding Source. This
278 alternative is allowed only occasionally and noncommercially, and
279 only if you received the object code with such an offer, in accord
280 with subsection 6b.
281
282 d) Convey the object code by offering access from a designated
283 place (gratis or for a charge), and offer equivalent access to the
284 Corresponding Source in the same way through the same place at no
285 further charge. You need not require recipients to copy the
286 Corresponding Source along with the object code. If the place to
287 copy the object code is a network server, the Corresponding Source
288 may be on a different server (operated by you or a third party)
289 that supports equivalent copying facilities, provided you maintain
290 clear directions next to the object code saying where to find the
291 Corresponding Source. Regardless of what server hosts the
292 Corresponding Source, you remain obligated to ensure that it is
293 available for as long as needed to satisfy these requirements.
294
295 e) Convey the object code using peer-to-peer transmission, provided
296 you inform other peers where the object code and Corresponding
297 Source of the work are being offered to the general public at no
298 charge under subsection 6d.
299
300 A separable portion of the object code, whose source code is excluded
301 from the Corresponding Source as a System Library, need not be
302 included in conveying the object code work.
303
304 A "User Product" is either (1) a "consumer product", which means any
305 tangible personal property which is normally used for personal, family,
306 or household purposes, or (2) anything designed or sold for incorporation
307 into a dwelling. In determining whether a product is a consumer product,
308 doubtful cases shall be resolved in favor of coverage. For a particular
309 product received by a particular user, "normally used" refers to a
310 typical or common use of that class of product, regardless of the status
311 of the particular user or of the way in which the particular user
312 actually uses, or expects or is expected to use, the product. A product
313 is a consumer product regardless of whether the product has substantial
314 commercial, industrial or non-consumer uses, unless such uses represent
315 the only significant mode of use of the product.
316
317 "Installation Information" for a User Product means any methods,
318 procedures, authorization keys, or other information required to install
319 and execute modified versions of a covered work in that User Product from
320 a modified version of its Corresponding Source. The information must
321 suffice to ensure that the continued functioning of the modified object
322 code is in no case prevented or interfered with solely because
323 modification has been made.
324
325 If you convey an object code work under this section in, or with, or
326 specifically for use in, a User Product, and the conveying occurs as
327 part of a transaction in which the right of possession and use of the
328 User Product is transferred to the recipient in perpetuity or for a
329 fixed term (regardless of how the transaction is characterized), the
330 Corresponding Source conveyed under this section must be accompanied
331 by the Installation Information. But this requirement does not apply
332 if neither you nor any third party retains the ability to install
333 modified object code on the User Product (for example, the work has
334 been installed in ROM).
335
336 The requirement to provide Installation Information does not include a
337 requirement to continue to provide support service, warranty, or updates
338 for a work that has been modified or installed by the recipient, or for
339 the User Product in which it has been modified or installed. Access to a
340 network may be denied when the modification itself materially and
341 adversely affects the operation of the network or violates the rules and
342 protocols for communication across the network.
343
344 Corresponding Source conveyed, and Installation Information provided,
345 in accord with this section must be in a format that is publicly
346 documented (and with an implementation available to the public in
347 source code form), and must require no special password or key for
348 unpacking, reading or copying.
349
350 7. Additional Terms.
351
352 "Additional permissions" are terms that supplement the terms of this
353 License by making exceptions from one or more of its conditions.
354 Additional permissions that are applicable to the entire Program shall
355 be treated as though they were included in this License, to the extent
356 that they are valid under applicable law. If additional permissions
357 apply only to part of the Program, that part may be used separately
358 under those permissions, but the entire Program remains governed by
359 this License without regard to the additional permissions.
360
361 When you convey a copy of a covered work, you may at your option
362 remove any additional permissions from that copy, or from any part of
363 it. (Additional permissions may be written to require their own
364 removal in certain cases when you modify the work.) You may place
365 additional permissions on material, added by you to a covered work,
366 for which you have or can give appropriate copyright permission.
367
368 Notwithstanding any other provision of this License, for material you
369 add to a covered work, you may (if authorized by the copyright holders of
370 that material) supplement the terms of this License with terms:
371
372 a) Disclaiming warranty or limiting liability differently from the
373 terms of sections 15 and 16 of this License; or
374
375 b) Requiring preservation of specified reasonable legal notices or
376 author attributions in that material or in the Appropriate Legal
377 Notices displayed by works containing it; or
378
379 c) Prohibiting misrepresentation of the origin of that material, or
380 requiring that modified versions of such material be marked in
381 reasonable ways as different from the original version; or
382
383 d) Limiting the use for publicity purposes of names of licensors or
384 authors of the material; or
385
386 e) Declining to grant rights under trademark law for use of some
387 trade names, trademarks, or service marks; or
388
389 f) Requiring indemnification of licensors and authors of that
390 material by anyone who conveys the material (or modified versions of
391 it) with contractual assumptions of liability to the recipient, for
392 any liability that these contractual assumptions directly impose on
393 those licensors and authors.
394
395 All other non-permissive additional terms are considered "further
396 restrictions" within the meaning of section 10. If the Program as you
397 received it, or any part of it, contains a notice stating that it is
398 governed by this License along with a term that is a further
399 restriction, you may remove that term. If a license document contains
400 a further restriction but permits relicensing or conveying under this
401 License, you may add to a covered work material governed by the terms
402 of that license document, provided that the further restriction does
403 not survive such relicensing or conveying.
404
405 If you add terms to a covered work in accord with this section, you
406 must place, in the relevant source files, a statement of the
407 additional terms that apply to those files, or a notice indicating
408 where to find the applicable terms.
409
410 Additional terms, permissive or non-permissive, may be stated in the
411 form of a separately written license, or stated as exceptions;
412 the above requirements apply either way.
413
414 8. Termination.
415
416 You may not propagate or modify a covered work except as expressly
417 provided under this License. Any attempt otherwise to propagate or
418 modify it is void, and will automatically terminate your rights under
419 this License (including any patent licenses granted under the third
420 paragraph of section 11).
421
422 However, if you cease all violation of this License, then your
423 license from a particular copyright holder is reinstated (a)
424 provisionally, unless and until the copyright holder explicitly and
425 finally terminates your license, and (b) permanently, if the copyright
426 holder fails to notify you of the violation by some reasonable means
427 prior to 60 days after the cessation.
428
429 Moreover, your license from a particular copyright holder is
430 reinstated permanently if the copyright holder notifies you of the
431 violation by some reasonable means, this is the first time you have
432 received notice of violation of this License (for any work) from that
433 copyright holder, and you cure the violation prior to 30 days after
434 your receipt of the notice.
435
436 Termination of your rights under this section does not terminate the
437 licenses of parties who have received copies or rights from you under
438 this License. If your rights have been terminated and not permanently
439 reinstated, you do not qualify to receive new licenses for the same
440 material under section 10.
441
442 9. Acceptance Not Required for Having Copies.
443
444 You are not required to accept this License in order to receive or
445 run a copy of the Program. Ancillary propagation of a covered work
446 occurring solely as a consequence of using peer-to-peer transmission
447 to receive a copy likewise does not require acceptance. However,
448 nothing other than this License grants you permission to propagate or
449 modify any covered work. These actions infringe copyright if you do
450 not accept this License. Therefore, by modifying or propagating a
451 covered work, you indicate your acceptance of this License to do so.
452
453 10. Automatic Licensing of Downstream Recipients.
454
455 Each time you convey a covered work, the recipient automatically
456 receives a license from the original licensors, to run, modify and
457 propagate that work, subject to this License. You are not responsible
458 for enforcing compliance by third parties with this License.
459
460 An "entity transaction" is a transaction transferring control of an
461 organization, or substantially all assets of one, or subdividing an
462 organization, or merging organizations. If propagation of a covered
463 work results from an entity transaction, each party to that
464 transaction who receives a copy of the work also receives whatever
465 licenses to the work the party's predecessor in interest had or could
466 give under the previous paragraph, plus a right to possession of the
467 Corresponding Source of the work from the predecessor in interest, if
468 the predecessor has it or can get it with reasonable efforts.
469
470 You may not impose any further restrictions on the exercise of the
471 rights granted or affirmed under this License. For example, you may
472 not impose a license fee, royalty, or other charge for exercise of
473 rights granted under this License, and you may not initiate litigation
474 (including a cross-claim or counterclaim in a lawsuit) alleging that
475 any patent claim is infringed by making, using, selling, offering for
476 sale, or importing the Program or any portion of it.
477
478 11. Patents.
479
480 A "contributor" is a copyright holder who authorizes use under this
481 License of the Program or a work on which the Program is based. The
482 work thus licensed is called the contributor's "contributor version".
483
484 A contributor's "essential patent claims" are all patent claims
485 owned or controlled by the contributor, whether already acquired or
486 hereafter acquired, that would be infringed by some manner, permitted
487 by this License, of making, using, or selling its contributor version,
488 but do not include claims that would be infringed only as a
489 consequence of further modification of the contributor version. For
490 purposes of this definition, "control" includes the right to grant
491 patent sublicenses in a manner consistent with the requirements of
492 this License.
493
494 Each contributor grants you a non-exclusive, worldwide, royalty-free
495 patent license under the contributor's essential patent claims, to
496 make, use, sell, offer for sale, import and otherwise run, modify and
497 propagate the contents of its contributor version.
498
499 In the following three paragraphs, a "patent license" is any express
500 agreement or commitment, however denominated, not to enforce a patent
501 (such as an express permission to practice a patent or covenant not to
502 sue for patent infringement). To "grant" such a patent license to a
503 party means to make such an agreement or commitment not to enforce a
504 patent against the party.
505
506 If you convey a covered work, knowingly relying on a patent license,
507 and the Corresponding Source of the work is not available for anyone
508 to copy, free of charge and under the terms of this License, through a
509 publicly available network server or other readily accessible means,
510 then you must either (1) cause the Corresponding Source to be so
511 available, or (2) arrange to deprive yourself of the benefit of the
512 patent license for this particular work, or (3) arrange, in a manner
513 consistent with the requirements of this License, to extend the patent
514 license to downstream recipients. "Knowingly relying" means you have
515 actual knowledge that, but for the patent license, your conveying the
516 covered work in a country, or your recipient's use of the covered work
517 in a country, would infringe one or more identifiable patents in that
518 country that you have reason to believe are valid.
519
520 If, pursuant to or in connection with a single transaction or
521 arrangement, you convey, or propagate by procuring conveyance of, a
522 covered work, and grant a patent license to some of the parties
523 receiving the covered work authorizing them to use, propagate, modify
524 or convey a specific copy of the covered work, then the patent license
525 you grant is automatically extended to all recipients of the covered
526 work and works based on it.
527
528 A patent license is "discriminatory" if it does not include within
529 the scope of its coverage, prohibits the exercise of, or is
530 conditioned on the non-exercise of one or more of the rights that are
531 specifically granted under this License. You may not convey a covered
532 work if you are a party to an arrangement with a third party that is
533 in the business of distributing software, under which you make payment
534 to the third party based on the extent of your activity of conveying
535 the work, and under which the third party grants, to any of the
536 parties who would receive the covered work from you, a discriminatory
537 patent license (a) in connection with copies of the covered work
538 conveyed by you (or copies made from those copies), or (b) primarily
539 for and in connection with specific products or compilations that
540 contain the covered work, unless you entered into that arrangement,
541 or that patent license was granted, prior to 28 March 2007.
542
543 Nothing in this License shall be construed as excluding or limiting
544 any implied license or other defenses to infringement that may
545 otherwise be available to you under applicable patent law.
546
547 12. No Surrender of Others' Freedom.
548
549 If conditions are imposed on you (whether by court order, agreement or
550 otherwise) that contradict the conditions of this License, they do not
551 excuse you from the conditions of this License. If you cannot convey a
552 covered work so as to satisfy simultaneously your obligations under this
553 License and any other pertinent obligations, then as a consequence you may
554 not convey it at all. For example, if you agree to terms that obligate you
555 to collect a royalty for further conveying from those to whom you convey
556 the Program, the only way you could satisfy both those terms and this
557 License would be to refrain entirely from conveying the Program.
558
559 13. Use with the GNU Affero General Public License.
560
561 Notwithstanding any other provision of this License, you have
562 permission to link or combine any covered work with a work licensed
563 under version 3 of the GNU Affero General Public License into a single
564 combined work, and to convey the resulting work. The terms of this
565 License will continue to apply to the part which is the covered work,
566 but the special requirements of the GNU Affero General Public License,
567 section 13, concerning interaction through a network will apply to the
568 combination as such.
569
570 14. Revised Versions of this License.
571
572 The Free Software Foundation may publish revised and/or new versions of
573 the GNU General Public License from time to time. Such new versions will
574 be similar in spirit to the present version, but may differ in detail to
575 address new problems or concerns.
576
577 Each version is given a distinguishing version number. If the
578 Program specifies that a certain numbered version of the GNU General
579 Public License "or any later version" applies to it, you have the
580 option of following the terms and conditions either of that numbered
581 version or of any later version published by the Free Software
582 Foundation. If the Program does not specify a version number of the
583 GNU General Public License, you may choose any version ever published
584 by the Free Software Foundation.
585
586 If the Program specifies that a proxy can decide which future
587 versions of the GNU General Public License can be used, that proxy's
588 public statement of acceptance of a version permanently authorizes you
589 to choose that version for the Program.
590
591 Later license versions may give you additional or different
592 permissions. However, no additional obligations are imposed on any
593 author or copyright holder as a result of your choosing to follow a
594 later version.
595
596 15. Disclaimer of Warranty.
597
598 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
599 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
600 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
601 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
602 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
603 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
604 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
605 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
606
607 16. Limitation of Liability.
608
609 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
610 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
611 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
612 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
613 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
614 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
615 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
616 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
617 SUCH DAMAGES.
618
619 17. Interpretation of Sections 15 and 16.
620
621 If the disclaimer of warranty and limitation of liability provided
622 above cannot be given local legal effect according to their terms,
623 reviewing courts shall apply local law that most closely approximates
624 an absolute waiver of all civil liability in connection with the
625 Program, unless a warranty or assumption of liability accompanies a
626 copy of the Program in return for a fee.
627
628 END OF TERMS AND CONDITIONS
629
630 How to Apply These Terms to Your New Programs
631
632 If you develop a new program, and you want it to be of the greatest
633 possible use to the public, the best way to achieve this is to make it
634 free software which everyone can redistribute and change under these terms.
635
636 To do so, attach the following notices to the program. It is safest
637 to attach them to the start of each source file to most effectively
638 state the exclusion of warranty; and each file should have at least
639 the "copyright" line and a pointer to where the full notice is found.
640
641 <one line to give the program's name and a brief idea of what it does.>
642 Copyright (C) <year> <name of author>
643
644 This program is free software: you can redistribute it and/or modify
645 it under the terms of the GNU General Public License as published by
646 the Free Software Foundation, either version 3 of the License, or
647 (at your option) any later version.
648
649 This program is distributed in the hope that it will be useful,
650 but WITHOUT ANY WARRANTY; without even the implied warranty of
651 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
652 GNU General Public License for more details.
653
654 You should have received a copy of the GNU General Public License
655 along with this program. If not, see <http://www.gnu.org/licenses/>.
656
657 Also add information on how to contact you by electronic and paper mail.
658
659 If the program does terminal interaction, make it output a short
660 notice like this when it starts in an interactive mode:
661
662 <program> Copyright (C) <year> <name of author>
663 This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
664 This is free software, and you are welcome to redistribute it
665 under certain conditions; type `show c' for details.
666
667 The hypothetical commands `show w' and `show c' should show the appropriate
668 parts of the General Public License. Of course, your program's commands
669 might be different; for a GUI interface, you would use an "about box".
670
671 You should also get your employer (if you work as a programmer) or school,
672 if any, to sign a "copyright disclaimer" for the program, if necessary.
673 For more information on this, and how to apply and follow the GNU GPL, see
674 <http://www.gnu.org/licenses/>.
675
676 The GNU General Public License does not permit incorporating your program
677 into proprietary programs. If your program is a subroutine library, you
678 may consider it more useful to permit linking proprietary applications with
679 the library. If this is what you want to do, use the GNU Lesser General
680 Public License instead of this License. But first, please read
681 <http://www.gnu.org/philosophy/why-not-lgpl.html>.
682
683 -------------------------------------------------------------------------
+0
-103
external/docs/qt-x11-free-3.3.8b/LICENSE.QPL less more
0 THE Q PUBLIC LICENSE
1 version 1.0
2
3 Copyright (C) 1999-2000 Trolltech AS, Norway.
4 Everyone is permitted to copy and
5 distribute this license document.
6
7 The intent of this license is to establish freedom to share and change the
8 software regulated by this license under the open source model.
9
10 This license applies to any software containing a notice placed by the
11 copyright holder saying that it may be distributed under the terms of
12 the Q Public License version 1.0. Such software is herein referred to as
13 the Software. This license covers modification and distribution of the
14 Software, use of third-party application programs based on the Software,
15 and development of free software which uses the Software.
16
17 Granted Rights
18
19 1. You are granted the non-exclusive rights set forth in this license
20 provided you agree to and comply with any and all conditions in this
21 license. Whole or partial distribution of the Software, or software
22 items that link with the Software, in any form signifies acceptance of
23 this license.
24
25 2. You may copy and distribute the Software in unmodified form provided
26 that the entire package, including - but not restricted to - copyright,
27 trademark notices and disclaimers, as released by the initial developer
28 of the Software, is distributed.
29
30 3. You may make modifications to the Software and distribute your
31 modifications, in a form that is separate from the Software, such as
32 patches. The following restrictions apply to modifications:
33
34 a. Modifications must not alter or remove any copyright notices in
35 the Software.
36
37 b. When modifications to the Software are released under this
38 license, a non-exclusive royalty-free right is granted to the
39 initial developer of the Software to distribute your modification
40 in future versions of the Software provided such versions remain
41 available under these terms in addition to any other license(s) of
42 the initial developer.
43
44 4. You may distribute machine-executable forms of the Software or
45 machine-executable forms of modified versions of the Software, provided
46 that you meet these restrictions:
47
48 a. You must include this license document in the distribution.
49
50 b. You must ensure that all recipients of the machine-executable forms
51 are also able to receive the complete machine-readable source code
52 to the distributed Software, including all modifications, without
53 any charge beyond the costs of data transfer, and place prominent
54 notices in the distribution explaining this.
55
56 c. You must ensure that all modifications included in the
57 machine-executable forms are available under the terms of this
58 license.
59
60 5. You may use the original or modified versions of the Software to
61 compile, link and run application programs legally developed by you
62 or by others.
63
64 6. You may develop application programs, reusable components and other
65 software items that link with the original or modified versions of the
66 Software. These items, when distributed, are subject to the following
67 requirements:
68
69 a. You must ensure that all recipients of machine-executable forms of
70 these items are also able to receive and use the complete
71 machine-readable source code to the items without any charge
72 beyond the costs of data transfer.
73
74 b. You must explicitly license all recipients of your items to use
75 and re-distribute original and modified versions of the items in
76 both machine-executable and source code forms. The recipients must
77 be able to do so without any charges whatsoever, and they must be
78 able to re-distribute to anyone they choose.
79
80
81 c. If the items are not available to the general public, and the
82 initial developer of the Software requests a copy of the items,
83 then you must supply one.
84
85 Limitations of Liability
86
87 In no event shall the initial developers or copyright holders be liable
88 for any damages whatsoever, including - but not restricted to - lost
89 revenue or profits or other direct, indirect, special, incidental or
90 consequential damages, even if they have been advised of the possibility
91 of such damages, except to the extent invariable law, if any, provides
92 otherwise.
93
94 No Warranty
95
96 The Software and this license document are provided AS IS with NO WARRANTY
97 OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
98 FOR A PARTICULAR PURPOSE.
99 Choice of Law
100
101 This license is governed by the Laws of Norway. Disputes shall be settled
102 by Oslo City Court.
+0
-63
external/docs/qt-x11-free-3.3.8b/README less more
0 This is Qt version 3.3.8
1
2 Qt is a multiplatform C++ GUI application framework.
3
4 Qt 3.3 introduces new features and many improvements over the 3.2.x
5 series. See the changes file for details.
6
7 The Qt version 3.3 series is binary compatible with the 3.2.x series -
8 applications compiled for 3.2 will continue to run with 3.3.
9
10 For this release, the following platforms have been tested:
11
12 win32-borland
13 win32-g++
14 win32-icc
15 win32-msvc
16 win32-msvc.net
17 win32-msvc2005
18
19 aix-g++
20 aix-xlc
21 aix-xlc-64
22 freebsd-g++
23 freebsd-icc
24 hpux-acc
25 hpux-g++
26 irix-cc
27 irix-cc-64
28 irix-g++
29 linux-ecc-64
30 linux-g++
31 linux-g++-64
32 linux-icc
33 solaris-cc
34 solaris-cc-64
35 solaris-g++
36 solaris-g++-64
37 tru64-g++
38
39 macx-g++
40 macx-pbuilder
41
42 If you want to use Qt 3 on an unsupported version of Unix, please
43 contact us at [email protected] so that we can assist you.
44
45
46 How to get the release:
47
48 Qt Open Source Edition: Download the .tar.gz archive from
49 ftp.trolltech.com. For faster download times, use ftpsearch and search
50 for qt-x11-free-3.3.8 to find it on a mirror ftp site
51 near you.
52
53 Qt Professional Edition, Qt Enterprise Edition: Holders of valid
54 licenses should have received an email with instructions on how to
55 get the new release. Contact [email protected] if you are a
56 Professional or Enterprise Edition licensee and have not received this
57 email.
58
59 Any problems encountered with Qt 3.3 should be reported to
60 [email protected].
61
62 Qt is a trademark of Trolltech ASA.
+0
-19
external/docs/qt-x11-free-3.3.8b/README-QT.TXT less more
0 This software was developed with the Open Source Edition of Qt, the
1 cross-platform C++ graphical user interface toolkit.
2
3 Qt is a product of Trolltech (see http://www.trolltech.com). Qt is
4 released in two different editions:
5
6 - The Qt Open Source Edition, which may be used free of charge for
7 developing free (non-proprietary) software on X11, embedded Linux,
8 and Mac OS X. This version is available for download from
9 http://www.trolltech.com/dl/ and is used by this program.
10
11 - The Qt Commercial Edition, which may be used to develop
12 commercial/proprietary software on X11, Microsoft Windows, embedded
13 Linux, and Mac OS X. For pricing and availability of the Commercial
14 Edition, please see http://www.trolltech.com/pricing.html or contact
15 Trolltech at [email protected]
16
17 For further information about Qt, please see the Trolltech web site
18 (http://www.trolltech.com) or email [email protected].
+0
-48
external/docs/sip-4.14.7/LICENSE less more
0 RIVERBANK COMPUTING LIMITED LICENSE AGREEMENT FOR SIP
1
2 1. This LICENSE AGREEMENT is between Riverbank Computing Limited ("Riverbank"),
3 and the Individual or Organization ("Licensee") accessing and otherwise using
4 SIP software in source or binary form and its associated documentation. SIP
5 comprises a software tool for generating Python bindings for software C and C++
6 libraries, and a Python extension module used at runtime by those generated
7 bindings.
8
9 2. Subject to the terms and conditions of this License Agreement, Riverbank
10 hereby grants Licensee a nonexclusive, royalty-free, world-wide license to
11 reproduce, analyze, test, perform and/or display publicly, prepare derivative
12 works, distribute, and otherwise use SIP alone or in any derivative version,
13 provided, however, that Riverbank's License Agreement and Riverbank's notice of
14 copyright, e.g., "Copyright (c) 2013 Riverbank Computing Limited; All Rights
15 Reserved" are retained in SIP alone or in any derivative version prepared by
16 Licensee.
17
18 3. In the event Licensee prepares a derivative work that is based on or
19 incorporates SIP or any part thereof, and wants to make the derivative work
20 available to others as provided herein, then Licensee hereby agrees to include
21 in any such work a brief summary of the changes made to SIP.
22
23 4. Licensee may not use SIP to generate Python bindings for any C or C++
24 library for which bindings are already provided by Riverbank.
25
26 5. Riverbank is making SIP available to Licensee on an "AS IS" basis.
27 RIVERBANK MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY
28 OF EXAMPLE, BUT NOT LIMITATION, RIVERBANK MAKES NO AND DISCLAIMS ANY
29 REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
30 PURPOSE OR THAT THE USE OF SIP WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
31
32 6. RIVERBANK SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF SIP FOR ANY
33 INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING,
34 DISTRIBUTING, OR OTHERWISE USING SIP, OR ANY DERIVATIVE THEREOF, EVEN IF
35 ADVISED OF THE POSSIBILITY THEREOF.
36
37 7. This License Agreement will automatically terminate upon a material breach
38 of its terms and conditions.
39
40 8. Nothing in this License Agreement shall be deemed to create any relationship
41 of agency, partnership, or joint venture between Riverbank and Licensee. This
42 License Agreement does not grant permission to use Riverbank trademarks or
43 trade name in a trademark sense to endorse or promote products or services of
44 Licensee, or any third party.
45
46 9. By copying, installing or otherwise using SIP, Licensee agrees to be bound
47 by the terms and conditions of this License Agreement.
+0
-344
external/docs/sip-4.14.7/LICENSE-GPL2 less more
0 -------------------------------------------------------------------------
1
2 GNU GENERAL PUBLIC LICENSE
3 Version 2, June 1991
4
5 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
6 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
7 Everyone is permitted to copy and distribute verbatim copies
8 of this license document, but changing it is not allowed.
9
10 Preamble
11
12 The licenses for most software are designed to take away your
13 freedom to share and change it. By contrast, the GNU General Public
14 License is intended to guarantee your freedom to share and change free
15 software--to make sure the software is free for all its users. This
16 General Public License applies to most of the Free Software
17 Foundation's software and to any other program whose authors commit to
18 using it. (Some other Free Software Foundation software is covered by
19 the GNU Library General Public License instead.) You can apply it to
20 your programs, too.
21
22 When we speak of free software, we are referring to freedom, not
23 price. Our General Public Licenses are designed to make sure that you
24 have the freedom to distribute copies of free software (and charge for
25 this service if you wish), that you receive source code or can get it
26 if you want it, that you can change the software or use pieces of it
27 in new free programs; and that you know you can do these things.
28
29 To protect your rights, we need to make restrictions that forbid
30 anyone to deny you these rights or to ask you to surrender the rights.
31 These restrictions translate to certain responsibilities for you if you
32 distribute copies of the software, or if you modify it.
33
34 For example, if you distribute copies of such a program, whether
35 gratis or for a fee, you must give the recipients all the rights that
36 you have. You must make sure that they, too, receive or can get the
37 source code. And you must show them these terms so they know their
38 rights.
39
40 We protect your rights with two steps: (1) copyright the software, and
41 (2) offer you this license which gives you legal permission to copy,
42 distribute and/or modify the software.
43
44 Also, for each author's protection and ours, we want to make certain
45 that everyone understands that there is no warranty for this free
46 software. If the software is modified by someone else and passed on, we
47 want its recipients to know that what they have is not the original, so
48 that any problems introduced by others will not reflect on the original
49 authors' reputations.
50
51 Finally, any free program is threatened constantly by software
52 patents. We wish to avoid the danger that redistributors of a free
53 program will individually obtain patent licenses, in effect making the
54 program proprietary. To prevent this, we have made it clear that any
55 patent must be licensed for everyone's free use or not licensed at all.
56
57 The precise terms and conditions for copying, distribution and
58 modification follow.
59
60 GNU GENERAL PUBLIC LICENSE
61 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
62
63 0. This License applies to any program or other work which contains
64 a notice placed by the copyright holder saying it may be distributed
65 under the terms of this General Public License. The "Program", below,
66 refers to any such program or work, and a "work based on the Program"
67 means either the Program or any derivative work under copyright law:
68 that is to say, a work containing the Program or a portion of it,
69 either verbatim or with modifications and/or translated into another
70 language. (Hereinafter, translation is included without limitation in
71 the term "modification".) Each licensee is addressed as "you".
72
73 Activities other than copying, distribution and modification are not
74 covered by this License; they are outside its scope. The act of
75 running the Program is not restricted, and the output from the Program
76 is covered only if its contents constitute a work based on the
77 Program (independent of having been made by running the Program).
78 Whether that is true depends on what the Program does.
79
80 1. You may copy and distribute verbatim copies of the Program's
81 source code as you receive it, in any medium, provided that you
82 conspicuously and appropriately publish on each copy an appropriate
83 copyright notice and disclaimer of warranty; keep intact all the
84 notices that refer to this License and to the absence of any warranty;
85 and give any other recipients of the Program a copy of this License
86 along with the Program.
87
88 You may charge a fee for the physical act of transferring a copy, and
89 you may at your option offer warranty protection in exchange for a fee.
90
91 2. You may modify your copy or copies of the Program or any portion
92 of it, thus forming a work based on the Program, and copy and
93 distribute such modifications or work under the terms of Section 1
94 above, provided that you also meet all of these conditions:
95
96 a) You must cause the modified files to carry prominent notices
97 stating that you changed the files and the date of any change.
98
99 b) You must cause any work that you distribute or publish, that in
100 whole or in part contains or is derived from the Program or any
101 part thereof, to be licensed as a whole at no charge to all third
102 parties under the terms of this License.
103
104 c) If the modified program normally reads commands interactively
105 when run, you must cause it, when started running for such
106 interactive use in the most ordinary way, to print or display an
107 announcement including an appropriate copyright notice and a
108 notice that there is no warranty (or else, saying that you provide
109 a warranty) and that users may redistribute the program under
110 these conditions, and telling the user how to view a copy of this
111 License. (Exception: if the Program itself is interactive but
112 does not normally print such an announcement, your work based on
113 the Program is not required to print an announcement.)
114
115 These requirements apply to the modified work as a whole. If
116 identifiable sections of that work are not derived from the Program,
117 and can be reasonably considered independent and separate works in
118 themselves, then this License, and its terms, do not apply to those
119 sections when you distribute them as separate works. But when you
120 distribute the same sections as part of a whole which is a work based
121 on the Program, the distribution of the whole must be on the terms of
122 this License, whose permissions for other licensees extend to the
123 entire whole, and thus to each and every part regardless of who wrote it.
124
125 Thus, it is not the intent of this section to claim rights or contest
126 your rights to work written entirely by you; rather, the intent is to
127 exercise the right to control the distribution of derivative or
128 collective works based on the Program.
129
130 In addition, mere aggregation of another work not based on the Program
131 with the Program (or with a work based on the Program) on a volume of
132 a storage or distribution medium does not bring the other work under
133 the scope of this License.
134
135 3. You may copy and distribute the Program (or a work based on it,
136 under Section 2) in object code or executable form under the terms of
137 Sections 1 and 2 above provided that you also do one of the following:
138
139 a) Accompany it with the complete corresponding machine-readable
140 source code, which must be distributed under the terms of Sections
141 1 and 2 above on a medium customarily used for software interchange; or,
142
143 b) Accompany it with a written offer, valid for at least three
144 years, to give any third party, for a charge no more than your
145 cost of physically performing source distribution, a complete
146 machine-readable copy of the corresponding source code, to be
147 distributed under the terms of Sections 1 and 2 above on a medium
148 customarily used for software interchange; or,
149
150 c) Accompany it with the information you received as to the offer
151 to distribute corresponding source code. (This alternative is
152 allowed only for noncommercial distribution and only if you
153 received the program in object code or executable form with such
154 an offer, in accord with Subsection b above.)
155
156 The source code for a work means the preferred form of the work for
157 making modifications to it. For an executable work, complete source
158 code means all the source code for all modules it contains, plus any
159 associated interface definition files, plus the scripts used to
160 control compilation and installation of the executable. However, as a
161 special exception, the source code distributed need not include
162 anything that is normally distributed (in either source or binary
163 form) with the major components (compiler, kernel, and so on) of the
164 operating system on which the executable runs, unless that component
165 itself accompanies the executable.
166
167 If distribution of executable or object code is made by offering
168 access to copy from a designated place, then offering equivalent
169 access to copy the source code from the same place counts as
170 distribution of the source code, even though third parties are not
171 compelled to copy the source along with the object code.
172
173 4. You may not copy, modify, sublicense, or distribute the Program
174 except as expressly provided under this License. Any attempt
175 otherwise to copy, modify, sublicense or distribute the Program is
176 void, and will automatically terminate your rights under this License.
177 However, parties who have received copies, or rights, from you under
178 this License will not have their licenses terminated so long as such
179 parties remain in full compliance.
180
181 5. You are not required to accept this License, since you have not
182 signed it. However, nothing else grants you permission to modify or
183 distribute the Program or its derivative works. These actions are
184 prohibited by law if you do not accept this License. Therefore, by
185 modifying or distributing the Program (or any work based on the
186 Program), you indicate your acceptance of this License to do so, and
187 all its terms and conditions for copying, distributing or modifying
188 the Program or works based on it.
189
190 6. Each time you redistribute the Program (or any work based on the
191 Program), the recipient automatically receives a license from the
192 original licensor to copy, distribute or modify the Program subject to
193 these terms and conditions. You may not impose any further
194 restrictions on the recipients' exercise of the rights granted herein.
195 You are not responsible for enforcing compliance by third parties to
196 this License.
197
198 7. If, as a consequence of a court judgment or allegation of patent
199 infringement or for any other reason (not limited to patent issues),
200 conditions are imposed on you (whether by court order, agreement or
201 otherwise) that contradict the conditions of this License, they do not
202 excuse you from the conditions of this License. If you cannot
203 distribute so as to satisfy simultaneously your obligations under this
204 License and any other pertinent obligations, then as a consequence you
205 may not distribute the Program at all. For example, if a patent
206 license would not permit royalty-free redistribution of the Program by
207 all those who receive copies directly or indirectly through you, then
208 the only way you could satisfy both it and this License would be to
209 refrain entirely from distribution of the Program.
210
211 If any portion of this section is held invalid or unenforceable under
212 any particular circumstance, the balance of the section is intended to
213 apply and the section as a whole is intended to apply in other
214 circumstances.
215
216 It is not the purpose of this section to induce you to infringe any
217 patents or other property right claims or to contest validity of any
218 such claims; this section has the sole purpose of protecting the
219 integrity of the free software distribution system, which is
220 implemented by public license practices. Many people have made
221 generous contributions to the wide range of software distributed
222 through that system in reliance on consistent application of that
223 system; it is up to the author/donor to decide if he or she is willing
224 to distribute software through any other system and a licensee cannot
225 impose that choice.
226
227 This section is intended to make thoroughly clear what is believed to
228 be a consequence of the rest of this License.
229
230 8. If the distribution and/or use of the Program is restricted in
231 certain countries either by patents or by copyrighted interfaces, the
232 original copyright holder who places the Program under this License
233 may add an explicit geographical distribution limitation excluding
234 those countries, so that distribution is permitted only in or among
235 countries not thus excluded. In such case, this License incorporates
236 the limitation as if written in the body of this License.
237
238 9. The Free Software Foundation may publish revised and/or new versions
239 of the General Public License from time to time. Such new versions will
240 be similar in spirit to the present version, but may differ in detail to
241 address new problems or concerns.
242
243 Each version is given a distinguishing version number. If the Program
244 specifies a version number of this License which applies to it and "any
245 later version", you have the option of following the terms and conditions
246 either of that version or of any later version published by the Free
247 Software Foundation. If the Program does not specify a version number of
248 this License, you may choose any version ever published by the Free Software
249 Foundation.
250
251 10. If you wish to incorporate parts of the Program into other free
252 programs whose distribution conditions are different, write to the author
253 to ask for permission. For software which is copyrighted by the Free
254 Software Foundation, write to the Free Software Foundation; we sometimes
255 make exceptions for this. Our decision will be guided by the two goals
256 of preserving the free status of all derivatives of our free software and
257 of promoting the sharing and reuse of software generally.
258
259 NO WARRANTY
260
261 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
262 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
263 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
264 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
265 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
266 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
267 TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
268 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
269 REPAIR OR CORRECTION.
270
271 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
272 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
273 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
274 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
275 OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
276 TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
277 YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
278 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
279 POSSIBILITY OF SUCH DAMAGES.
280
281 END OF TERMS AND CONDITIONS
282
283 How to Apply These Terms to Your New Programs
284
285 If you develop a new program, and you want it to be of the greatest
286 possible use to the public, the best way to achieve this is to make it
287 free software which everyone can redistribute and change under these terms.
288
289 To do so, attach the following notices to the program. It is safest
290 to attach them to the start of each source file to most effectively
291 convey the exclusion of warranty; and each file should have at least
292 the "copyright" line and a pointer to where the full notice is found.
293
294 <one line to give the program's name and a brief idea of what it does.>
295 Copyright (C) <year> <name of author>
296
297 This program is free software; you can redistribute it and/or modify
298 it under the terms of the GNU General Public License as published by
299 the Free Software Foundation; either version 2 of the License, or
300 (at your option) any later version.
301
302 This program is distributed in the hope that it will be useful,
303 but WITHOUT ANY WARRANTY; without even the implied warranty of
304 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
305 GNU General Public License for more details.
306
307 You should have received a copy of the GNU General Public License
308 along with this program; if not, write to the Free Software
309 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
310
311
312 Also add information on how to contact you by electronic and paper mail.
313
314 If the program is interactive, make it output a short notice like this
315 when it starts in an interactive mode:
316
317 Gnomovision version 69, Copyright (C) year name of author
318 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
319 This is free software, and you are welcome to redistribute it
320 under certain conditions; type `show c' for details.
321
322 The hypothetical commands `show w' and `show c' should show the appropriate
323 parts of the General Public License. Of course, the commands you use may
324 be called something other than `show w' and `show c'; they could even be
325 mouse-clicks or menu items--whatever suits your program.
326
327 You should also get your employer (if you work as a programmer) or your
328 school, if any, to sign a "copyright disclaimer" for the program, if
329 necessary. Here is a sample; alter the names:
330
331 Yoyodyne, Inc., hereby disclaims all copyright interest in the program
332 `Gnomovision' (which makes passes at compilers) written by James Hacker.
333
334 <signature of Ty Coon>, 1 April 1989
335 Ty Coon, President of Vice
336
337 This General Public License does not permit incorporating your program into
338 proprietary programs. If your program is a subroutine library, you may
339 consider it more useful to permit linking proprietary applications with the
340 library. If this is what you want to do, use the GNU Library General
341 Public License instead of this License.
342
343 -------------------------------------------------------------------------
+0
-678
external/docs/sip-4.14.7/LICENSE-GPL3 less more
0 -------------------------------------------------------------------------
1
2 GNU GENERAL PUBLIC LICENSE
3 Version 3, 29 June 2007
4
5 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
6 Everyone is permitted to copy and distribute verbatim copies
7 of this license document, but changing it is not allowed.
8
9 Preamble
10
11 The GNU General Public License is a free, copyleft license for
12 software and other kinds of works.
13
14 The licenses for most software and other practical works are designed
15 to take away your freedom to share and change the works. By contrast,
16 the GNU General Public License is intended to guarantee your freedom to
17 share and change all versions of a program--to make sure it remains free
18 software for all its users. We, the Free Software Foundation, use the
19 GNU General Public License for most of our software; it applies also to
20 any other work released this way by its authors. You can apply it to
21 your programs, too.
22
23 When we speak of free software, we are referring to freedom, not
24 price. Our General Public Licenses are designed to make sure that you
25 have the freedom to distribute copies of free software (and charge for
26 them if you wish), that you receive source code or can get it if you
27 want it, that you can change the software or use pieces of it in new
28 free programs, and that you know you can do these things.
29
30 To protect your rights, we need to prevent others from denying you
31 these rights or asking you to surrender the rights. Therefore, you have
32 certain responsibilities if you distribute copies of the software, or if
33 you modify it: responsibilities to respect the freedom of others.
34
35 For example, if you distribute copies of such a program, whether
36 gratis or for a fee, you must pass on to the recipients the same
37 freedoms that you received. You must make sure that they, too, receive
38 or can get the source code. And you must show them these terms so they
39 know their rights.
40
41 Developers that use the GNU GPL protect your rights with two steps:
42 (1) assert copyright on the software, and (2) offer you this License
43 giving you legal permission to copy, distribute and/or modify it.
44
45 For the developers' and authors' protection, the GPL clearly explains
46 that there is no warranty for this free software. For both users' and
47 authors' sake, the GPL requires that modified versions be marked as
48 changed, so that their problems will not be attributed erroneously to
49 authors of previous versions.
50
51 Some devices are designed to deny users access to install or run
52 modified versions of the software inside them, although the manufacturer
53 can do so. This is fundamentally incompatible with the aim of
54 protecting users' freedom to change the software. The systematic
55 pattern of such abuse occurs in the area of products for individuals to
56 use, which is precisely where it is most unacceptable. Therefore, we
57 have designed this version of the GPL to prohibit the practice for those
58 products. If such problems arise substantially in other domains, we
59 stand ready to extend this provision to those domains in future versions
60 of the GPL, as needed to protect the freedom of users.
61
62 Finally, every program is threatened constantly by software patents.
63 States should not allow patents to restrict development and use of
64 software on general-purpose computers, but in those that do, we wish to
65 avoid the special danger that patents applied to a free program could
66 make it effectively proprietary. To prevent this, the GPL assures that
67 patents cannot be used to render the program non-free.
68
69 The precise terms and conditions for copying, distribution and
70 modification follow.
71
72 TERMS AND CONDITIONS
73
74 0. Definitions.
75
76 "This License" refers to version 3 of the GNU General Public License.
77
78 "Copyright" also means copyright-like laws that apply to other kinds of
79 works, such as semiconductor masks.
80
81 "The Program" refers to any copyrightable work licensed under this
82 License. Each licensee is addressed as "you". "Licensees" and
83 "recipients" may be individuals or organizations.
84
85 To "modify" a work means to copy from or adapt all or part of the work
86 in a fashion requiring copyright permission, other than the making of an
87 exact copy. The resulting work is called a "modified version" of the
88 earlier work or a work "based on" the earlier work.
89
90 A "covered work" means either the unmodified Program or a work based
91 on the Program.
92
93 To "propagate" a work means to do anything with it that, without
94 permission, would make you directly or secondarily liable for
95 infringement under applicable copyright law, except executing it on a
96 computer or modifying a private copy. Propagation includes copying,
97 distribution (with or without modification), making available to the
98 public, and in some countries other activities as well.
99
100 To "convey" a work means any kind of propagation that enables other
101 parties to make or receive copies. Mere interaction with a user through
102 a computer network, with no transfer of a copy, is not conveying.
103
104 An interactive user interface displays "Appropriate Legal Notices"
105 to the extent that it includes a convenient and prominently visible
106 feature that (1) displays an appropriate copyright notice, and (2)
107 tells the user that there is no warranty for the work (except to the
108 extent that warranties are provided), that licensees may convey the
109 work under this License, and how to view a copy of this License. If
110 the interface presents a list of user commands or options, such as a
111 menu, a prominent item in the list meets this criterion.
112
113 1. Source Code.
114
115 The "source code" for a work means the preferred form of the work
116 for making modifications to it. "Object code" means any non-source
117 form of a work.
118
119 A "Standard Interface" means an interface that either is an official
120 standard defined by a recognized standards body, or, in the case of
121 interfaces specified for a particular programming language, one that
122 is widely used among developers working in that language.
123
124 The "System Libraries" of an executable work include anything, other
125 than the work as a whole, that (a) is included in the normal form of
126 packaging a Major Component, but which is not part of that Major
127 Component, and (b) serves only to enable use of the work with that
128 Major Component, or to implement a Standard Interface for which an
129 implementation is available to the public in source code form. A
130 "Major Component", in this context, means a major essential component
131 (kernel, window system, and so on) of the specific operating system
132 (if any) on which the executable work runs, or a compiler used to
133 produce the work, or an object code interpreter used to run it.
134
135 The "Corresponding Source" for a work in object code form means all
136 the source code needed to generate, install, and (for an executable
137 work) run the object code and to modify the work, including scripts to
138 control those activities. However, it does not include the work's
139 System Libraries, or general-purpose tools or generally available free
140 programs which are used unmodified in performing those activities but
141 which are not part of the work. For example, Corresponding Source
142 includes interface definition files associated with source files for
143 the work, and the source code for shared libraries and dynamically
144 linked subprograms that the work is specifically designed to require,
145 such as by intimate data communication or control flow between those
146 subprograms and other parts of the work.
147
148 The Corresponding Source need not include anything that users
149 can regenerate automatically from other parts of the Corresponding
150 Source.
151
152 The Corresponding Source for a work in source code form is that
153 same work.
154
155 2. Basic Permissions.
156
157 All rights granted under this License are granted for the term of
158 copyright on the Program, and are irrevocable provided the stated
159 conditions are met. This License explicitly affirms your unlimited
160 permission to run the unmodified Program. The output from running a
161 covered work is covered by this License only if the output, given its
162 content, constitutes a covered work. This License acknowledges your
163 rights of fair use or other equivalent, as provided by copyright law.
164
165 You may make, run and propagate covered works that you do not
166 convey, without conditions so long as your license otherwise remains
167 in force. You may convey covered works to others for the sole purpose
168 of having them make modifications exclusively for you, or provide you
169 with facilities for running those works, provided that you comply with
170 the terms of this License in conveying all material for which you do
171 not control copyright. Those thus making or running the covered works
172 for you must do so exclusively on your behalf, under your direction
173 and control, on terms that prohibit them from making any copies of
174 your copyrighted material outside their relationship with you.
175
176 Conveying under any other circumstances is permitted solely under
177 the conditions stated below. Sublicensing is not allowed; section 10
178 makes it unnecessary.
179
180 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
181
182 No covered work shall be deemed part of an effective technological
183 measure under any applicable law fulfilling obligations under article
184 11 of the WIPO copyright treaty adopted on 20 December 1996, or
185 similar laws prohibiting or restricting circumvention of such
186 measures.
187
188 When you convey a covered work, you waive any legal power to forbid
189 circumvention of technological measures to the extent such circumvention
190 is effected by exercising rights under this License with respect to
191 the covered work, and you disclaim any intention to limit operation or
192 modification of the work as a means of enforcing, against the work's
193 users, your or third parties' legal rights to forbid circumvention of
194 technological measures.
195
196 4. Conveying Verbatim Copies.
197
198 You may convey verbatim copies of the Program's source code as you
199 receive it, in any medium, provided that you conspicuously and
200 appropriately publish on each copy an appropriate copyright notice;
201 keep intact all notices stating that this License and any
202 non-permissive terms added in accord with section 7 apply to the code;
203 keep intact all notices of the absence of any warranty; and give all
204 recipients a copy of this License along with the Program.
205
206 You may charge any price or no price for each copy that you convey,
207 and you may offer support or warranty protection for a fee.
208
209 5. Conveying Modified Source Versions.
210
211 You may convey a work based on the Program, or the modifications to
212 produce it from the Program, in the form of source code under the
213 terms of section 4, provided that you also meet all of these conditions:
214
215 a) The work must carry prominent notices stating that you modified
216 it, and giving a relevant date.
217
218 b) The work must carry prominent notices stating that it is
219 released under this License and any conditions added under section
220 7. This requirement modifies the requirement in section 4 to
221 "keep intact all notices".
222
223 c) You must license the entire work, as a whole, under this
224 License to anyone who comes into possession of a copy. This
225 License will therefore apply, along with any applicable section 7
226 additional terms, to the whole of the work, and all its parts,
227 regardless of how they are packaged. This License gives no
228 permission to license the work in any other way, but it does not
229 invalidate such permission if you have separately received it.
230
231 d) If the work has interactive user interfaces, each must display
232 Appropriate Legal Notices; however, if the Program has interactive
233 interfaces that do not display Appropriate Legal Notices, your
234 work need not make them do so.
235
236 A compilation of a covered work with other separate and independent
237 works, which are not by their nature extensions of the covered work,
238 and which are not combined with it such as to form a larger program,
239 in or on a volume of a storage or distribution medium, is called an
240 "aggregate" if the compilation and its resulting copyright are not
241 used to limit the access or legal rights of the compilation's users
242 beyond what the individual works permit. Inclusion of a covered work
243 in an aggregate does not cause this License to apply to the other
244 parts of the aggregate.
245
246 6. Conveying Non-Source Forms.
247
248 You may convey a covered work in object code form under the terms
249 of sections 4 and 5, provided that you also convey the
250 machine-readable Corresponding Source under the terms of this License,
251 in one of these ways:
252
253 a) Convey the object code in, or embodied in, a physical product
254 (including a physical distribution medium), accompanied by the
255 Corresponding Source fixed on a durable physical medium
256 customarily used for software interchange.
257
258 b) Convey the object code in, or embodied in, a physical product
259 (including a physical distribution medium), accompanied by a
260 written offer, valid for at least three years and valid for as
261 long as you offer spare parts or customer support for that product
262 model, to give anyone who possesses the object code either (1) a
263 copy of the Corresponding Source for all the software in the
264 product that is covered by this License, on a durable physical
265 medium customarily used for software interchange, for a price no
266 more than your reasonable cost of physically performing this
267 conveying of source, or (2) access to copy the
268 Corresponding Source from a network server at no charge.
269
270 c) Convey individual copies of the object code with a copy of the
271 written offer to provide the Corresponding Source. This
272 alternative is allowed only occasionally and noncommercially, and
273 only if you received the object code with such an offer, in accord
274 with subsection 6b.
275
276 d) Convey the object code by offering access from a designated
277 place (gratis or for a charge), and offer equivalent access to the
278 Corresponding Source in the same way through the same place at no
279 further charge. You need not require recipients to copy the
280 Corresponding Source along with the object code. If the place to
281 copy the object code is a network server, the Corresponding Source
282 may be on a different server (operated by you or a third party)
283 that supports equivalent copying facilities, provided you maintain
284 clear directions next to the object code saying where to find the
285 Corresponding Source. Regardless of what server hosts the
286 Corresponding Source, you remain obligated to ensure that it is
287 available for as long as needed to satisfy these requirements.
288
289 e) Convey the object code using peer-to-peer transmission, provided
290 you inform other peers where the object code and Corresponding
291 Source of the work are being offered to the general public at no
292 charge under subsection 6d.
293
294 A separable portion of the object code, whose source code is excluded
295 from the Corresponding Source as a System Library, need not be
296 included in conveying the object code work.
297
298 A "User Product" is either (1) a "consumer product", which means any
299 tangible personal property which is normally used for personal, family,
300 or household purposes, or (2) anything designed or sold for incorporation
301 into a dwelling. In determining whether a product is a consumer product,
302 doubtful cases shall be resolved in favor of coverage. For a particular
303 product received by a particular user, "normally used" refers to a
304 typical or common use of that class of product, regardless of the status
305 of the particular user or of the way in which the particular user
306 actually uses, or expects or is expected to use, the product. A product
307 is a consumer product regardless of whether the product has substantial
308 commercial, industrial or non-consumer uses, unless such uses represent
309 the only significant mode of use of the product.
310
311 "Installation Information" for a User Product means any methods,
312 procedures, authorization keys, or other information required to install
313 and execute modified versions of a covered work in that User Product from
314 a modified version of its Corresponding Source. The information must
315 suffice to ensure that the continued functioning of the modified object
316 code is in no case prevented or interfered with solely because
317 modification has been made.
318
319 If you convey an object code work under this section in, or with, or
320 specifically for use in, a User Product, and the conveying occurs as
321 part of a transaction in which the right of possession and use of the
322 User Product is transferred to the recipient in perpetuity or for a
323 fixed term (regardless of how the transaction is characterized), the
324 Corresponding Source conveyed under this section must be accompanied
325 by the Installation Information. But this requirement does not apply
326 if neither you nor any third party retains the ability to install
327 modified object code on the User Product (for example, the work has
328 been installed in ROM).
329
330 The requirement to provide Installation Information does not include a
331 requirement to continue to provide support service, warranty, or updates
332 for a work that has been modified or installed by the recipient, or for
333 the User Product in which it has been modified or installed. Access to a
334 network may be denied when the modification itself materially and
335 adversely affects the operation of the network or violates the rules and
336 protocols for communication across the network.
337
338 Corresponding Source conveyed, and Installation Information provided,
339 in accord with this section must be in a format that is publicly
340 documented (and with an implementation available to the public in
341 source code form), and must require no special password or key for
342 unpacking, reading or copying.
343
344 7. Additional Terms.
345
346 "Additional permissions" are terms that supplement the terms of this
347 License by making exceptions from one or more of its conditions.
348 Additional permissions that are applicable to the entire Program shall
349 be treated as though they were included in this License, to the extent
350 that they are valid under applicable law. If additional permissions
351 apply only to part of the Program, that part may be used separately
352 under those permissions, but the entire Program remains governed by
353 this License without regard to the additional permissions.
354
355 When you convey a copy of a covered work, you may at your option
356 remove any additional permissions from that copy, or from any part of
357 it. (Additional permissions may be written to require their own
358 removal in certain cases when you modify the work.) You may place
359 additional permissions on material, added by you to a covered work,
360 for which you have or can give appropriate copyright permission.
361
362 Notwithstanding any other provision of this License, for material you
363 add to a covered work, you may (if authorized by the copyright holders of
364 that material) supplement the terms of this License with terms:
365
366 a) Disclaiming warranty or limiting liability differently from the
367 terms of sections 15 and 16 of this License; or
368
369 b) Requiring preservation of specified reasonable legal notices or
370 author attributions in that material or in the Appropriate Legal
371 Notices displayed by works containing it; or
372
373 c) Prohibiting misrepresentation of the origin of that material, or
374 requiring that modified versions of such material be marked in
375 reasonable ways as different from the original version; or
376
377 d) Limiting the use for publicity purposes of names of licensors or
378 authors of the material; or
379
380 e) Declining to grant rights under trademark law for use of some
381 trade names, trademarks, or service marks; or
382
383 f) Requiring indemnification of licensors and authors of that
384 material by anyone who conveys the material (or modified versions of
385 it) with contractual assumptions of liability to the recipient, for
386 any liability that these contractual assumptions directly impose on
387 those licensors and authors.
388
389 All other non-permissive additional terms are considered "further
390 restrictions" within the meaning of section 10. If the Program as you
391 received it, or any part of it, contains a notice stating that it is
392 governed by this License along with a term that is a further
393 restriction, you may remove that term. If a license document contains
394 a further restriction but permits relicensing or conveying under this
395 License, you may add to a covered work material governed by the terms
396 of that license document, provided that the further restriction does
397 not survive such relicensing or conveying.
398
399 If you add terms to a covered work in accord with this section, you
400 must place, in the relevant source files, a statement of the
401 additional terms that apply to those files, or a notice indicating
402 where to find the applicable terms.
403
404 Additional terms, permissive or non-permissive, may be stated in the
405 form of a separately written license, or stated as exceptions;
406 the above requirements apply either way.
407
408 8. Termination.
409
410 You may not propagate or modify a covered work except as expressly
411 provided under this License. Any attempt otherwise to propagate or
412 modify it is void, and will automatically terminate your rights under
413 this License (including any patent licenses granted under the third
414 paragraph of section 11).
415
416 However, if you cease all violation of this License, then your
417 license from a particular copyright holder is reinstated (a)
418 provisionally, unless and until the copyright holder explicitly and
419 finally terminates your license, and (b) permanently, if the copyright
420 holder fails to notify you of the violation by some reasonable means
421 prior to 60 days after the cessation.
422
423 Moreover, your license from a particular copyright holder is
424 reinstated permanently if the copyright holder notifies you of the
425 violation by some reasonable means, this is the first time you have
426 received notice of violation of this License (for any work) from that
427 copyright holder, and you cure the violation prior to 30 days after
428 your receipt of the notice.
429
430 Termination of your rights under this section does not terminate the
431 licenses of parties who have received copies or rights from you under
432 this License. If your rights have been terminated and not permanently
433 reinstated, you do not qualify to receive new licenses for the same
434 material under section 10.
435
436 9. Acceptance Not Required for Having Copies.
437
438 You are not required to accept this License in order to receive or
439 run a copy of the Program. Ancillary propagation of a covered work
440 occurring solely as a consequence of using peer-to-peer transmission
441 to receive a copy likewise does not require acceptance. However,
442 nothing other than this License grants you permission to propagate or
443 modify any covered work. These actions infringe copyright if you do
444 not accept this License. Therefore, by modifying or propagating a
445 covered work, you indicate your acceptance of this License to do so.
446
447 10. Automatic Licensing of Downstream Recipients.
448
449 Each time you convey a covered work, the recipient automatically
450 receives a license from the original licensors, to run, modify and
451 propagate that work, subject to this License. You are not responsible
452 for enforcing compliance by third parties with this License.
453
454 An "entity transaction" is a transaction transferring control of an
455 organization, or substantially all assets of one, or subdividing an
456 organization, or merging organizations. If propagation of a covered
457 work results from an entity transaction, each party to that
458 transaction who receives a copy of the work also receives whatever
459 licenses to the work the party's predecessor in interest had or could
460 give under the previous paragraph, plus a right to possession of the
461 Corresponding Source of the work from the predecessor in interest, if
462 the predecessor has it or can get it with reasonable efforts.
463
464 You may not impose any further restrictions on the exercise of the
465 rights granted or affirmed under this License. For example, you may
466 not impose a license fee, royalty, or other charge for exercise of
467 rights granted under this License, and you may not initiate litigation
468 (including a cross-claim or counterclaim in a lawsuit) alleging that
469 any patent claim is infringed by making, using, selling, offering for
470 sale, or importing the Program or any portion of it.
471
472 11. Patents.
473
474 A "contributor" is a copyright holder who authorizes use under this
475 License of the Program or a work on which the Program is based. The
476 work thus licensed is called the contributor's "contributor version".
477
478 A contributor's "essential patent claims" are all patent claims
479 owned or controlled by the contributor, whether already acquired or
480 hereafter acquired, that would be infringed by some manner, permitted
481 by this License, of making, using, or selling its contributor version,
482 but do not include claims that would be infringed only as a
483 consequence of further modification of the contributor version. For
484 purposes of this definition, "control" includes the right to grant
485 patent sublicenses in a manner consistent with the requirements of
486 this License.
487
488 Each contributor grants you a non-exclusive, worldwide, royalty-free
489 patent license under the contributor's essential patent claims, to
490 make, use, sell, offer for sale, import and otherwise run, modify and
491 propagate the contents of its contributor version.
492
493 In the following three paragraphs, a "patent license" is any express
494 agreement or commitment, however denominated, not to enforce a patent
495 (such as an express permission to practice a patent or covenant not to
496 sue for patent infringement). To "grant" such a patent license to a
497 party means to make such an agreement or commitment not to enforce a
498 patent against the party.
499
500 If you convey a covered work, knowingly relying on a patent license,
501 and the Corresponding Source of the work is not available for anyone
502 to copy, free of charge and under the terms of this License, through a
503 publicly available network server or other readily accessible means,
504 then you must either (1) cause the Corresponding Source to be so
505 available, or (2) arrange to deprive yourself of the benefit of the
506 patent license for this particular work, or (3) arrange, in a manner
507 consistent with the requirements of this License, to extend the patent
508 license to downstream recipients. "Knowingly relying" means you have
509 actual knowledge that, but for the patent license, your conveying the
510 covered work in a country, or your recipient's use of the covered work
511 in a country, would infringe one or more identifiable patents in that
512 country that you have reason to believe are valid.
513
514 If, pursuant to or in connection with a single transaction or
515 arrangement, you convey, or propagate by procuring conveyance of, a
516 covered work, and grant a patent license to some of the parties
517 receiving the covered work authorizing them to use, propagate, modify
518 or convey a specific copy of the covered work, then the patent license
519 you grant is automatically extended to all recipients of the covered
520 work and works based on it.
521
522 A patent license is "discriminatory" if it does not include within
523 the scope of its coverage, prohibits the exercise of, or is
524 conditioned on the non-exercise of one or more of the rights that are
525 specifically granted under this License. You may not convey a covered
526 work if you are a party to an arrangement with a third party that is
527 in the business of distributing software, under which you make payment
528 to the third party based on the extent of your activity of conveying
529 the work, and under which the third party grants, to any of the
530 parties who would receive the covered work from you, a discriminatory
531 patent license (a) in connection with copies of the covered work
532 conveyed by you (or copies made from those copies), or (b) primarily
533 for and in connection with specific products or compilations that
534 contain the covered work, unless you entered into that arrangement,
535 or that patent license was granted, prior to 28 March 2007.
536
537 Nothing in this License shall be construed as excluding or limiting
538 any implied license or other defenses to infringement that may
539 otherwise be available to you under applicable patent law.
540
541 12. No Surrender of Others' Freedom.
542
543 If conditions are imposed on you (whether by court order, agreement or
544 otherwise) that contradict the conditions of this License, they do not
545 excuse you from the conditions of this License. If you cannot convey a
546 covered work so as to satisfy simultaneously your obligations under this
547 License and any other pertinent obligations, then as a consequence you may
548 not convey it at all. For example, if you agree to terms that obligate you
549 to collect a royalty for further conveying from those to whom you convey
550 the Program, the only way you could satisfy both those terms and this
551 License would be to refrain entirely from conveying the Program.
552
553 13. Use with the GNU Affero General Public License.
554
555 Notwithstanding any other provision of this License, you have
556 permission to link or combine any covered work with a work licensed
557 under version 3 of the GNU Affero General Public License into a single
558 combined work, and to convey the resulting work. The terms of this
559 License will continue to apply to the part which is the covered work,
560 but the special requirements of the GNU Affero General Public License,
561 section 13, concerning interaction through a network will apply to the
562 combination as such.
563
564 14. Revised Versions of this License.
565
566 The Free Software Foundation may publish revised and/or new versions of
567 the GNU General Public License from time to time. Such new versions will
568 be similar in spirit to the present version, but may differ in detail to
569 address new problems or concerns.
570
571 Each version is given a distinguishing version number. If the
572 Program specifies that a certain numbered version of the GNU General
573 Public License "or any later version" applies to it, you have the
574 option of following the terms and conditions either of that numbered
575 version or of any later version published by the Free Software
576 Foundation. If the Program does not specify a version number of the
577 GNU General Public License, you may choose any version ever published
578 by the Free Software Foundation.
579
580 If the Program specifies that a proxy can decide which future
581 versions of the GNU General Public License can be used, that proxy's
582 public statement of acceptance of a version permanently authorizes you
583 to choose that version for the Program.
584
585 Later license versions may give you additional or different
586 permissions. However, no additional obligations are imposed on any
587 author or copyright holder as a result of your choosing to follow a
588 later version.
589
590 15. Disclaimer of Warranty.
591
592 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
593 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
594 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
595 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
596 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
597 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
598 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
599 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
600
601 16. Limitation of Liability.
602
603 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
604 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
605 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
606 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
607 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
608 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
609 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
610 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
611 SUCH DAMAGES.
612
613 17. Interpretation of Sections 15 and 16.
614
615 If the disclaimer of warranty and limitation of liability provided
616 above cannot be given local legal effect according to their terms,
617 reviewing courts shall apply local law that most closely approximates
618 an absolute waiver of all civil liability in connection with the
619 Program, unless a warranty or assumption of liability accompanies a
620 copy of the Program in return for a fee.
621
622 END OF TERMS AND CONDITIONS
623
624 How to Apply These Terms to Your New Programs
625
626 If you develop a new program, and you want it to be of the greatest
627 possible use to the public, the best way to achieve this is to make it
628 free software which everyone can redistribute and change under these terms.
629
630 To do so, attach the following notices to the program. It is safest
631 to attach them to the start of each source file to most effectively
632 state the exclusion of warranty; and each file should have at least
633 the "copyright" line and a pointer to where the full notice is found.
634
635 <one line to give the program's name and a brief idea of what it does.>
636 Copyright (C) <year> <name of author>
637
638 This program is free software: you can redistribute it and/or modify
639 it under the terms of the GNU General Public License as published by
640 the Free Software Foundation, either version 3 of the License, or
641 (at your option) any later version.
642
643 This program is distributed in the hope that it will be useful,
644 but WITHOUT ANY WARRANTY; without even the implied warranty of
645 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
646 GNU General Public License for more details.
647
648 You should have received a copy of the GNU General Public License
649 along with this program. If not, see <http://www.gnu.org/licenses/>.
650
651 Also add information on how to contact you by electronic and paper mail.
652
653 If the program does terminal interaction, make it output a short
654 notice like this when it starts in an interactive mode:
655
656 <program> Copyright (C) <year> <name of author>
657 This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
658 This is free software, and you are welcome to redistribute it
659 under certain conditions; type `show c' for details.
660
661 The hypothetical commands `show w' and `show c' should show the appropriate
662 parts of the General Public License. Of course, your program's commands
663 might be different; for a GUI interface, you would use an "about box".
664
665 You should also get your employer (if you work as a programmer) or school,
666 if any, to sign a "copyright disclaimer" for the program, if necessary.
667 For more information on this, and how to apply and follow the GNU GPL, see
668 <http://www.gnu.org/licenses/>.
669
670 The GNU General Public License does not permit incorporating your program
671 into proprietary programs. If your program is a subroutine library, you
672 may consider it more useful to permit linking proprietary applications with
673 the library. If this is what you want to do, use the GNU Lesser General
674 Public License instead of this License. But first, please read
675 <http://www.gnu.org/philosophy/why-not-lgpl.html>.
676
677 -------------------------------------------------------------------------
+0
-33
external/docs/sip-4.14.7/README less more
0 SIP - C/C++ Bindings Generator for Python v2 and v3
1 ===================================================
2
3 The SIP documentation (including installation instructions) can be found in the
4 ``doc`` directory.
5
6
7 Building from the Mercurial Repository
8 --------------------------------------
9
10 If you are using a copy of SIP cloned from the Mercurial repository, or are
11 using a Mercurial archive, then you have to prepare it first before you follow
12 the normal installation instructions.
13
14 The preparation is done using the ``build.py`` script which can be found in the
15 same directory as this ``README`` file. If it isn't there then you probably
16 have a packaged release and should just follow the normal installation
17 instructions.
18
19 The ``build.py`` script requires that ``flex`` and ``bison``, and the Mercurial
20 Python bindings are installed. If you want to create the HTML documentation
21 then Sphinx must also be installed.
22
23 To prepare run the following::
24
25 python build.py prepare
26
27 Note that ``build.py`` is a Python v2 script.
28
29 Now you can follow the normal installation instructions.
30
31 The ``build.py`` script has other useful commands, use the ``--help`` option to
32 see the details.
00 #!/bin/zsh
11
22 ###
3 ## Faraday Penetration Test IDE - Community Version
3 ## Faraday Penetration Test IDE
44 ## Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 ## See the file 'doc/LICENSE' for the license information
66 ###
00 #!/usr/bin/env python2.7
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2014 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
1818 import subprocess
1919 import pip
2020
21 from utils.logs import getLogger
22 sys.path.insert(0, os.path.dirname(os.path.realpath(__file__))) # Necessary?
21 from utils.logs import getLogger, setUpLogger
22 sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/external_libs/lib/python2.7/dist-packages')
2323 from config.configuration import getInstanceConfiguration
2424 from config.globals import *
2525 from utils.profilehooks import profile
2626
2727
28 QTDIR='/usr/local/qt'
29 PATH='%s/bin:%s' %(QTDIR, os.environ['PATH'])
30 MANPATH='%s/doc/man' % QTDIR
31 LD_LIBRARY_PATH='%s/lib:%s' % (QTDIR, os.environ.get('LD_LIBRARY_PATH', ''))
32
33 libs_exports = {
34 'QTDIR': QTDIR,
35 'PATH': PATH,
36 'MANPATH': MANPATH,
37 'LD_LIBRARY_PATH': LD_LIBRARY_PATH
38 }
39
40 os.environ.update(libs_exports)
4128
4229 USER_HOME = os.path.expanduser(CONST_USER_HOME)
4330 FARADAY_BASE = os.path.dirname(os.path.realpath(__file__))
31 QTDIR=os.path.join(FARADAY_BASE, 'external_libs', 'qt')
4432
4533 FARADAY_USER_HOME = os.path.expanduser(CONST_FARADAY_HOME_PATH)
4634 FARADAY_PLUGINS_PATH = os.path.join(FARADAY_USER_HOME,
7361 USER_QTRCBAK = os.path.expanduser(CONST_USER_QTRC_BACKUP)
7462 FARADAY_QTRC = os.path.join(FARADAY_BASE, CONST_FARADAY_QTRC_PATH)
7563 FARADAY_QTRCBAK = os.path.expanduser(CONST_FARADAY_QTRC_BACKUP)
64 CONST_VERSION_FILE = os.path.join(FARADAY_BASE,"VERSION")
7665
7766 def getParserArgs():
7867 """Parser setup for faraday launcher arguments.
132121
133122 parser.add_argument('--dev-mode', action="store_true", dest="dev_mode",
134123 default=False,
135 help="Enable dev mode. This will reset config and plugin folders.")
124 help="Enable dev mode. This will use the user config and plugin folder.")
136125
137126 parser.add_argument('--ignore-deps', action="store_true",
138127 dest="ignore_deps",
142131 parser.add_argument('--update', action="store_true", dest="update",
143132 default=False,
144133 help="Update Faraday IDE.")
134
135 parser.add_argument('--cert', action="store", dest="cert_path",
136 default=None,
137 help="Path to the valid CouchDB certificate")
145138
146139 parser_gui_ex.add_argument('--gui', action="store", dest="gui",
147140 default="qt3",
207200 modules = []
208201 f = open(CONST_REQUIREMENTS_FILE)
209202 for line in f:
210 if line.find('#'):
203 if not line.find('#'):
204 break
205 else:
211206 modules.append([line[:line.index('=')], (line[line.index('=')+2:]).strip()])
212207 f.close()
213208
209 pip_dist = [dist.project_name.lower() for dist in pip.get_installed_distributions()]
210
214211 for module in modules:
215 try:
216 __import__(module[0])
217 except ImportError:
218 if query_user_bool("Missing module %s." \
219 " Do you wish to install it?" % module[0]):
220 pip.main(['install', "%s==%s" %
221 (module[0], module[1]), '--user'])
222
223 else:
224 return False
212 if module[0].lower() not in pip_dist:
213 try:
214 __import__(module[0])
215 except ImportError:
216 if query_user_bool("Missing module %s." \
217 " Do you wish to install it?" % module[0]):
218 pip.main(['install', "%s==%s" %
219 (module[0], module[1]), '--user'])
220
221 else:
222 return False
225223
226224 return True
227225
276274
277275 logger.info("All done. Opening environment.")
278276 #TODO: Handle args in CONF and send only necessary ones.
277 # Force OSX to run no gui
278 if sys.platform == "darwin":
279 args.gui = "no-gui"
280
279281 main_app = MainApplication(args)
280282
281283 if not args.disable_excepthook:
299301 print(Fore.WHITE + Style.BRIGHT + \
300302 "\n*" + string.center("faraday ui is ready", 53 - 6) )
301303 print(Fore.WHITE + Style.BRIGHT + \
302 """Make sure you got couchdb up and running.\nIf couchdb is up, point your browser to: \n[%s]""" % url)
304 """Make sure you got couchdb up and running.\nIf couchdb is up, point your browser to: \n[%s]""" % url)
303305 else:
304306 print(Fore.WHITE + Style.BRIGHT + \
305 """Please config Couchdb for fancy HTML5 Dashboard""")
307 """Please config Couchdb for fancy HTML5 Dashboard""")
306308
307309 print(Fore.RESET + Back.RESET + Style.RESET_ALL)
308310
309311 exit_status = start()
310 restoreQtrc()
311312
312313 return exit_status
313314
325326
326327 """
327328
328 if not dev_mode and os.path.isdir(FARADAY_PLUGINS_PATH):
329 logger.info("Plugins already in place.")
330 else:
331 if dev_mode:
332 logger.warning("Running under plugin development mode!")
329 if dev_mode:
330 logger.warning("Running under plugin development mode!")
331 logger.warning("Using user plugins folder")
332 else:
333 if os.path.isdir(FARADAY_PLUGINS_PATH):
334 logger.info("Removing old plugins folder")
333335 shutil.rmtree(FARADAY_PLUGINS_PATH)
334336 else:
335 logger.warning("No plugins folder detected. Creating new one.")
337 logger.info("No plugins folder detected. Creating new one.")
336338
337339 shutil.copytree(FARADAY_PLUGINS_BASEPATH, FARADAY_PLUGINS_PATH)
338340
342344 Existing qtrc files will be backed up and faraday qtrc will be set.
343345
344346 """
345
346 if os.path.isfile(USER_QTRC):
347 shutil.copy2(USER_QTRC, USER_QTRCBAK)
348
349 if os.path.isfile(FARADAY_QTRCBAK):
350 shutil.copy(FARADAY_QTRCBAK, USER_QTRC)
351 else:
352 if not os.path.exists(USER_QT):
353 os.makedirs(USER_QT)
354 shutil.copy(FARADAY_QTRC, USER_QTRC)
355 shutil.copy(FARADAY_QTRC, FARADAY_QTRCBAK)
356
357 def restoreQtrc():
358 """Restores user qtrc.
359
360 After exiting faraday the original qtrc is restored.
361
362 """
363
364 logger.info("Restoring user Qt configuration.")
365 shutil.copy2(USER_QTRC, FARADAY_QTRCBAK)
366 if os.path.isfile(USER_QTRCBAK):
367 shutil.copy(USER_QTRCBAK, USER_QTRC)
368
347 from ctypes import cdll
348 try:
349 import qt
350 except:
351 try:
352 cdll.LoadLibrary(os.path.join(QTDIR, 'lib', 'libqt.so'))
353 cdll.LoadLibrary(os.path.join(QTDIR, 'lib', 'libqui.so'))
354 except:
355 pass
369356
370357 def setupZSH():
371358 """Cheks and handles Faraday's integration with ZSH.
378365 if os.path.isfile(USER_ZSHRC):
379366 shutil.copy(USER_ZSHRC, FARADAY_USER_ZSHRC)
380367 else:
381 subprocess.call(['touch', FARADAY_USER_ZSHRC])
382
383 subprocess.call(['sed', '-i', '1iZDOTDIR=$OLDZDOTDIR', FARADAY_USER_ZSHRC])
368 open(FARADAY_USER_ZSHRC, 'w').close()
369
370 with open(FARADAY_USER_ZSHRC, "r+") as f:
371 content = f.read()
372 f.seek(0, 0)
373 f.write('ZDOTDIR=$OLDZDOTDIR' + '\n' + content)
384374 with open(FARADAY_USER_ZSHRC, "a") as f:
385375 f.write("source %s" % FARADAY_BASE_ZSH)
386376 shutil.copy(FARADAY_BASE_ZSH, FARADAY_USER_ZSH_PATH)
421411 exit()
422412 elif sys.platform == "darwin":
423413 logger.info("OS X detected.")
424 helpers += "darwin"
414 helpers += ".darwin"
425415 else:
426416 logger.fatal("Plaftorm not supported yet.")
427417 exit()
512502 logger.info("Update process finished with no errors")
513503 logger.info("Faraday will start now.")
514504
515 def checkUpdates():
505 def checkUpdates():
516506 import requests
517 uri = getInstanceConfiguration().getUpdatesUri()
507 uri = getInstanceConfiguration().getUpdatesUri()
518508 resp = u"OK"
519509 try:
520 resp = requests.get(uri, timeout=1, verify=True)
510 f = open(CONST_VERSION_FILE)
511
512 getInstanceConfiguration().setVersion(f.read().strip())
513 getInstanceConfiguration().setAppname("Faraday - Penetration Test IDE Community")
514 parameter = {"version": getInstanceConfiguration().getVersion()}
515
516 f.close
517 resp = requests.get(uri, params=parameter, timeout=1, verify=True)
521518 resp = resp.text.strip()
522519 except Exception as e:
523520 logger.error(e)
527524 logger.info("No updates available, enjoy Faraday")
528525
529526
527 def checkCouchUrl():
528 import requests
529 try:
530 requests.get(getInstanceConfiguration().getCouchURI(), timeout=5)
531 except requests.exceptions.SSLError:
532 print """
533 SSL certificate validation failed.
534 You can use the --cert option in Faraday
535 to set the path of the cert
536 """
537 sys.exit(-1)
538 except Exception as e:
539 # Non fatal error
540 pass
541
542
530543 def init():
531544 """Initializes what is needed before starting.
532545
548561 """
549562
550563 init()
551 update()
552564 if checkDependencies():
553565 printBanner()
554566 logger.info("Dependencies met.")
567 if args.cert_path:
568 os.environ['REQUESTS_CA_BUNDLE'] = args.cert_path
555569 checkConfiguration()
556570 setConf()
571 checkCouchUrl()
572 setUpLogger()
573 update()
557574 checkUpdates()
558575 startFaraday()
559576 else:
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
633633 self.logolabel.setPixmap( self.logo )
634634 self.logolabel.setAlignment( qt.Qt.AlignHCenter | qt.Qt.AlignVCenter )
635635
636
637
638636 self._about_text = u"""%s v%s""" % (CONF.getAppname(),CONF.getVersion())
637 self._about_text += "\nInfobyte LLC. All rights reserved"
639638
640639 self.text = qt.QLabel( self._about_text, self )
641640 self.text.setAlignment( qt.Qt.AlignHCenter | qt.Qt.AlignVCenter )
658657
659658 hbox1 = qt.QHBox(self)
660659 hbox1.setSpacing(10)
661 self._repourl_label = qt.QLabel("CouchDB URL", hbox1)
660 self._repourl_label = qt.QLabel("CouchDB (http://127.0.0.1:5984)", hbox1)
662661 self._repourl_edit = qt.QLineEdit(hbox1)
663662 if url: self._repourl_edit.setText(url)
664663 self.layout.addWidget(hbox1)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
1919 from model.guiapi import notification_center as notifier
2020 from persistence.persistence_managers import CouchDbManager
2121 from model.guiapi import notification_center
22 from utils.common import checkSSL
2223
2324 import model.api
2425 import webbrowser
523524 service is available and that connection string is from
524525 the form: http[s]://hostname:port""")
525526 return
527 if repourl.startswith("https://"):
528 if not checkSSL(repourl):
529 self.showPopup(
530 """
531 SSL certificate validation failed.
532 You can use the --cert option in Faraday
533 to set the path of the cert
534 """)
535 return
526536
527537 CONF.setCouchUri(repourl)
528538 CONF.setCouchIsReplicated(isReplicated)
660670 """
661671 base_uri = str(CONF.getCouchURI())
662672 current_workspace = str(CONF.getLastWorkspace())
663 uri = base_uri + "/reports/_design/reports/index.html#"+current_workspace
673 uri = base_uri + "/reports/_design/reports/index.html#/dashboard/ws/"+current_workspace
664674 import requests
665675 try:
666676 response = requests.head(uri)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 # -*- coding: utf-8 -*-
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
238238 else:
239239 if len(selected_items) == 1:
240240 if item.is_active:
241 popup.insertItem('Close', 300)
241 popup.insertItem('No action available', 100)
242242 else:
243243 popup.insertItem('Open', lambda: self._openWorkspace(item))
244244 popup.insertItem('Delete', lambda: self._deleteWorkspace(item))
245245
246 popup.insertItem('Properties', lambda: self._showWorkspaceProperties(item))
246 # popup.insertItem('Properties', lambda: self._showWorkspaceProperties(item))
247247
248248 elif len(selected_items) > 1:
249249 popup.insertItem('Delete', lambda: self._deleteWorkspaces(selected_items))
00 #!/bin/bash
11 ###
2 ## Faraday Penetration Test IDE - Community Version
2 ## Faraday Penetration Test IDE
33 ## Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 ## See the file 'doc/LICENSE' for the license information
55 ###
1111 exit 1
1212 fi
1313
14 update=0
1415 #protection
1516 sha_kali_i686=f071539d8d64ad9b30c7214daf5b890a94b0e6d68f13bdcc34c2453c99afe9c4
1617 sha_kali_x86_64=02a050372fb30ede1454e1dd99d97e0fe0963ce2bd36c45efe90eec78df11d04
2425 kernel=$(uname -r)
2526 if [ -f /etc/lsb-release ]; then
2627 if [ ! -f /usr/bin/lsb_release ] ; then
27 apt-get -y install lsb-release
28 apt-get update
29 update=1
30 apt-get -y install lsb-release
2831 fi
2932 os=$(lsb_release -s -d)
3033 elif [ -f /etc/debian_version ]; then
4245 elif [[ "$os" =~ .*Kali.* ]]; then
4346 version="kali-$arch"
4447 down=1
45 elif [ "$os" = "Ubuntu 12.04.3 LTS" ]; then
48 elif [[ "$os" =~ "Ubuntu 12.04".* ]]; then
4649 version="ubuntu12-$arch"
4750 elif [ "$os" = "Ubuntu 13.10" ]; then
4851 version="ubuntu13-10-$arch"
5053 elif [ "$os" = "Ubuntu 13.04" ]; then
5154 version="ubuntu13-04-$arch"
5255 down=1
53 elif [[ "$os" =~ "Ubuntu 14.04".* ]]; then
56 elif [[ "$os" =~ "Ubuntu 14.04".*|"Ubuntu 14.10".*|"Ubuntu Vivid Vervet (development branch)"|"Debian 8.0".* ]]; then
5457 version="ubuntu13-10-$arch"
5558 down=1
5659 # Install pip from github.
5760 # Bug: https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1306991
5861 wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
5962 python get-pip.py
63 elif [[ "$os" =~ "Debian 7".* ]]; then
64 version="ubuntu13-10-$arch"
65 down=1
66 echo "deb http://ftp.debian.org/debian experimental main" >> /etc/apt/sources.list
67 echo "deb http://ftp.debian.org/debian sid main" >> /etc/apt/sources.list
68 apt-get update
69 apt-get -t experimental -y install libc6-dev
70 sed -i 's/deb http:\/\/ftp.debian.org\/debian experimental main//' /etc/apt/sources.list
71 sed -i 's/deb http:\/\/ftp.debian.org\/debian sid main//' /etc/apt/sources.list
72 apt-get update
6073 else
6174 echo "[-] Could not find a install for $os ($arch $kernel)"
6275 exit
7689 if [ -e lib-$version.tgz ]; then
7790 if [ "`echo ${!shav}`" = "`sha256sum lib-$version.tgz | awk -F\" \" \{'print $1'\}`" ]; then
7891 echo "[+] SHA256 ok"
79 tar -xvzf lib-$version.tgz
80
81 cp -R lib-$version/* /usr/local/
82 cp -R lib-$version/qt/lib/*so* /usr/local/lib
83
84 cat deps/qtvars >> /etc/profile
85 . /etc/profile
86 ldconfig
92 tar -xvzf lib-$version.tgz
93 mv lib-$version/ external_libs
8794 else
88 echo "[-] SHA256 file corrupt"
95 rm lib-$version.tgz
96 echo "[-] SHA256 file corrupt, deleted run again ./$0"
8997 exit
9098 fi
9199 else
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
04
5 '''
6
7
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
5353 """ Representation of the FS Views """
5454 def __init__(self):
5555 self.views_path = os.path.join(os.getcwd(), "views")
56 self.designs_path = os.path.join(self.views_path, "_design")
56 self.designs_path = os.path.join(self.views_path, "reports", "_attachments", "views")
5757
5858 def _listPath(self, path):
5959 flist = filter(lambda x: not x.startswith('.'), os.listdir(path))
155155 sys.path.append(module_path)
156156 module_filename = os.path.join(module_path, "plugin.py")
157157 self._plugin_modules[name] = imp.load_source(name, module_filename)
158 except Exception:
158 except Exception as e:
159159 msg = "An error ocurred while loading plugin %s.\n%s" % (module_filename, traceback.format_exc())
160 getLogger(self).error(msg)
160 getLogger(self).debug(msg)
161 getLogger(self).warn(e)
161162 else:
162163 pass
163164
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 # -*- coding: utf-8 -*-
11
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
192192 return "acunetix"
193193 elif "session" == tag:
194194 return "x1"
195 elif "landscapePolicy" == tag:
196 return "x1"
195197 elif "entities" == tag:
196198 return "impact"
197199 elif "NeXposeSimpleXML" == tag:
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
167167
168168 # Vulnerability
169169
170 def createAndAddVulnToHost(host_id, name, desc, ref, severity):
171 vuln = newVuln(name, desc, ref, severity, parent_id=host_id)
170 def createAndAddVulnToHost(host_id, name, desc, ref, severity, resolution):
171 vuln = newVuln(name, desc, ref, severity, resolution, parent_id=host_id)
172172 if addVulnToHost(host_id, vuln):
173173 return vuln.getID()
174174 return None
175175
176 def createAndAddVulnToInterface(host_id, interface_id, name, desc, ref, severity):
177 vuln = newVuln(name, desc, ref, severity, parent_id=interface_id)
176 def createAndAddVulnToInterface(host_id, interface_id, name, desc, ref, severity, resolution):
177 vuln = newVuln(name, desc, ref, severity, resolution, parent_id=interface_id)
178178 if addVulnToInterface(host_id, interface_id, vuln):
179179 return vuln.getID()
180180 return None
181181
182 def createAndAddVulnToApplication(host_id, application_id, name, desc, ref, severity):
183 vuln = newVuln(name, desc, ref, severity)
182 def createAndAddVulnToApplication(host_id, application_id, name, desc, ref, severity, resolution):
183 vuln = newVuln(name, desc, ref, severity, resolution)
184184 if addVulnToApplication(host_id, application_id, vuln):
185185 return vuln.getID()
186186 return None
187187
188 def createAndAddVulnToService(host_id, service_id, name, desc, ref, severity):
188 def createAndAddVulnToService(host_id, service_id, name, desc, ref, severity, resolution):
189189 #we should give the interface_id or de application_id too? I think we should...
190 vuln = newVuln(name, desc, ref, severity, parent_id=service_id)
190 vuln = newVuln(name, desc, ref, severity, resolution, parent_id=service_id)
191191 if addVulnToService(host_id, service_id, vuln):
192192 return vuln.getID()
193193 return None
194194
195195 #WebVuln
196196
197 def createAndAddVulnWebToService(host_id, service_id, name, desc, ref, severity, website, path, request, response,
197 def createAndAddVulnWebToService(host_id, service_id, name, desc, ref, severity, resolution, website, path, request, response,
198198 method,pname, params,query,category):
199199 #we should give the interface_id or de application_id too? I think we should...
200 vuln = newVulnWeb(name, desc, ref, severity, website, path, request, response,
201 method,pname, params,query,category, parent_id=service_id)
200 vuln = newVulnWeb(name, desc, ref, severity, resolution, website, path, request, response,
201 method,pname, params, query, category, parent_id=service_id)
202202 if addVulnWebToService(host_id, service_id, vuln):
203203 return vuln.getID()
204204 return None
238238 def createAndAddCredToService(host_id, service_id, username, password):
239239 cred = newCred(username, password, parent_id=service_id)
240240 if addCredToService(host_id, service_id, cred):
241 return note.getID()
241 return cred.getID()
242242 return None
243243
244244 #-------------------------------------------------------------------------------
462462 name, protocol, ports, status, version, description, parent_id)
463463
464464
465 def newVuln(name, desc="", ref = None, severity="", parent_id=None):
465 def newVuln(name, desc="", ref = None, severity="", resolution="", parent_id=None):
466466 """
467467 It creates and returns a Vulnerability object.
468468 The created object is not added to the model.
469469 """
470470 return __model_controller.newVuln(
471 name, desc, ref, severity, parent_id)
472
473
474 def newVulnWeb(name, desc="", ref = None, severity="", website="", path="", request="", response="",
471 name, desc, ref, severity, resolution, parent_id)
472
473
474 def newVulnWeb(name, desc="", ref = None, severity="", resolution="", website="", path="", request="", response="",
475475 method="",pname="", params="",query="",category="", parent_id=None):
476476 """
477477 It creates and returns a Vulnerability object.
478478 The created object is not added to the model.
479479 """
480480 return __model_controller.newVulnWeb(
481 name, desc, ref, severity, website, path, request, response,
481 name, desc, ref, severity, resolution, website, path, request, response,
482482 method, pname, params, query, category, parent_id)
483483
484484
648648 """
649649 If DEBUG is set it will print information directly to stdout
650650 """
651 import logging
651652 if CONF.getDebugStatus():
652 print "[DEBUG] - %s" % msg
653 model.log.getLogger().log(msg,"DEBUG")
653 logging.getLogger('faraday.model.api').debug(msg)
654 model.log.getLogger().log(msg, "DEBUG")
654655
655656 def showDialog(msg, level="Information"):
656657 return model.log.getNotifier().showDialog(msg, level)
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
131131 restapi.startAPIs(
132132 self._plugin_manager,
133133 self._model_controller,
134 self._mappers_manager)
134 self._mappers_manager,
135 CONF.getApiConInfoHost(),
136 CONF.getApiRestfulConInfoPort())
135137 # Start report manager here
136138 getLogger(self).debug("Starting Reports Manager Thread")
137139 self._reports_manager.startWatch()
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
858858 """
859859 class_signature = "Vulnerability"
860860
861 def __init__(self, name="",desc="", ref=None, severity="", parent_id=None):
861 def __init__(self, name="",desc="", ref=None, severity="", resolution="", parent_id=None):
862862 """
863863 The parameters refs can be a single value or a list with values
864864 """
876876
877877 # Severity Standarization
878878 self.severity = self.standarize(severity)
879 self.resolution = resolution
879880
880881 def standarize(self, severity):
881882 # Transform all severities into lower strings
914915
915916 #@save
916917 @updateLocalMetadata
917 def updateAttributes(self, name=None, desc=None, severity=None, refs=None):
918 def updateAttributes(self, name=None, desc=None, severity=None, resolution=None, refs=None):
918919 if name is not None:
919920 self.setName(name)
920921 if desc is not None:
921922 self.setDescription(desc)
923 if resolution is not None:
924 self.setResolution(resolution)
922925 if severity is not None:
923926 self.severity = self.standarize(severity)
924927 if refs is not None:
935938
936939 def getDesc(self):
937940 return self._desc
941
942 def getDescription(self):
943 return self.getDesc()
944
945 def setDescription(self, desc):
946 self.setDesc(desc)
947
948 def setResolution(self, resolution):
949 self.resolution = resolution
950
951 def getResolution(self):
952 return self.resolution
938953
939954 def getSeverity(self):
940955 return self.severity
976991 """
977992 class_signature = "VulnerabilityWeb"
978993
979 def __init__(self, name="",desc="", website="", path="", ref=None, severity="", request="", response="",
994 def __init__(self, name="",desc="", website="", path="", ref=None, severity="", resolution="", request="", response="",
980995 method="",pname="", params="",query="",category="", parent_id=None):
981996 """
982997 The parameters ref can be a single value or a list with values
983998 """
984 ModelObjectVuln.__init__(self, name,desc, ref, severity, parent_id)
999 ModelObjectVuln.__init__(self, name,desc, ref, severity, resolution, parent_id)
9851000 self.path = path
9861001 self.website = website
9871002 self.request = request
10521067
10531068 #@save
10541069 @updateLocalMetadata
1055 def updateAttributes(self, name=None, desc=None, website=None, path=None, refs=None, severity=None, request=None,
1056 response=None, method=None, pname=None, params=None, query=None, category=None):
1057 super(ModelObjectVulnWeb, self).updateAttributes(name, desc, severity, refs)
1070 def updateAttributes(self, name=None, desc=None, website=None, path=None, refs=None,
1071 severity=None, resolution=None, request=None,response=None, method=None,
1072 pname=None, params=None, query=None, category=None):
1073 super(ModelObjectVulnWeb, self).updateAttributes(name, desc, severity, resolution, refs)
10581074 if website is not None:
10591075 self.website = website
10601076 if path is not None:
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
700700 self._processAction(modelactions.DELVULN, [vuln_id], sync=True)
701701
702702
703 def editVulnSYNC(self, vuln, name, desc, severity, refs):
704 self._processAction(modelactions.EDITVULN, [vuln, name, desc, severity, refs], sync=True)
705
706 def editVulnASYNC(self, vuln, name, desc, severity, refs):
707 self.__addPendingAction(modelactions.EDITVULN, vuln, name, desc, severity, refs)
708
709 def editVulnWebSYNC(self, vuln, name, desc, website, path, refs, severity,
703 def editVulnSYNC(self, vuln, name, desc, severity, resolution, refs):
704 self._processAction(modelactions.EDITVULN, [vuln, name, desc, severity, resolution, refs], sync=True)
705
706 def editVulnASYNC(self, vuln, name, desc, severity, resolution, refs):
707 self.__addPendingAction(modelactions.EDITVULN, vuln, name, desc, severity, resolution, refs)
708
709 def editVulnWebSYNC(self, vuln, name, desc, website, path, refs, severity, resolution,
710710 request, response, method, pname, params, query,
711711 category):
712712 self._processAction(modelactions.EDITVULN,
713 [vuln, name, desc, website, path, refs, severity,
714 request, response, method, pname, params, query,
715 category], sync=True)
713 [vuln, name, desc, website, path, refs, severity, resolution,
714 request, response, method, pname, params, query, category], sync=True)
716715
717716 def editVulnWebASYNC(self, vuln, name, desc, website, path, refs,
718 severity, request, response, method, pname,
717 severity, resolution, request, response, method, pname,
719718 params, query, category):
720719 self.__addPendingAction(modelactions.EDITVULN,
721720 vuln, name, desc, website, path, refs,
722 severity, request, response, method,
721 severity, resolution, request, response, method,
723722 pname, params, query, category)
724723
725724 # Note
843842 name, protocol=protocol, ports=ports, status=status,
844843 version=version, description=description, parent_id=parent_id)
845844
846 def newVuln(self, name, desc="", ref=None, severity="", parent_id=None):
845 def newVuln(self, name, desc="", ref=None, severity="", resolution="", parent_id=None):
847846 return model.common.factory.createModelObject(
848847 model.common.ModelObjectVuln.class_signature,
849 name, desc=desc, ref=ref, severity=severity, parent_id=parent_id)
850
851 def newVulnWeb(self, name, desc="", ref=None, severity="", website="",
848 name, desc=desc, ref=ref, severity=severity, resolution=resolution, parent_id=parent_id)
849
850 def newVulnWeb(self, name, desc="", ref=None, severity="", resolution="", website="",
852851 path="", request="", response="", method="", pname="",
853852 params="", query="", category="", parent_id=None):
854853 return model.common.factory.createModelObject(
855854 model.common.ModelObjectVulnWeb.class_signature,
856 name, desc=desc, ref=ref, severity=severity,
855 name, desc=desc, ref=ref, severity=severity, resolution=resolution,
857856 website=website, path=path, request=request, response=response,
858857 method=method, pname=pname, params=params, query=query,
859858 category=category, parent_id=parent_id)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
9191 return None
9292
9393
94 def createAndAddVulnToHost(host_id, name, desc, ref, severity="0"):
95 vuln = model.api.newVuln(name, desc, ref, severity, parent_id=host_id)
94 def createAndAddVulnToHost(host_id, name, desc, ref, severity="0", resolution=""):
95 vuln = model.api.newVuln(name, desc, ref, severity, resolution, parent_id=host_id)
9696 if addVulnToHost(host_id, vuln):
9797 return vuln.getID()
9898 return None
9999
100100
101 def createAndAddVulnToInterface(host_id, interface_id, name, desc, ref, severity="0"):
102 vuln = model.api.newVuln(name, desc, ref, severity, parent_id=interface_id)
101 def createAndAddVulnToInterface(host_id, interface_id, name, desc, ref, severity="0", resolution=""):
102 vuln = model.api.newVuln(name, desc, ref, severity, resolution, parent_id=interface_id)
103103 if addVulnToInterface(host_id, interface_id, vuln):
104104 return vuln.getID()
105105 return None
106106
107107
108 def createAndAddVulnToService(host_id, service_id, name, desc, ref, severity="0"):
109 vuln = model.api.newVuln(name, desc, ref, severity, parent_id=service_id)
108 def createAndAddVulnToService(host_id, service_id, name, desc, ref, severity="0", resolution=""):
109 vuln = model.api.newVuln(name, desc, ref, severity, resolution, parent_id=service_id)
110110 if addVulnToService(host_id, service_id, vuln):
111111 return vuln.getID()
112112 return None
113113
114114
115 def createAndAddVulnWebToService(host_id, service_id, name, desc, website, path, ref=None, severity="0", request=None, response=None,
116 method=None,pname=None, params=None,query=None,category=None):
117 vuln = model.api.newVulnWeb(name, desc, website, path, ref, severity, request, response,
118 method,pname, params,query,category, parent_id=service_id)
115 def createAndAddVulnWebToService(host_id, service_id, name, desc, website, path, ref=None,
116 severity="0", resolution="", request=None, response=None,
117 method=None,pname=None, params=None,query=None,category=None):
118 vuln = model.api.newVulnWeb(name, desc, website, path, ref, severity, resolution, request, response,
119 method, pname, params, query, category, parent_id=service_id)
119120 if addVulnToService(host_id, service_id, vuln):
120121 return vuln.getID()
121122 return None
122123
123124
124 def createAndAddVuln(model_object, name, desc, ref=None, severity="0"):
125 vuln = model.api.newVuln(name, desc, ref, severity, parent_id=model_object.getID())
125 def createAndAddVuln(model_object, name, desc, ref=None, severity="0", resolution=""):
126 vuln = model.api.newVuln(name, desc, ref, severity, resolution, parent_id=model_object.getID())
126127 if addVuln(model_object.getID(), vuln):
127128 return vuln.getID()
128129 return None
129130
130131
131 def createAndAddVulnWeb(model_object, name, desc, website, path, ref=None, severity="0", request=None, response=None,
132 method=None,pname=None, params=None,query=None,category=None):
133 vuln = model.api.newVulnWeb(name, desc, ref, severity, website, path, request, response,
132 def createAndAddVulnWeb(model_object, name, desc, website, path, ref=None, severity="0", resolution="",
133 request=None, response=None, method=None, pname=None, params=None, query=None,
134 category=None):
135 vuln = model.api.newVulnWeb(name, desc, ref, severity, resolution, website, path, request, response,
134136 method, pname, params, query, category, parent_id=model_object.getID())
135137 if addVuln(model_object.getID(), vuln):
136138 return vuln.getID()
410412 __model_controller.editNoteSYNC(note, name, text)
411413 return True
412414
413 def editVuln(vuln, name=None, desc=None, severity=None, refs=None):
414 __model_controller.editVulnSYNC(vuln, name, desc, severity, refs)
415 return True
416
417 def editVulnWeb(vuln, name=None, desc=None, website=None, path=None, refs=None, severity=None, request=None, response=None,
418 method=None,pname=None, params=None,query=None,category=None):
419 __model_controller.editVulnWebSYNC(vuln, name, desc, website, path, refs, severity, request, response,
420 method,pname, params,query,category)
415 def editVuln(vuln, name=None, desc=None, severity=None, resolution=None, refs=None):
416 __model_controller.editVulnSYNC(vuln, name, desc, severity, resolution, refs)
417 return True
418
419 def editVulnWeb(vuln, name=None, desc=None, website=None, path=None, refs=None, severity=None, resolution=None,
420 request=None, response=None, method=None, pname=None, params=None, query=None, category=None):
421 __model_controller.editVulnWebSYNC(vuln, name, desc, website, path, refs, severity, resolution,
422 request, response, method, pname, params, query, category)
421423 return True
422424
423425 def editCred(cred, username=None, password=None):
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
2323
2424 def __init__(self, name, desc=None, manager=None, shared=CONF.getAutoShareWorkspace()):
2525 self.name = name
26 self.description = ""
26 self.description = desc
2727 self.customer = ""
28 self.start_date = time.time()
29 self.finish_date = time.time()
28 self.start_date = int(time.time() * 1000)
29 self.finish_date = int(time.time() * 1000)
3030 self._id = name
3131 self._command_history = None
3232 self.shared = shared
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
223223 doc.update({
224224 "desc": vuln.getDesc(),
225225 "severity": vuln.getSeverity(),
226 "resolution": vuln.getResolution(),
226227 "refs": vuln.getRefs(),
227228 "data": vuln.getData()
228229 })
231232 def unserialize(self, vuln, doc):
232233 vuln.setDesc(doc.get("desc"))
233234 vuln.setSeverity(doc.get("severity"))
235 vuln.setResolution(doc.get("resolution"))
234236 vuln.setRefs(doc.get("refs"))
235237 vuln.setData(doc.get("data", ""))
236238 super(VulnMapper, self).unserialize(vuln, doc)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
4848 def __init__(self):
4949 self.load()
5050
51 def load(self):
51 def load(self):
5252 self.couchmanager = CouchDbManager(CONF.getCouchURI())
5353 self.fsmanager = FileSystemManager()
5454 self.managers = {
55 DBTYPE.COUCHDB: self.couchmanager,
55 DBTYPE.COUCHDB: self.couchmanager,
5656 DBTYPE.FS: self.fsmanager
5757 }
5858 self.dbs = {}
6060
6161 def getAvailableDBs(self):
6262 return [typ for typ, manag in self.managers.items()\
63 if manag.isAvailable()]
63 if manag.isAvailable()]
6464
6565 def _loadDbs(self):
6666 self.dbs = {}
118118 return self.dbs.get(dbname).getType()
119119
120120 def reloadConfig(self):
121 self.load()
121 self.load()
122122
123123 class DbConnector(object):
124124 def __init__(self, type=None):
287287 return res
288288
289289 def forceUpdate(self):
290 doc = self.getDocument(self.db.dbname)
290 doc = self.getDocument(self.db.dbname)
291291 return self.db.save_doc(doc, use_uuids=True, force_update=True)
292292
293293 #@trap_timeout
383383 class AbstractPersistenceManager(object):
384384 def __init__(self):
385385 self.dbs = {}
386
386
387387 def createDb(self, name):
388388 if not self.getDb(name):
389389 self.dbs[name] = self._create(name)
532532 def _loadDb(self, dbname):
533533 db = self.__serv.get_db(dbname)
534534 seq = db.info()['update_seq']
535 self.dbs[dbname] = CouchDbConnector(db, seq_num=seq)
535 self.dbs[dbname] = CouchDbConnector(db, seq_num=seq)
536536 return self.dbs[dbname]
537537
538538
607607 raise e
608608 except Exception as e:
609609 getLogger(self).error(e)
610 raise
610 raise
611611
612612 def __peerReplication(self, workspace, src, dst, **kwargs):
613613 mutual = kwargs.get("mutual", True)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
406406 self._mapper_manager.save(cmd_info)
407407
408408 if self._active_plugin.has_custom_output():
409 if not os.path.isfile(self._active_plugin.get_custom_file_path()):
410 model.api.devlog("PluginController output file (%s) not created" % self._active_plugin.get_custom_file_path())
411 return False
409412 output_file = open(self._active_plugin.get_custom_file_path(), 'r')
410413 output = output_file.read()
411414 self._buffer.seek(0)
647650 name=name, protocol=protocol, ports=ports,
648651 status=status, version=version, description=description, parent_id=interface_id)
649652
650 def createAndAddVulnToHost(self, host_id, name, desc="", ref=[], severity=""):
651 self.__addPendingAction(modelactions.CADDVULNHOST, host_id, name, desc, ref, severity)
653 def createAndAddVulnToHost(self, host_id, name, desc="", ref=[], severity="", resolution=""):
654 self.__addPendingAction(modelactions.CADDVULNHOST, host_id, name, desc, ref, severity, resolution)
652655 return factory.generateID(
653656 ModelObjectVuln.class_signature,
654657 name=name, desc=desc, ref=ref, severity=severity,
655 parent_id=host_id)
656
657 def createAndAddVulnToInterface(self, host_id, interface_id, name, desc="", ref=[], severity=""):
658 self.__addPendingAction(modelactions.CADDVULNINT, host_id, interface_id, name, desc, ref, severity)
658 resolution=resolution, parent_id=host_id)
659
660 def createAndAddVulnToInterface(self, host_id, interface_id, name, desc="", ref=[], severity="", resolution=""):
661 self.__addPendingAction(modelactions.CADDVULNINT, host_id, interface_id, name, desc, ref, severity, resolution)
659662 return factory.generateID(
660663 ModelObjectVuln.class_signature,
661664 name=name, desc=desc, ref=ref, severity=severity,
662 parent_id=interface_id)
663
664 def createAndAddVulnToService(self, host_id, service_id, name, desc="", ref=[], severity=""):
665 self.__addPendingAction(modelactions.CADDVULNSRV, host_id, service_id, name, desc, ref, severity)
665 resolution=resolution, parent_id=interface_id)
666
667 def createAndAddVulnToService(self, host_id, service_id, name, desc="", ref=[], severity="", resolution=""):
668 self.__addPendingAction(modelactions.CADDVULNSRV, host_id, service_id, name, desc, ref, severity, resolution)
666669 return factory.generateID(
667670 ModelObjectVuln.class_signature,
668671 name=name, desc=desc, ref=ref, severity=severity,
669 parent_id=service_id)
670
671 def createAndAddVulnWebToService(self, host_id, service_id, name, desc="", ref=[], severity="", website="", path="", request="",
672 response="",method="",pname="", params="",query="",category=""):
673 self.__addPendingAction(modelactions.CADDVULNWEBSRV, host_id, service_id, name, desc, ref, severity, website, path, request, response,
674 method,pname, params,query,category)
672 resolution=resolution, parent_id=service_id)
673
674 def createAndAddVulnWebToService(self, host_id, service_id, name, desc="", ref=[],
675 severity="", resolution="", website="", path="", request="",
676 response="",method="",pname="", params="",query="",category=""):
677 self.__addPendingAction(modelactions.CADDVULNWEBSRV, host_id, service_id, name, desc, ref,
678 severity, resolution, website, path, request, response,
679 method, pname, params, query,category)
675680 return factory.generateID(
676681 ModelObjectVulnWeb.class_signature,
677 name=name, desc=desc, ref=ref, severity=severity,
682 name=name, desc=desc, ref=ref, severity=severity, resolution=resolution,
678683 website=website, path=path, request=request, response=response,
679684 method=method, pname=pname, params=params, query=query,
680685 category=category, parent_id=service_id)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77 '''
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
0 #!/usr/bin/ruby
1 ###
2 ## Faraday Penetration Test IDE - Community Version
3 ## Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
4 ## See the file 'doc/LICENSE' for the license information
5 ###
6 #__author__ = "Francisco Amato"
7 #__copyright__ = "Copyright (c) 2014, Infobyte LLC"
8 #__credits__ = ["Francisco Amato"]
9 #__version__ = "1.1.0"
10 #__maintainer__ = "Francisco Amato"
11 #__email__ = "[email protected]"
12 #__status__ = "Development"
13
14 require 'java'
15 require "xmlrpc/client"
16 require "pp"
17
18
19
20 #FARADAY CONF:
21 RPCSERVER="http://127.0.0.1:9876/"
22 IMPORTVULN=0 #1 if you like to import the current vulnerabilities, or 0 if you only want to import new vulns
23 PLUGINVERSION="Faraday v1.1 Ruby"
24 #Tested: Burp Professional v1.5.18
25
26 XMLRPC::Config.module_eval do
27 remove_const :ENABLE_NIL_PARSER
28 const_set :ENABLE_NIL_PARSER, true
29 end
30 java_import 'burp.IBurpExtender'
31 java_import 'burp.ITab'
32 java_import 'burp.IHttpListener'
33 java_import 'burp.IProxyListener'
34 java_import 'burp.IScannerListener'
35 java_import 'burp.IExtensionStateListener'
36 java_import 'burp.IExtensionHelpers'
37 java_import 'burp.IContextMenuFactory'
38 java_import 'java.net.InetAddress'
39 java_import 'javax.swing.JMenuItem'
40 java_import 'javax.swing.JCheckBox'
41 java_import 'javax.swing.JPanel'
42 java_import 'javax.swing.GroupLayout'
43
44 class BurpExtender
45 include IBurpExtender, IHttpListener, IProxyListener, IScannerListener, IExtensionStateListener,IContextMenuFactory, ITab
46
47 #
48 # implement IBurpExtender
49 #
50
51 def registerExtenderCallbacks(callbacks)
52
53 # keep a reference to our callbacks object
54 @callbacks = callbacks
55
56 #Connect Rpc server
57 @server = XMLRPC::Client.new2(RPCSERVER)
58 @helpers = callbacks.getHelpers()
59
60 # set our extension name
61 callbacks.setExtensionName(PLUGINVERSION)
62
63 @checkbox = javax.swing.JCheckBox.new("test")
64 @tab = javax.swing.JPanel.new()
65
66 @layout = javax.swing.GroupLayout.new(@tab)
67 @tab.setLayout(@layout)
68 @layout.setAutoCreateGaps(true)
69 @layout.setAutoCreateContainerGaps(true)
70 @layout.setHorizontalGroup(
71 @layout.createSequentialGroup()
72 .addGroup(@layout.createParallelGroup()
73 .addComponent(@checkbox)
74 )
75 )
76 @layout.setVerticalGroup(
77 @layout.createSequentialGroup()
78 .addGroup(@layout.createParallelGroup()
79 .addComponent(@checkbox)
80 )
81 )
82
83 callbacks.addSuiteTab(self)
84
85 # obtain our output stream
86 @stdout = java.io.PrintWriter.new(callbacks.getStdout(), true)
87
88 # Get current vulnerabilities
89 if IMPORTVULN == 1
90 param = @server.call("devlog", "[BURP] Importing issues")
91 callbacks.getScanIssues(nil).each do |issue|
92 newScanIssue(issue)
93 end
94 end
95
96 # Register a factory for custom context menu items
97 callbacks.registerContextMenuFactory(self)
98
99 # register ourselves as a Scanner listener
100 callbacks.registerScannerListener(self)
101
102 # register ourselves as an extension state listener
103 callbacks.registerExtensionStateListener(self)
104
105 end
106
107
108 #
109 # implement menu
110 #
111
112 # Create a menu item if the appropriate section of the UI is selected
113 def createMenuItems(invocation)
114
115 menu = []
116
117 # Which part of the interface the user selects
118 ctx = invocation.getInvocationContext()
119
120 # Sitemap history, Proxy History will show menu item if selected by the user
121 @stdout.println('Menu TYPE: %s\n' % ctx)
122 if ctx == 5 or ctx == 6 or ctx == 7
123
124 faradayMenu = JMenuItem.new("Send to Faraday", nil)
125
126 faradayMenu.addActionListener do |e|
127 eventScan(invocation, ctx)
128 end
129
130 menu.push(faradayMenu)
131 end
132
133 return menu
134 end
135
136 #
137 # event click function
138 #
139 def eventScan(invocation, ctx)
140
141 #invMessage = invocation.getSelectedIssues()
142
143 invMessage = invocation.getSelectedMessages()
144 invMessage.each do |m|
145 newScanIssue(m,ctx)
146 end
147 end
148
149 #
150 # implement IScannerListener
151 #
152 def newScanIssue(issue, ctx)
153
154 host=issue.getHost()
155 port=issue.getPort().to_s()
156 url = issue.getUrl()
157 ip=InetAddress.getByName(issue.getHttpService().getHost()).getHostAddress()
158
159 issuename="Analyzing: "
160 severity="Information"
161 desc="This request was manually sent using burp"
162
163 if ctx == 5 or ctx == 6 or ctx == 7
164 desc=issue.getIssueDetail().to_s
165 desc+="<br/>Resolution:" + issue.getIssueBackground().to_s
166 severity=issue.getSeverity().to_s
167 issuename=issue.getIssueName().to_s
168 end
169
170 @stdout.println("New scan issue host: " +host +",name:"+ issuename +",IP:" + ip)
171
172 begin
173 param = @server.call("devlog", "[BURP] New issue generation")
174
175 h_id = @server.call("createAndAddHost",ip, "unknown")
176 i_id = @server.call("createAndAddInterface",h_id, ip,"00:00:00:00:00:00", ip, "0.0.0.0", "0.0.0.0",[],
177 "0000:0000:0000:0000:0000:0000:0000:0000","00","0000:0000:0000:0000:0000:0000:0000:0000",
178 [],"",host)
179
180 s_id = @server.call("createAndAddServiceToInterface",h_id, i_id, issue.getProtocol(),"tcp",[port],"open")
181
182 #Save website
183 n_id = @server.call("createAndAddNoteToService",h_id,s_id,"website","")
184 n2_id = @server.call("createAndAddNoteToNote",h_id,s_id,n_id,host,"")
185
186 if ctx == 5 or ctx == 6 or ctx == 7
187 #@stdout.println(issue.methods)
188 req= @helpers.analyzeRequest(issue.getRequest())
189
190 #TODO: Actually Get all parameters, cookies, jason, url, maybe we should get only url,get/post parameters
191 #TODO: We don't send response because queue bug in faraday.
192 param=""
193 req.getParameters().each { |p| param += "%s" % p.getType() +":"+p.getName()+"="+p.getValue()+","}
194
195 issuename+= "("+issue.getUrl().getPath()[0,20]+")"
196 v_id = @server.call("createAndAddVulnWebToService",h_id, s_id, issuename,
197 desc,[],severity,host,issue.getUrl().to_s,issue.getRequest().to_s,
198 "response",req.getMethod().to_s,"",param,"","")
199 else
200 unless issue.getHttpMessages().nil? #issues with request #IHttpRequestResponse
201 @stdout.println("[**] issue host: " +host +",name:"+ issuename +",IP:" + ip)
202 c=0
203 issue.getHttpMessages().each do |m|
204 req= @helpers.analyzeRequest(m.getRequest())
205
206 #TODO: Actually Get all parameters, cookies, jason, url, maybe we should get only url,get/post parameters
207 param=""
208 req.getParameters().each { |p| param += "%s" % p.getType() +":"+p.getName()+"="+p.getValue()+","}
209
210 v_id = @server.call("createAndAddVulnWebToService",h_id, s_id, issuename,
211 desc,[],severity,host,m.getUrl().to_s,m.getRequest().to_s,
212 "response",req.getMethod().to_s,"",param,"","")
213 c=c+1
214 end
215 if c==0
216 v_id = @server.call("createAndAddVulnWebToService",h_id, s_id, issuename.to_s,
217 desc,[],severity,host,issue.getUrl().to_s,"",
218 "response","","","/","","")
219
220 end
221 end
222 end
223
224 rescue XMLRPC::FaultException => e
225 puts "-----\nError:"
226 puts e.faultCode
227 puts e.faultString
228 end
229 end
230
231 def extensionUnloaded()
232
233 end
234
235 def getTabCaption()
236 return "Faraday"
237 end
238
239 def getUiComponent()
240 return @tab
241 end
242
243 end
0 #!/usr/bin/ruby
1 ###
2 ## Faraday Penetration Test IDE
3 ## Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
4 ## See the file 'doc/LICENSE' for the license information
5 ###
6 #__author__ = "Francisco Amato"
7 #__copyright__ = "Copyright (c) 2014, Infobyte LLC"
8 #__credits__ = ["Francisco Amato"]
9 #__version__ = "1.2.0"
10 #__maintainer__ = "Francisco Amato"
11 #__email__ = "[email protected]"
12 #__status__ = "Development"
13
14 require 'java'
15 require "xmlrpc/client"
16 require "pp"
17
18
19 PLUGINVERSION="Faraday v1.2 Ruby"
20 #Tested: Burp Professional v1.6.09
21
22 XMLRPC::Config.module_eval do
23 remove_const :ENABLE_NIL_PARSER
24 const_set :ENABLE_NIL_PARSER, true
25 end
26 java_import 'burp.IBurpExtender'
27 java_import 'burp.ITab'
28 java_import 'burp.IHttpListener'
29 java_import 'burp.IProxyListener'
30 java_import 'burp.IScannerListener'
31 java_import 'burp.IExtensionStateListener'
32 java_import 'burp.IExtensionHelpers'
33 java_import 'burp.IContextMenuFactory'
34 java_import 'java.net.InetAddress'
35 java_import 'javax.swing.JMenuItem'
36 java_import 'javax.swing.JCheckBox'
37 java_import 'javax.swing.JPanel'
38 java_import 'javax.swing.GroupLayout'
39 java_import 'javax.swing.event.DocumentListener'
40
41 class SimpleDocumentListener
42
43 # This is how we declare that this class implements the Java
44 # DocumentListener interface in JRuby:
45 include DocumentListener
46
47 attr_accessor :behavior
48
49 def initialize(&behavior)
50 self.behavior = behavior
51 end
52
53 def changedUpdate(event); behavior.call event; end
54 def insertUpdate(event); behavior.call event; end
55 def removeUpdate(event); behavior.call event; end
56
57 end
58
59
60 class BurpExtender
61 include IBurpExtender, IHttpListener, IProxyListener, IScannerListener, IExtensionStateListener,IContextMenuFactory, ITab
62
63 #
64 # implement IBurpExtender
65 #
66
67 def registerExtenderCallbacks(callbacks)
68
69 # keep a reference to our callbacks object
70 @callbacks = callbacks
71
72 # set our extension name
73 callbacks.setExtensionName(PLUGINVERSION)
74
75 # obtain our output stream
76 @stdout = java.io.PrintWriter.new(callbacks.getStdout(), true)
77
78 # create the tab
79
80 @import_current_vulns = javax.swing.JButton.new("Import current vulnerabilities")
81 @import_new_vulns = javax.swing.JCheckBox.new("Import new vulnerabilities")
82 @rpc_server_label = javax.swing.JLabel.new("Faraday RPC server:")
83 @rpc_server = javax.swing.JTextField.new()
84 @rpc_server_label.setLabelFor(@rpc_server)
85 @restore_btn = javax.swing.JButton.new("Restore configuration")
86 @save_btn = javax.swing.JButton.new("Save configuration")
87
88 @rpc_server.getDocument.addDocumentListener(
89 SimpleDocumentListener.new do
90 @server = XMLRPC::Client.new2(@rpc_server.getText())
91 end)
92
93 @restore_btn.addActionListener do |e|
94 restoreConfig()
95 end
96 @save_btn.addActionListener do |e|
97 saveConfig()
98 end
99 @import_current_vulns.addActionListener do |e|
100 importVulns()
101 end
102
103 restoreConfig()
104
105 @tab = javax.swing.JPanel.new()
106
107 @layout = javax.swing.GroupLayout.new(@tab)
108 @tab.setLayout(@layout)
109 @layout.setAutoCreateGaps(true)
110 @layout.setAutoCreateContainerGaps(true)
111 @layout.setHorizontalGroup(
112 @layout.createParallelGroup()
113 .addComponent(@import_current_vulns)
114 .addComponent(@import_new_vulns)
115 .addComponent(@rpc_server_label)
116 .addComponent(@rpc_server)
117 .addComponent(@restore_btn)
118 .addComponent(@save_btn)
119 )
120 @layout.setVerticalGroup(
121 @layout.createSequentialGroup()
122 .addComponent(@import_current_vulns)
123 .addComponent(@import_new_vulns)
124 .addComponent(@rpc_server_label)
125 .addComponent(@rpc_server)
126 .addComponent(@restore_btn)
127 .addComponent(@save_btn)
128 )
129 @layout.linkSize(javax.swing.SwingConstants.VERTICAL, @import_new_vulns, @rpc_server)
130
131 callbacks.addSuiteTab(self)
132
133 @helpers = callbacks.getHelpers()
134
135 @stdout.println(PLUGINVERSION + " Loaded.")
136 @stdout.println("RPCServer: " + @rpc_server.getText())
137 @stdout.println("Import new vulnerabilities detected: " + boolString(@callbacks.loadExtensionSetting("import_new_vulns")))
138 @stdout.println("------")
139
140 # Register a factory for custom context menu items
141 callbacks.registerContextMenuFactory(self)
142
143 # register ourselves as a Scanner listener
144 callbacks.registerScannerListener(self)
145
146 # register ourselves as an extension state listener
147 callbacks.registerExtensionStateListener(self)
148
149 end
150
151
152 #
153 # implement menu
154 #
155
156 # Create a menu item if the appropriate section of the UI is selected
157 def createMenuItems(invocation)
158
159 menu = []
160
161 # Which part of the interface the user selects
162 ctx = invocation.getInvocationContext()
163
164 # Sitemap history, Proxy History, Request views, and Scanner will show menu item if selected by the user
165 #@stdout.println('Menu TYPE: %s\n' % ctx)
166 if ctx == 5 or ctx == 6 or ctx == 2 or ctx == 7
167
168 faradayMenu = JMenuItem.new("Send to Faraday", nil)
169
170 faradayMenu.addActionListener do |e|
171 eventScan(invocation, ctx)
172 end
173
174 menu.push(faradayMenu)
175 end
176
177 return menu
178 end
179
180 #
181
182 # event click function
183 #
184 def eventScan(invocation, ctx)
185
186 #Scanner click
187 if ctx == 7
188 invMessage = invocation.getSelectedIssues()
189 invMessage.each do |m|
190 newScanIssue(m,ctx,true)
191 end
192 else
193 #Others
194 invMessage = invocation.getSelectedMessages()
195 invMessage.each do |m|
196 newScanIssue(m,ctx,true)
197 end
198 end
199 end
200
201 #
202 # implement IScannerListener
203 #
204 def newScanIssue(issue, ctx=nil, import=nil)
205
206 if import == nil && @import_new_vulns.isSelected() == 0
207 #ignore new issues
208 return
209 end
210
211 host = issue.getHost()
212 port = issue.getPort().to_s()
213 url = issue.getUrl()
214 resolution = ""
215
216 begin
217 ip = InetAddress.getByName(issue.getHttpService().getHost()).getHostAddress()
218 rescue Exception => e
219 ip = host
220 end
221
222 if ctx == 5 or ctx == 6 or ctx == 2
223 issuename="Analyzing: "
224 severity="Information"
225 desc="This request was manually sent using burp"
226 else
227 desc=issue.getIssueDetail().to_s
228 desc+="<br/>Resolution:" + issue.getIssueBackground().to_s
229 severity=issue.getSeverity().to_s
230 issuename=issue.getIssueName().to_s
231 resolution=issue.getRemediationBackground().to_s
232 end
233
234 @stdout.println("New scan issue host: " +host +",name:"+ issuename +",IP:" + ip)
235
236 begin
237 rt = @server.call("devlog", "[BURP] New issue generation")
238
239 h_id = @server.call("createAndAddHost",ip, "unknown")
240 i_id = @server.call("createAndAddInterface",h_id, ip,"00:00:00:00:00:00", ip, "0.0.0.0", "0.0.0.0",[],
241 "0000:0000:0000:0000:0000:0000:0000:0000","00","0000:0000:0000:0000:0000:0000:0000:0000",
242 [],"",host)
243
244 s_id = @server.call("createAndAddServiceToInterface",h_id, i_id, issue.getProtocol(),"tcp",[port],"open")
245
246 #Save website
247 n_id = @server.call("createAndAddNoteToService",h_id,s_id,"website","")
248 n2_id = @server.call("createAndAddNoteToNote",h_id,s_id,n_id,host,"")
249
250 path = ""
251 response = ""
252 request = ""
253 method = ""
254 param = ""
255
256 #Menu action
257 if ctx == 5 or ctx == 6 or ctx == 2
258 req = @helpers.analyzeRequest(issue.getRequest())
259
260 param = getParam(req)
261 issuename += "("+issue.getUrl().getPath()[0,20]+")"
262 path = issue.getUrl().to_s
263 request = issue.getRequest().to_s
264 method = req.getMethod().to_s
265
266 else #Scan event or Menu scan tab
267 unless issue.getHttpMessages().nil? #issues with request #IHttpRequestResponse
268 c = 0
269 issue.getHttpMessages().each do |m|
270 if c == 0
271 req = @helpers.analyzeRequest(m.getRequest())
272 path = m.getUrl().to_s
273 request = m.getRequest().to_s
274 method = req.getMethod().to_s
275
276 param = getParam(req)
277 else
278 desc += "<br/>Request (" + c.to_s + "): " + m.getUrl().to_s
279 end
280
281 c = c + 1
282 end
283
284 if c == 0
285 path = issue.getUrl().to_s
286 end
287
288 end
289 end
290
291 #createAndAddVulnWebToService(host_id, service_id, name, desc, ref, severity, resolution, website, path, request, response,method,pname, params,query,category):
292 v_id = @server.call("createAndAddVulnWebToService",h_id, s_id, issuename,
293 desc,[],severity,resolution,host,path,request,
294 response,method,"",param,"","")
295
296
297 rescue XMLRPC::FaultException => e
298 puts "Error:"
299 puts e.faultCode
300 puts e.faultString
301 end
302 end
303
304 def extensionUnloaded()
305
306 end
307
308 def getTabCaption()
309 return "Faraday"
310 end
311
312 def getUiComponent()
313 return @tab
314 end
315
316 #
317 # convert integer to string
318 #
319 def boolString(value)
320 if value == "0"
321 return "false"
322 else
323 return "true"
324 end
325 end
326
327 #
328 # get param for one url
329 #
330 def getParam(value)
331 param = ""
332 value.getParameters().each do |p|
333 #TODO: Actually Get all parameters, cookies, jason, url, maybe we should get only url,get/post parameters
334 #http://portswigger.net/burp/extender/api/constant-values.html#burp.IParameter.PARAM_BODY
335 param += "%s" % p.getType() + ":" + p.getName() + "=" + p.getValue() + ","
336 end
337 return param
338
339 end
340
341 def restoreConfig(e=nil)
342 @import_new_vulns.setSelected(@callbacks.loadExtensionSetting("import_new_vulns") == "1")
343 @rpc_server.setText(@callbacks.loadExtensionSetting("rpc_server"))
344 if @rpc_server.getText().strip == ""
345 @rpc_server.setText("http://127.0.0.1:9876/")
346 end
347
348 #Connect Rpc server
349 @server = XMLRPC::Client.new2(@rpc_server.getText())
350
351 @stdout.println("Config restored.")
352 end
353
354 def saveConfig(e=nil)
355 @callbacks.saveExtensionSetting("import_new_vulns", @import_new_vulns.isSelected() ? "1" : "0")
356 @callbacks.saveExtensionSetting("rpc_server", @rpc_server.getText())
357 @stdout.println("Config saved.")
358 end
359
360
361 def importVulns()
362 # Get current vulnerabilities
363 @stdout.println("Importing vulns.")
364 rt = @server.call("devlog", "[BURP] Importing issues")
365 @callbacks.getScanIssues(nil).each do |issue|
366 newScanIssue(issue, 1, true)
367 end
368 end
369
370
371 end
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
231231
232232 item.response=""
233233 desc=item.detail
234 desc+="\nSolution: "+item.remediation if item.remediation else ""
234 resolution=item.remediation if item.remediation else ""
235235
236236 v_id = self.createAndAddVulnWebToService(h_id, s_id, item.name,
237237 desc=desc,severity=item.severity,website=item.host,
238 path=item.path,request=item.request,response=item.response)
238 path=item.path,request=item.request,response=item.response,
239 resolution=resolution)
239240
240241 del parser
241242
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 # -*- coding: utf-8 -*-
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 # -*- coding: utf-8 -*-
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 # -*- coding: utf-8 -*-
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
1212 import re
1313 import os
1414 import sys
15 import psycopg2
15
16 try:
17 import psycopg2
18 except ImportError:
19 raise Exception("Please install psycopg2 to use plugin: MetasploitOn")
20
21
1622 import time
1723
1824 try:
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
129129
130130 desc=""
131131 desc+=v.get('description') if v.get('description') else ""
132 desc+="\nSolution: "+ v.get('solution') if v.get('solution') else ""
132 resolution = ""
133 resolution = v.get('solution') if v.get('solution') else ""
133134 desc+="\nOutput: "+v.get('plugin_output') if v.get('plugin_output') else ""
134135 ref=[]
135136 if v.get('cve'):
140141 ref.append(", ".join(v.get('xref')))
141142 if v.get('svc_name') == "general":
142143 v_id = self.createAndAddVulnToHost(h_id, v.get('plugin_name'),
143 desc,ref,severity=v.get('severity'))
144 desc,ref,severity=v.get('severity'), resolution=resolution)
144145 else:
145146
146147 s_id = self.createAndAddServiceToInterface(h_id, i_id, v.get('svc_name'),
157158
158159 if web:
159160 v_id = self.createAndAddVulnWebToService(h_id, s_id, v.get('plugin_name'),
160 desc,website=host, severity=v.get('severity'),ref=ref)
161 desc,website=host, severity=v.get('severity'),
162 resolution=resolution,ref=ref)
161163 else:
162164 v_id = self.createAndAddVulnToService(h_id, s_id, v.get('plugin_name'),
163 desc,
164 severity=v.get('severity'),ref = ref)
165 desc, severity=v.get('severity'), resolution=resolution,
166 ref = ref)
165167
166168
167169 def _isIPV4(self, ip):
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
129129 self.result=self.get_text_from_subnode("RESULT")
130130 self.desc = self.diagnosis
131131 self.desc += "\nResult: " +self.result if self.result else ""
132 self.desc += "\nSolution: " +self.solution if self.solution else ""
133132
134133 self.ref=[]
135134 for r in issue_node.findall("CVE_ID_LIST/CVE_ID"):
182181
183182 for v in item.vulns:
184183 if v.port is None:
185 v_id=self.createAndAddVulnToHost(h_id,v.title,ref=v.ref,severity=v.severity,desc=v.desc)
184 v_id=self.createAndAddVulnToHost(h_id,v.title,ref=v.ref,severity=v.severity,resolution=v.solution,desc=v.desc)
186185 else:
187186 web=False
188187 s_id = self.createAndAddServiceToInterface(h_id, i_id, v.port,
196195 web=False
197196
198197 if web:
199 v_id=self.createAndAddVulnWebToService(h_id, s_id,v.title,ref=v.ref,website=item.ip,severity=v.severity,desc=v.desc)
198 v_id=self.createAndAddVulnWebToService(h_id, s_id,v.title,ref=v.ref,website=item.ip,severity=v.severity,desc=v.desc,resolution=v.solution)
200199 n_id = self.createAndAddNoteToService(h_id,s_id,"website","")
201200 n2_id = self.createAndAddNoteToNote(h_id,s_id,n_id,item.ip,"")
202201 else:
203 v_id=self.createAndAddVulnToService(h_id, s_id,v.title,ref=v.ref,severity=v.severity,desc=v.desc)
202 v_id=self.createAndAddVulnToService(h_id, s_id,v.title,ref=v.ref,severity=v.severity,desc=v.desc,resolution=v.solution)
204203
205204
206205
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
150150 self.port = val[1]
151151
152152 self.desc = self.get_text_from_subnode('description')
153 self.desc += "\nSolution: " +self.solution if self.solution else ""
153 self.solution = self.solution if self.solution else ""
154154 self.desc += "\nExploit: " +self.exploit if self.exploit else ""
155155 self.desc += "\ncvssScore: " +self.cvssScore if self.cvssScore else ""
156156 self.desc += "\nContext: " +self.context if self.context else ""
224224 web=False
225225
226226 if web:
227 v_id=self.createAndAddVulnWebToService(h_id, s_id,v.name.encode("utf-8"),ref=v.ref,website=hostname,severity=v.severity,desc=v.desc.encode("utf-8"))
227 v_id=self.createAndAddVulnWebToService(h_id, s_id,v.name.encode("utf-8"),ref=v.ref,website=hostname,severity=v.severity,resolution=v.solution.encode("utf-8"),desc=v.desc.encode("utf-8"))
228228 n_id = self.createAndAddNoteToService(h_id,s_id,"website","")
229229 n2_id = self.createAndAddNoteToNote(h_id,s_id,n_id,hostname,"")
230230 else:
231 v_id=self.createAndAddVulnToService(h_id, s_id,v.name.encode("utf-8"),ref=v.ref,severity=v.severity,desc=v.desc.encode("utf-8"))
231 v_id=self.createAndAddVulnToService(h_id, s_id,v.name.encode("utf-8"),ref=v.ref,severity=v.severity,resolution=v.solution.encode("utf-8"),desc=v.desc.encode("utf-8"))
232232 else:
233233 for v in vulns:
234 v_id=self.createAndAddVulnToHost(h_id,v.name.encode("utf-8"),ref=v.ref,severity=v.severity,desc=v.desc.encode("utf-8"))
234 v_id=self.createAndAddVulnToHost(h_id,v.name.encode("utf-8"),ref=v.ref,severity=v.severity,resolution=v.solution.encode("utf-8"),desc=v.desc.encode("utf-8"))
235235 del parser
236236
237237 def processCommandString(self, username, current_path, command_string):
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
88 '''
99 from __future__ import with_statement
10 import sys
11 import os
12
1013 from plugins import core
1114 from model import api
1215 import re
1316 import os
1417 import pprint
15 import sys
1618 import json
1719 import pickle
1820 import sqlite3
2426 from StringIO import StringIO
2527
2628
27 sys.path.append("/usr/share/sqlmap/")
28
2929 try:
3030 import xml.etree.cElementTree as ET
3131 import xml.etree.ElementTree as ET_ORIG
3838
3939 current_path = os.path.abspath(os.getcwd())
4040
41 class HASHDB_KEYS:
42 DBMS = "DBMS"
43 CONF_TMP_PATH = "CONF_TMP_PATH"
44 KB_ABS_FILE_PATHS = "KB_ABS_FILE_PATHS"
45 KB_BRUTE_COLUMNS = "KB_BRUTE_COLUMNS"
46 KB_BRUTE_TABLES = "KB_BRUTE_TABLES"
47 KB_CHARS = "KB_CHARS"
48 KB_DYNAMIC_MARKINGS = "KB_DYNAMIC_MARKINGS"
49 KB_INJECTIONS = "KB_INJECTIONS"
50 KB_XP_CMDSHELL_AVAILABLE = "KB_XP_CMDSHELL_AVAILABLE"
51 OS = "OS"
52
5341 __author__ = "Francisco Amato"
5442 __copyright__ = "Copyright (c) 2013, Infobyte LLC"
5543 __credits__ = ["Francisco Amato"]
5947 __email__ = "[email protected]"
6048 __status__ = "Development"
6149
62 UNICODE_ENCODING = "utf8"
63 HASHDB_MILESTONE_VALUE = "cAWxkLYCQT"
64
6550
6651 class Database(object):
6752
7055
7156
7257 def connect(self, who="server"):
73 print "Db" + self.database
58 # print "Db" + self.database
7459 self.connection = sqlite3.connect(self.database, timeout=3, isolation_level=None)
7560 self.cursor = self.connection.cursor()
7661
9883 core.PluginBase.__init__(self)
9984 self.id = "Sqlmap"
10085 self.name = "Sqlmap"
101 self.plugin_version = "0.0.1"
102 self.version = "sqlmap/1.0-dev"
86 self.plugin_version = "0.0.2"
87 self.version = "1.0-dev-6bcc95"
10388 self.framework_version = "1.0.0"
10489 self._current_output = None
10590 self.url = ""
10994 self.params=""
11095 self.fullpath=""
11196 self.path=""
97
98 self.addSetting("Sqlmap path", str, "/root/tools/sqlmap")
11299
113100 self.db_port = { "MySQL" : 3306, "PostgreSQL":"", "Microsoft SQL Server" : 1433,
114101 "Oracle" : 1521, "Firebird" : 3050,"SAP MaxDB":7210, "Sybase" : 5000,
301288 def send_error(self, code, message):
302289 self.error_code = code
303290 self.error_message = message
304
305 def hashKey(self,key):
306 key = key.encode(UNICODE_ENCODING)
307 print "otra Key:" + str(key)
308 retVal = int(hashlib.md5(key).hexdigest()[:8], 16)
291
292 def hashKey(self, key):
293 key = key.encode(self.UNICODE_ENCODING)
294 retVal = int(hashlib.md5(key).hexdigest()[:12], 16)
309295 return retVal
310
296
311297 def hashDBRetrieve(self,key, unserialize=False, db=False):
312298 """
313299 Helper function for restoring session data from HashDB
314300 """
315301
316 key = "%s%s%s" % (self.url or "%s%s" % (self.hostname, self.port), key, HASHDB_MILESTONE_VALUE)
302 key = "%s%s%s" % (self.url or "%s%s" % (self.hostname, self.port), key, self.HASHDB_MILESTONE_VALUE)
317303 retVal=""
318304
319305 hash_ = self.hashKey(key)
320 print "hash_" + str(hash_) + "key=" + key
306 # print "hash_" + str(hash_) + "key=" + key
321307 if not retVal:
322308 while True:
323309 try:
328314 raise
329315 else:
330316 break
331 return retVal if not unserialize else self.base64unpickle(retVal)
332
333
317 return retVal if not unserialize else self.base64unpickle(retVal)
318
334319 def base64decode(self,value):
335320 """
336321 Decodes string value from Base64 to plain format
414399 NOTE: if 'debug' is true then it is being run from a test case and the
415400 output being sent is valid.
416401 """
417
402
403 sys.path.append(self.getSetting("Sqlmap path"))
404
405 from lib.core.settings import HASHDB_MILESTONE_VALUE
406 from lib.core.enums import HASHDB_KEYS
407 from lib.core.settings import UNICODE_ENCODING
408 self.HASHDB_MILESTONE_VALUE = HASHDB_MILESTONE_VALUE
409 self.HASHDB_KEYS = HASHDB_KEYS
410 self.UNICODE_ENCODING = UNICODE_ENCODING
418411
419412 password = self.getpassword(output)
420413 webserver = re.search("web application technology: (.*?)\n",output)
421414 if webserver:
422415 webserver=webserver.group(1)
423416 users = self.getuser(output)
424 print users
417 # print users
425418 dbs = self.getdbs(output)
426419
420 # print "webserver = " + webserver
421 # print "dbs = " + str(dbs)
422 # print "users = " + str(users)
423 # print "password = " + str(password)
427424
428425
429426 db = Database(self._output_path)
430 db.connect()
431
432
427 db.connect()
433428
434 absFilePaths = self.hashDBRetrieve(HASHDB_KEYS.KB_ABS_FILE_PATHS, True, db)
435 tables = self.hashDBRetrieve(HASHDB_KEYS.KB_BRUTE_TABLES, True, db)
436 columns = self.hashDBRetrieve(HASHDB_KEYS.KB_BRUTE_COLUMNS, True, db)
437 xpCmdshellAvailable = self.hashDBRetrieve(HASHDB_KEYS.KB_XP_CMDSHELL_AVAILABLE, True, db)
438 dbms_version = self.hashDBRetrieve(HASHDB_KEYS.DBMS, False, db)
439
440 os = self.hashDBRetrieve(HASHDB_KEYS.OS, False, db)
429 absFilePaths = self.hashDBRetrieve(self.HASHDB_KEYS.KB_ABS_FILE_PATHS, True, db)
430 tables = self.hashDBRetrieve(self.HASHDB_KEYS.KB_BRUTE_TABLES, True, db)
431 columns = self.hashDBRetrieve(self.HASHDB_KEYS.KB_BRUTE_COLUMNS, True, db)
432 xpCmdshellAvailable = self.hashDBRetrieve(self.HASHDB_KEYS.KB_XP_CMDSHELL_AVAILABLE, True, db)
433 dbms_version = self.hashDBRetrieve(self.HASHDB_KEYS.DBMS, False, db)
434
435 os = self.hashDBRetrieve(self.HASHDB_KEYS.OS, False, db)
441436
442437 self.ip=self.getAddress(self.hostname)
443438
480475 if xpCmdshellAvailable:
481476 n_id2 = self.createAndAddNoteToService(h_id,s_id2,"sqlmap.xpCmdshellAvailable",str(xpCmdshellAvailable))
482477
483 for inj in self.hashDBRetrieve(HASHDB_KEYS.KB_INJECTIONS, True,db) or []:
484 print inj
485 print inj.dbms
486 print inj.dbms_version
487 print inj.place
488 print inj.os
489 print inj.parameter
478 for inj in self.hashDBRetrieve(self.HASHDB_KEYS.KB_INJECTIONS, True,db) or []:
479 # print inj
480 # print inj.dbms
481 # print inj.dbms_version
482 # print inj.place
483 # print inj.os
484 # print inj.parameter
490485
491 dbversion = self.hashDBRetrieve(self.xmlvalue(dbms,"banner"), False, db)
492 user = self.hashDBRetrieve(self.xmlvalue(dbms,"current_user"), False, db)
493 dbname = self.hashDBRetrieve(self.xmlvalue(dbms,"current_db"), False, db)
494 hostname = self.hashDBRetrieve(self.xmlvalue(dbms,"hostname"), False, db)
486 dbversion = self.hashDBRetrieve("None"+self.xmlvalue(dbms,"banner"), False, db)
487 user = self.hashDBRetrieve("None"+self.xmlvalue(dbms,"current_user"), False, db)
488 dbname = self.hashDBRetrieve("None"+self.xmlvalue(dbms,"current_db"), False, db)
489 hostname = self.hashDBRetrieve("None"+self.xmlvalue(dbms,"hostname"), False, db)
490
491 # print "username = " + user
495492
496493 if user:
497494 n_id2 = self.createAndAddNoteToService(h_id,s_id2,"db.user",user)
513510 "\nParam type:" + str(self.ptype[inj.ptype]),
514511 ref=[],
515512 pname=inj.parameter,
513 severity="high",
516514 method=inj.place,
517515 params=self.params,
518516 path=self.fullpath)
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77 '''
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
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
0 #!/usr/bin/env python
1 # -*- coding: utf-8 -*-
2
3 '''
4 Faraday Penetration Test IDE
5 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
6 See the file 'doc/LICENSE' for the license information
7 '''
8 from __future__ import with_statement
9 from plugins import core
10 import re
11 import os
12 import sys
13
14 try:
15 import xml.etree.cElementTree as ET
16 import xml.etree.ElementTree as ET_ORIG
17 ETREE_VERSION = ET_ORIG.VERSION
18 except ImportError:
19 import xml.etree.ElementTree as ET
20 ETREE_VERSION = ET.VERSION
21
22 ETREE_VERSION = [int(i) for i in ETREE_VERSION.split(".")]
23
24 current_path = os.path.abspath(os.getcwd())
25
26 __author__ = "Morgan Lemarechal"
27 __copyright__ = "Copyright 2014, Faraday Project"
28 __credits__ = ["Morgan Lemarechal"]
29 __license__ = ""
30 __version__ = "1.0.0"
31 __maintainer__ = "Morgan Lemarechal"
32 __email__ = "[email protected]"
33 __status__ = "Development"
34
35
36
37
38
39 class WcscanParser(object):
40 """
41 The objective of this class is to parse an xml file generated by the wcscan tool.
42 TODO: Handle errors.
43 TODO: Test wcscan output version. Handle what happens if the parser doesn't support it.
44 TODO: Test cases.
45 @param wcscan_filepath A proper simple report generated by wcscan
46 """
47 def __init__(self, output):
48 self.scaninfo = {}
49 self.result = {}
50 tree = ET.parse(output)
51 root = tree.getroot()
52 for scan in root.findall(".//scan"):
53 infos = {}
54 for info in scan.attrib:
55 infos[info] = scan.attrib[info]
56 self.scaninfo[scan.attrib['file']] = infos
57
58 item = {}
59 if scan.attrib['type'] == "phpini":
60 for carac in scan:
61 item[carac.tag] = [carac.text,carac.attrib['rec'],""]
62
63 if scan.attrib['type'] == "webconfig":
64 id = 0
65 for carac in scan:
66 id += 1
67 item[id] = [carac.text,carac.attrib['rec'],carac.attrib['option'],carac.tag]
68
69 self.result[scan.attrib['file']] = item
70
71 class WcscanPlugin(core.PluginBase):
72 """
73 Example plugin to parse wcscan output.
74 """
75 def __init__(self):
76 core.PluginBase.__init__(self)
77 self.id = "Wcscan"
78 self.name = "Wcscan XML Output Plugin"
79 self.plugin_version = "0.0.1"
80 self.version = "0.30"
81 self._completition = {
82 "":"wcscan [-h] [-r] [-host HOST] [-port PORT] [--xml XMLOUTPUT] [--version] files [files ...]",
83 "-h":"show this help message and exit",
84 "-r":"enable the recommendation mode",
85 "--host":"to give the IP address of the conf file owner",
86 "--port":"to give a associated port",
87 "--xml":"enabled the XML output in a specified file",
88 "--version":"Show program's version number and exit",
89 }
90
91 self.options = None
92 self._current_output = None
93 self.current_path = None
94 self._command_regex = re.compile(r'^(sudo wcscan|wcscan|\.\/wcscan).*?')
95
96 global current_path
97 self._output_file_path = os.path.join(self.data_path, "wcscan_output-%s.xml" % self._rid)
98
99 def canParseCommandString(self, current_input):
100 if self._command_regex.match(current_input.strip()):
101 return True
102 else:
103 return False
104
105 def parseOutputString(self, output, debug=False):
106 """
107 This method will discard the output the shell sends, it will read it from
108 the xml where it expects it to be present.
109 NOTE: if 'debug' is true then it is being run from a test case and the
110 output being sent is valid.
111 """
112 if debug:
113 parser = WcscanParser(self._output_file_path)
114 else:
115
116 if not os.path.exists(self._output_file_path):
117 return False
118 parser = WcscanParser(self._output_file_path)
119
120 for file in parser.scaninfo:
121 host = parser.scaninfo[file]['host']
122 port = parser.scaninfo[file]['port']
123 h_id = self.createAndAddHost(host)
124 if(re.match("(^[2][0-5][0-5]|^[1]{0,1}[0-9]{1,2})\.([0-2][0-5][0-5]|[1]{0,1}[0-9]{1,2})\.([0-2][0-5][0-5]|[1]{0,1}[0-9]{1,2})\.([0-2][0-5][0-5]|[1]{0,1}[0-9]{1,2})$"
125 ,host)):
126 i_id = self.createAndAddInterface(h_id,
127 host,
128 ipv4_address = host)
129 else:
130 i_id = self.createAndAddInterface(h_id,
131 host,
132 ipv6_address = host)
133
134 s_id = self.createAndAddServiceToInterface(h_id, i_id, "http", protocol="tcp", ports=port)
135 for vuln in parser.result[file]:
136 if parser.scaninfo[file]['type'] == "phpini":
137 v_id = self.createAndAddVulnToService(h_id, s_id,
138 parser.scaninfo[file]['file']+":"+vuln,
139 desc="{} : {}\n{}".format(vuln,
140 str(parser.result[file][vuln][0]),
141 str(parser.result[file][vuln][1])),
142 severity=0)
143
144 if parser.scaninfo[file]['type'] == "webconfig":
145 v_id = self.createAndAddVulnToService(h_id, s_id,
146 parser.scaninfo[file]['file']+":"+str(parser.result[file][vuln][3]),
147 desc="{} : {} = {}\n{}".format(str(parser.result[file][vuln][3]),
148 str(parser.result[file][vuln][2]),
149 str(parser.result[file][vuln][0]),
150 str(parser.result[file][vuln][1])),
151 severity=0)
152 del parser
153
154 if not debug:
155 os.remove(self._output_file_path)
156 return True
157
158 xml_arg_re = re.compile(r"^.*(--xml\s*[^\s]+).*$")
159
160 def processCommandString(self, username, current_path, command_string):
161 """
162 Adds the parameter to get output to the command string that the
163 user has set.
164 """
165
166 arg_match = self.xml_arg_re.match(command_string)
167
168 if arg_match is None:
169 return "%s --xml %s" % (command_string, self._output_file_path)
170 else:
171 return re.sub(arg_match.group(1),
172 r"-xml %s" % self._output_file_path,
173 command_string)
174
175 def createPlugin():
176 return WcscanPlugin()
177
178 if __name__ == '__main__':
179 parser = WcscanParser(sys.argv[1])
180 for item in parser.items:
181 if item.status == 'up':
182 print item
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 # -*- coding: utf-8 -*-
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
176176
177177 def parseOutputString(self, output, debug = False):
178178
179
179
180 print "X1 testing"
180181 parser = X1XmlParser(output)
181182 for item in parser.items:
182183 h_id = self.createAndAddHost(item.host,item.name)
187188 status = "open")
188189 for v in item.results:
189190 desc=v.description
190 desc+="\nSolution: "+v.resolution if v.resolution else ""
191191 v_id=self.createAndAddVulnToService(h_id, s_id,v.name,desc=desc,
192 ref=v.ref,severity=v.risk)
192 ref=v.ref,severity=v.risk, resolution=v.resolution)
193193
194194 for v in item.cresults:
195195 desc=v.description
196 desc+="\nSolution: "+v.resolution if v.resolution else ""
197196 v_id=self.createAndAddVulnToService(h_id, s_id,v.name,desc=desc,
198 ref=v.ref,severity=v.risk)
197 ref=v.ref,severity=v.risk, resolution=v.resolution)
199198
200199 del parser
201200
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
164164
165165 self.severity = self.get_text_from_subnode('riskcode')
166166 self.desc = self.get_text_from_subnode('desc')
167 self.desc += "\nSolution: " + self.get_text_from_subnode('solution') if self.get_text_from_subnode('solution') else ""
167 self.resolution = self.get_text_from_subnode('solution') if self.get_text_from_subnode('solution') else ""
168168 self.desc += "\nReference: " + self.get_text_from_subnode('reference') if self.get_text_from_subnode('reference') else ""
169169 self.ref=[]
170170 if self.get_text_from_subnode('cweid'):
253253 v_id = self.createAndAddVulnWebToService(h_id, s_id, item.name,
254254 item.desc, website=site.host, severity=item.severity,
255255 path=item.items[0]['uri'],params=item.items[0]['param'],
256 request=item.requests,ref=item.ref)
256 request=item.requests,ref=item.ref, resolution=item.resolution)
257257
258258 del parser
259259
77 tornado==3.2
88 flask==0.10.1
99 colorama==0.3.2
10 #extra
1011 psycopg2==2.5.4
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
1414 __copyright__ = "Copyright 2014, Faraday Project"
1515 __credits__ = ["Francisco Amato"]
1616 __license__ = ""
17 __version__ = "1.0.1"
17 __version__ = "1.0.2"
1818 __maintainer__ = "Francisco Amato"
1919 __email__ = "[email protected]"
2020 __status__ = "Development"
2121
2222 # Configuration
23 SHODAN_API_KEY = "INSERT SHODAN KEY HERE"
23 SHODAN_API_KEY = "INSERT YOUR SHODAN KEY HERE"
24
25 def strip_non_ascii(string):
26 ''' Returns the string without non ASCII characters'''
27 stripped = (c for c in string if 0 < ord(c) < 127)
28 return ''.join(stripped)
2429
2530 def send_faraday(result):
2631 print 'IP: %s' % result['ip_str']
2732
2833 if result['data'] is not None:
29 result['data'] = base64.b64encode(str(result['data'])) #fix: to avoid non ascii caracters
34 result['data'] = base64.b64encode(strip_non_ascii(str(result['data']))) #fix: to avoid non ascii caracters
3035
3136 if args.debug == "1":
3237 print '==============='
97102 raise
98103
99104
105
0 ###
1 ## Faraday Penetration Test IDE
2 ## Copyright (C) 2014 Infobyte LLC (http://www.infobytesec.com/)
3 ## See the file 'doc/LICENSE' for the license information
4 ###
5 # Version 1.0.0
6 110TC2
7 16NX073012001
8 16NX080112001
9 16NX080112002
10 16NX081412001
11 16NX081812001
12 410TC1
13 450TC1
14 450TC2
15 480TC1
16 AAM6000EV/Z2
17 AAM6010EV
18 AAM6010EV/Z2
19 AAM6010EV-Z2
20 AAM6020BI
21 AAM6020BI-Z2
22 AAM6020VI/Z2
23 AD3000W
24 ADSL Modem
25 ADSL Modem/Router
26 ADSL
27 AirLive ARM201
28 AirLive ARM-204
29 AirLive ARM-204 Annex A
30 AirLive ARM-204 Annex B
31 AirLive WT-2000ARM
32 AirLive WT-2000ARM Annex A
33 AirLive WT-2000ARM Annex B
34 AMG1001-T10A
35 APPADSL2+
36 APPADSL2V1
37 AR-7182WnA
38 AR-7182WnB
39 AR-7186WnA/B
40 AR-7286WNA
41 AR-7286WnB
42 Arcor-DSL WLAN-Modem 100
43 Arcor-DSL WLAN-Modem 200
44 AZ-D140W
45 Billion Sky
46 BiPAC 5102C
47 BiPAC 5102S
48 BiPAC 5200S
49 BIPAC-5100 ADSL
50 BLR-TX4L
51 BW554
52 C300APRA2+
53 Compact ADSL2+
54 D-5546
55 D-7704G
56 Delsa Telecommunication
57 D-Link_DSL-2730R
58 DM 856W
59 DSL-2110W
60 DSL-2120
61 DSL-2140
62 DSL-2140W
63 DSL-2520U
64 DSL-2520U_Z2
65 DSL-2600U
66 DSL-2640R
67 DSL-2641R
68 DSL-2680
69 DSL-2740R
70 DSL-320B
71 DSL-321B
72 DSL-3680
73 DT 815
74 DT 820
75 DT 845W
76 DT 850W
77 DWR-TC14 ADSL Modem
78 EchoLife HG520s
79 EchoLife Home Gateway
80 EchoLife Portal de Inicio
81 GO-DSL-N151
82 HB-150N
83 HB-ADSL-150N
84 Hexabyte ADSL
85 Home Gateway
86 iB-LR6111A
87 iB-WR6111A
88 iB-WR7011A
89 iB-WRA150N
90 iB-WRA300N
91 iB-WRA300N3G
92 IES1248-51
93 KN.3N
94 KN.4N
95 KR.KQ
96 KR.KS
97 KR.XL
98 KR.XM
99 KR.XM\t
100 KR.YL
101 Linksys BEFDSR41W
102 LW-WAR2
103 M-101A
104 M-101B
105 M-200 A
106 M-200 B
107 MN-WR542T
108 MS8-8817
109 MT800u-T ADSL
110 MT880r-T ADSL
111 MT882r-T ADSL
112 MT886
113 mtnlbroadband
114 NetBox NX2-R150
115 Netcomm NB14
116 Netcomm NB14Wn
117 NP-BBRsx
118 OMNI ADSL LAN EE(Annex A)
119 P202H DSS1
120 P653HWI-11
121 P653HWI-13
122 P-660H-D1
123 P-660H-T1 v3s
124 P-660H-T3 v3s
125 P-660HW-D1
126 P-660R-D1
127 P-660R-T1
128 P-660R-T1 v3
129 P-660R-T1 v3s
130 P-660R-T3 v3
131 P-660R-T3 v3s
132 P-660RU-T1
133 P-660RU-T1 v3
134 P-660RU-T1 v3s
135 P-660RU-T3 v3s
136 PA-R11T
137 PA-W40T-54G
138 Cerberus P 6311-072
139 PL-DSL1
140 PN-54WADSL2
141 PN-ADSL101E
142 Portal de Inicio
143 POSTEF-8840
144 POSTEF-8880
145 Prestige 623ME-T1
146 Prestige 623ME-T3
147 Prestige 623R-A1
148 Prestige 623R-T1
149 Prestige 623R-T3
150 Prestige 645
151 Prestige 645R-A1
152 Prestige 650
153 Prestige 650H/HW-31
154 Prestige 650H/HW-33
155 Prestige 650H-17
156 Prestige 650H-E1
157 Prestige 650H-E3
158 Prestige 650H-E7
159 Prestige 650HW-11
160 Prestige 650HW-13
161 Prestige 650HW-31
162 Prestige 650HW-33
163 Prestige 650HW-37
164 Prestige 650R-11
165 Prestige 650R-13
166 Prestige 650R-31
167 Prestige 650R-33
168 Prestige 650R-E1
169 Prestige 650R-E3
170 Prestige 650R-T3
171 Prestige 652H/HW-31
172 Prestige 652H/HW-33
173 Prestige 652H/HW-37
174 Prestige 652R-11
175 Prestige 652R-13
176 Prestige 660H-61
177 Prestige 660HW-61
178 Prestige 660HW-67
179 Prestige 660R-61
180 Prestige 660R-61C
181 Prestige 660R-63
182 Prestige 660R-63/67
183 Prestige 791R
184 Prestige 792H
185 RAWRB1001
186 RE033
187 RTA7020
188 RWS54
189 SG-1250
190 SG-1500
191 SmartAX
192 SmartAX MT880
193 SmartAX MT882
194 SmartAX MT882r-T
195 SmartAX MT882u
196 Sterlite
197 Sweex MO300
198 T514
199 TD811
200 TD821
201 TD841
202 TD854W
203 TD-8616
204 TD-8811
205 TD-8816
206 TD-8816 1.0
207 TD-8816 2.0
208 TD-8816B
209 TD-8817
210 TD-8817 1.0
211 TD-8817 2.0
212 TD-8817B
213 TD-8820
214 TD-8820 1.0
215 TD-8840T
216 TD-8840T 2.0
217 TD-8840TB
218 TD-W8101G
219 TD-W8151N
220 TD-W8901G
221 TD-W8901G 3.0
222 TD-W8901GB
223 TD-W8901N
224 TD-W8951NB
225 TD-W8951ND
226 TD-W8961N
227 TD-W8961NB
228 TD-W8961ND
229 T-KD318-W
230 TrendChip ADSL
231 UM-A+ Asotel
232 Vodafone ADSL
233 vx811r
234 WA3002-g1
235 WA3002G4
236 WA3002-g4
237 WBR-3601
238 WebShare 111 WN
239 WebShare 141 WN
240 WebShare 141 WN+
241 Wireless ADSL Modem/Router
242 Wireless-N 150Mbps ADSL
243 Router
244 ZXDSL 831CII
245 ZXDSL 831II
246 ZXHN H108L
247 ZXV10 W300
248 ZXV10 W300B
249 ZXV10 W300D
250 ZXV10 W300E
251 ZXV10 W300S
00 ###
1 ## Faraday Penetration Test IDE - Community Version
1 ## Faraday Penetration Test IDE
22 ## Copyright (C) 2014 Infobyte LLC (http://www.infobytesec.com/)
33 ## See the file 'doc/LICENSE' for the license information
44 ###
00 ###
1 ## Faraday Penetration Test IDE - Community Version
1 ## Faraday Penetration Test IDE
22 ## Copyright (C) 2014 Infobyte LLC (http://www.infobytesec.com/)
33 ## See the file 'doc/LICENSE' for the license information
44 ###
0 #!/usr/bin/python2
0 #!/usr/bin/python2
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
66 '''
77
88 #libraries
9 import subprocess
10 import argparse
11 import re
12 import sys
13 import xml.etree.cElementTree as ET
9 import subprocess
10 import argparse
11 import re
12 import sys
13 import xml.etree.cElementTree as ET
1414
1515 if subprocess.call("openssl version", shell=True, stdout=subprocess.PIPE):
16 sys.stderr.write("[+]OpenSSL package needed\n")
17 exit(1)
16 sys.stderr.write("[+]OpenSSL package needed\n")
17 exit(1)
1818
1919 program_options = ('key', 'ren', 'sign', 'serv', 'cyph', 'forw', 'heart', 'crime', 'all')
2020 openssl_protocols = {'ssl3':'SSLv3',
21 'tls1':'TLSv1',
22 'tls1_1':'TLSv1.1',
23 'tls1_2':'TLSv1.2'}
21 'tls1':'TLSv1',
22 'tls1_1':'TLSv1.1',
23 'tls1_2':'TLSv1.2'}
2424 openssl_insecure_cyphers = {'RC','MD5','MD4','MD2','SHA0','SHA1', 'NULL','aNULL',
25 'eNULL','ADH','EXP','DES','LOW','PSK','SRP','DSS'}
25 'eNULL','ADH','EXP','DES','LOW','PSK','SRP','DSS'}
2626 openssl_cyphers = subprocess.check_output("openssl ciphers 'ALL:eNULL'",shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE).split(":")
2727
2828 parser = argparse.ArgumentParser(prog='SensorProbeClient', epilog="Scan availables: | KeySize: key | Signature Cipher: sign |Renegotiation: ren | Services available: serv | Cypher availables: cyph | Forward Secrecy: forw | Heartbleed test: heart | Crime test: crime")
3535 args = parser.parse_args()
3636
3737 def connection_test(host,port):
38 for i in range(1,6):
39 try:
40 subprocess.check_output("openssl s_client -connect {}:{} < /dev/null".format(host,port), shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
41 return
42 except subprocess.CalledProcessError:
43 print "[+]Connection failed... [ {} / 5 ]".format(i)
44 print "[+]Connection to the host impossible"
45 exit(1)
46
38 for i in range(1,6):
39 try:
40 subprocess.check_output("openssl s_client -connect {}:{} < /dev/null".format(host,port), shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
41 return
42 except subprocess.CalledProcessError:
43 print "[+]Connection failed... [ {} / 5 ]".format(i)
44 print "[+]Connection to the host impossible"
45 exit(1)
46
4747 def basic_connect(host,port):
48 result = subprocess.check_output("openssl s_client -connect {}:{} < /dev/null".format(host,port), shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
49 return result.split("\n")
50
48 result = subprocess.check_output("openssl s_client -connect {}:{} < /dev/null".format(host,port), shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
49 return result.split("\n")
50
5151 def complex_connect(host,port):
52 result = ""
53 for sprotocol, protocol in openssl_protocols.iteritems():
54 try:
55 result += subprocess.check_output("openssl s_client -{} -connect {}:{} < /dev/null".format(sprotocol,host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
56 except subprocess.CalledProcessError:
57 #-----------------------------------XML_Export-----------------------------------#
58 if args.xmloutput:
59 protocolx = ET.SubElement(scan, protocol)
60 protocolx.text="no"
61 #-----------------------------------XML_Export-----------------------------------#
62 if protocol == "TLSv1.1" or protocol == "TLSv1.2":
63 print " \033[0;41m{} not supported\033[0m".format(protocol)
64 else:
65 print " {} not supported".format(protocol)
66 return result.split("\n")
52 result = ""
53 for sprotocol, protocol in openssl_protocols.iteritems():
54 try:
55 result += subprocess.check_output("openssl s_client -{} -connect {}:{} < /dev/null".format(sprotocol,host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
56 except subprocess.CalledProcessError:
57 #-----------------------------------XML_Export-----------------------------------#
58 if args.xmloutput:
59 protocolx = ET.SubElement(scan, protocol)
60 protocolx.text="no"
61 #-----------------------------------XML_Export-----------------------------------#
62 if protocol == "TLSv1.1" or protocol == "TLSv1.2":
63 print " \033[0;41m{} not supported\033[0m".format(protocol)
64 else:
65 print " {} not supported".format(protocol)
66 return result.split("\n")
6767 def tlsdebug_connect(host,port):
68 result = subprocess.check_output("openssl s_client -tlsextdebug -connect {}:{} < /dev/null".format(host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
69 return result.split("\n")
70
68 result = subprocess.check_output("openssl s_client -tlsextdebug -connect {}:{} < /dev/null".format(host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
69 return result.split("\n")
70
7171 def sign_connect(host,port):
72 signScript = """
73 echo "HEAD / HTTP/1.0
74 EOT
75 " \
76 | openssl s_client -connect {}:{} 2>&1 \
77 | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' \
78 | openssl x509 -noout -text -certopt no_signame""".format(host,port)
79 result = subprocess.check_output("{}".format(signScript),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
80 return result.split("\n")
81
72 signScript = """
73 echo "HEAD / HTTP/1.0
74 EOT
75 " \
76 | openssl s_client -connect {}:{} 2>&1 \
77 | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' \
78 | openssl x509 -noout -text -certopt no_signame""".format(host,port)
79 result = subprocess.check_output("{}".format(signScript),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
80 return result.split("\n")
81
8282 def cypher_connect(host,port):
83 result = ""
84 for cyph in openssl_cyphers:
85 try:
86 result += subprocess.check_output("openssl s_client -cipher {} -connect {}:{} < /dev/null".format(cyph,host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
87 except subprocess.CalledProcessError:
88 pass
89 return result.split("\n")
90
83 result = ""
84 for cyph in openssl_cyphers:
85 try:
86 result += subprocess.check_output("openssl s_client -cipher {} -connect {}:{} < /dev/null".format(cyph,host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
87 except subprocess.CalledProcessError:
88 pass
89 return result.split("\n")
90
9191 def forward_connect(host,port):
92 result = ""
93 try:
94 result = subprocess.check_output("openssl s_client -cipher EDH,EECDH -connect {}:{} < /dev/null".format(host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
95 except subprocess.CalledProcessError:
96 #-----------------------------------XML_Export-----------------------------------#
97 if args.xmloutput:
98 forward_secrecy = ET.SubElement(scan, "forward_secrecy")
99 forward_secrecy.text="no"
100 #-----------------------------------XML_Export-----------------------------------#
101 print "\033[0;41m[+]Forward Secrecy not supported\033[0m"
102 return result.split("\n")
103
92 result = ""
93 try:
94 result = subprocess.check_output("openssl s_client -cipher EDH,EECDH -connect {}:{} < /dev/null".format(host,port),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
95 except subprocess.CalledProcessError:
96 #-----------------------------------XML_Export-----------------------------------#
97 if args.xmloutput:
98 forward_secrecy = ET.SubElement(scan, "forward_secrecy")
99 forward_secrecy.text="no"
100 #-----------------------------------XML_Export-----------------------------------#
101 print "\033[0;41m[+]Forward Secrecy not supported\033[0m"
102 return result.split("\n")
103
104104 def key_check(host,port):
105 for line in basic_connect(host,port):
106 if "Server public key is" in line:
107 #-----------------------------------XML_Export-----------------------------------#
108 if args.xmloutput:
109 key_size = ET.SubElement(scan, "key")
110 key_size.text = str(re.findall(r'\d+', line)[0])
111 #-----------------------------------XML_Export-----------------------------------#
112 print "[+]{}\n".format(line),
113 if int(re.findall(r'\d+', line)[0]) < 2048:
114 print ("\033[0;41m[+]Insecure key size, it must be higher than 2048 bits\033[0m")
115 return
116
105 for line in basic_connect(host,port):
106 if "Server public key is" in line:
107 #-----------------------------------XML_Export-----------------------------------#
108 if args.xmloutput:
109 key_size = ET.SubElement(scan, "key")
110 key_size.text = str(re.findall(r'\d+', line)[0])
111 #-----------------------------------XML_Export-----------------------------------#
112 print "[+]{}\n".format(line),
113 if int(re.findall(r'\d+', line)[0]) < 2048:
114 print ("\033[0;41m[+]Insecure key size, it must be higher than 2048 bits\033[0m")
115 return
116
117117 def ren_check(host,port):
118 for line in basic_connect(host,port):
119 if "Secure Renegotiation" in line:
120 if "IS NOT supported" in line:
121 #-----------------------------------XML_Export-----------------------------------#
122 if args.xmloutput:
123 renegotiation = ET.SubElement(scan, "renegotiation")
124 renegotiation.text="no"
125 #-----------------------------------XML_Export-----------------------------------#
126 print "\033[0;41m[+]Secure renegotiation not supported\033[0m"
127 else:
128 #-----------------------------------XML_Export-----------------------------------#
129 if args.xmloutput:
130 renegotiation = ET.SubElement(scan, "renegotiation")
131 renegotiation.text="yes"
132 #-----------------------------------XML_Export-----------------------------------#
133 print "[+]"+line
134 return
135
118 for line in basic_connect(host,port):
119 if "Secure Renegotiation" in line:
120 if "IS NOT supported" in line:
121 #-----------------------------------XML_Export-----------------------------------#
122 if args.xmloutput:
123 renegotiation = ET.SubElement(scan, "renegotiation")
124 renegotiation.text="no"
125 #-----------------------------------XML_Export-----------------------------------#
126 print "\033[0;41m[+]Secure renegotiation not supported\033[0m"
127 else:
128 #-----------------------------------XML_Export-----------------------------------#
129 if args.xmloutput:
130 renegotiation = ET.SubElement(scan, "renegotiation")
131 renegotiation.text="yes"
132 #-----------------------------------XML_Export-----------------------------------#
133 print "[+]"+line
134 return
135
136136
137137 def sign_check(host,port):
138 for line in sign_connect(host,port):
139 if "Signature Algorithm" in line:
140 insecure = False
141 for insecure_cypher in openssl_insecure_cyphers:
142 if insecure_cypher in line or insecure_cypher.upper() in line or insecure_cypher.lower() in line:
143 insecure = True
144 print "\033[0;41m[+]{}\033[0m\n".format(line.replace(" ","")),
145 #-----------------------------------XML_Export-----------------------------------#
146 if args.xmloutput:
147 signature_cipher = ET.SubElement(scan, line.replace(" Signature Algorithm: ",""))
148 signature_cipher.text = "signature insecure"
149 #-----------------------------------XML_Export-----------------------------------#
150 break
151 if not insecure:
152 #-----------------------------------XML_Export-----------------------------------#
153 if args.xmloutput:
154 signature_cipher = ET.SubElement(scan, line.replace(" Signature Algorithm: ",""))
155 signature_cipher.text = "signature secure"
156 #-----------------------------------XML_Export-----------------------------------#
157 print "[+]"+line.replace(" ","")
158
159 def serv_check(host,port):
160 print "[+]Protocols supported by the server:"
161 for line in complex_connect(host,port):
162 for i,protocol in enumerate(openssl_protocols):
163 if line.endswith(openssl_protocols[protocol]):
164 if openssl_protocols[protocol] == "SSLv3" or openssl_protocols[protocol] == "TLSv1":
165 print " \033[0;41m"+openssl_protocols[protocol],
166 else:
167 print " "+openssl_protocols[protocol],
168 #-----------------------------------XML_Export-----------------------------------#
169 if args.xmloutput:
170 protocolx = ET.SubElement(scan, openssl_protocols[protocol])
171 protocolx.text="yes"
172 #-----------------------------------XML_Export-----------------------------------#
173 if "Cipher " in line:
174 print "|| Default cipher:{}\033[0m".format(line.replace(" Cipher : ","").replace("0000",""))
175
176 def cyph_check(host,port):
177 print "[+]Ciphers supported by the server (it may takes a minute):"
178 for line in cypher_connect(host,port):
179 if "Cipher : " in line:
180 insecure = False
181 for insecure_cypher in openssl_insecure_cyphers:
182 if insecure_cypher in line or insecure_cypher.upper() in line or insecure_cypher.lower() in line:
183 #-----------------------------------XML_Export-----------------------------------#
184 if args.xmloutput:
185 cypher = ET.SubElement(scan, line.replace(" Cipher : ",""))
186 cypher.text = "insecure"
187 #-----------------------------------XML_Export-----------------------------------#
188 print " \033[0;41m{}\033[0m\n".format(line.replace(" Cipher : ","Supported cipher suite: [INSECURE] ")),
189 insecure = True
190 break
191 if not insecure:
192 #-----------------------------------XML_Export-----------------------------------#
193 if args.xmloutput:
194 cypher = ET.SubElement(scan, line.replace(" Cipher : ",""))
195 cypher.text = "secure"
196 #-----------------------------------XML_Export-----------------------------------#
197 print line.replace(" Cipher : "," Supported cipher suite: [SECURE] ")
138 for line in sign_connect(host,port):
139 if "Signature Algorithm" in line:
140 insecure = False
141 for insecure_cypher in openssl_insecure_cyphers:
142 if insecure_cypher in line or insecure_cypher.upper() in line or insecure_cypher.lower() in line:
143 insecure = True
144 print "\033[0;41m[+]{}\033[0m\n".format(line.replace(" ","")),
145 #-----------------------------------XML_Export-----------------------------------#
146 if args.xmloutput:
147 signature_cipher = ET.SubElement(scan, line.replace(" Signature Algorithm: ",""))
148 signature_cipher.text = "signature insecure"
149 #-----------------------------------XML_Export-----------------------------------#
150 break
151 if not insecure:
152 #-----------------------------------XML_Export-----------------------------------#
153 if args.xmloutput:
154 signature_cipher = ET.SubElement(scan, line.replace(" Signature Algorithm: ",""))
155 signature_cipher.text = "signature secure"
156 #-----------------------------------XML_Export-----------------------------------#
157 print "[+]"+line.replace(" ","")
158
159 def serv_check(host,port):
160 print "[+]Protocols supported by the server:"
161 for line in complex_connect(host,port):
162 for i,protocol in enumerate(openssl_protocols):
163 if line.endswith(openssl_protocols[protocol]):
164 if openssl_protocols[protocol] == "SSLv3" or openssl_protocols[protocol] == "TLSv1":
165 print " \033[0;41m"+openssl_protocols[protocol],
166 else:
167 print " "+openssl_protocols[protocol],
168 #-----------------------------------XML_Export-----------------------------------#
169 if args.xmloutput:
170 protocolx = ET.SubElement(scan, openssl_protocols[protocol])
171 protocolx.text="yes"
172 #-----------------------------------XML_Export-----------------------------------#
173 if "Cipher " in line:
174 print "|| Default cipher:{}\033[0m".format(line.replace(" Cipher : ","").replace("0000",""))
175
176 def cyph_check(host,port):
177 print "[+]Ciphers supported by the server (it may takes a minute):"
178 for line in cypher_connect(host,port):
179 if "Cipher : " in line:
180 insecure = False
181 for insecure_cypher in openssl_insecure_cyphers:
182 if insecure_cypher in line or insecure_cypher.upper() in line or insecure_cypher.lower() in line:
183 #-----------------------------------XML_Export-----------------------------------#
184 if args.xmloutput:
185 cypher = ET.SubElement(scan, line.replace(" Cipher : ",""))
186 cypher.text = "insecure"
187 #-----------------------------------XML_Export-----------------------------------#
188 print " \033[0;41m{}\033[0m\n".format(line.replace(" Cipher : ","Supported cipher suite: [INSECURE] ")),
189 insecure = True
190 break
191 if not insecure:
192 #-----------------------------------XML_Export-----------------------------------#
193 if args.xmloutput:
194 cypher = ET.SubElement(scan, line.replace(" Cipher : ",""))
195 cypher.text = "secure"
196 #-----------------------------------XML_Export-----------------------------------#
197 print line.replace(" Cipher : "," Supported cipher suite: [SECURE] ")
198198
199199 def forw_check(host,port):
200 for line in forward_connect(host,port):
201 if "Cipher : " in line:
202 #-----------------------------------XML_Export-----------------------------------#
203 if args.xmloutput:
204 forward_secrecy = ET.SubElement(scan, "forward_secrecy")
205 forward_secrecy.text="yes"
206 #-----------------------------------XML_Export-----------------------------------#
207 print "[+]{} (prefered)".format(line.replace(" Cipher : ","Forward Secrecy supported: "))
208 return
209
200 for line in forward_connect(host,port):
201 if "Cipher : " in line:
202 #-----------------------------------XML_Export-----------------------------------#
203 if args.xmloutput:
204 forward_secrecy = ET.SubElement(scan, "forward_secrecy")
205 forward_secrecy.text="yes"
206 #-----------------------------------XML_Export-----------------------------------#
207 print "[+]{} (prefered)".format(line.replace(" Cipher : ","Forward Secrecy supported: "))
208 return
209
210210 def heart_check(host,port):
211 for line in tlsdebug_connect(host,port):
212 if "TLS server extension heartbeat" in line :
213 #-----------------------------------XML_Export-----------------------------------#
214 if args.xmloutput:
215 heartbeat = ET.SubElement(scan, "heartbeat")
216 heartbeat.text = "yes"
217 #-----------------------------------XML_Export-----------------------------------#
218 print "\033[0;41m[+]Heartbeat extension vulnerable\033[0m"
219 return;
211 for line in tlsdebug_connect(host,port):
212 if "TLS server extension heartbeat" in line :
213 #-----------------------------------XML_Export-----------------------------------#
214 if args.xmloutput:
215 heartbeat = ET.SubElement(scan, "heartbeat")
216 heartbeat.text = "yes"
217 #-----------------------------------XML_Export-----------------------------------#
218 print "\033[0;41m[+]Heartbeat extension vulnerable\033[0m"
219 return;
220220 #-----------------------------------XML_Export-----------------------------------#
221 if args.xmloutput:
222 heartbeat = ET.SubElement(scan, "heartbeat")
223 heartbeat.text = "no"
224 #-----------------------------------XML_Export-----------------------------------#
225 print "[+]Heartbeat extension disabled"
226
221 if args.xmloutput:
222 heartbeat = ET.SubElement(scan, "heartbeat")
223 heartbeat.text = "no"
224 #-----------------------------------XML_Export-----------------------------------#
225 print "[+]Heartbeat extension disabled"
226
227227 def crime_check(host,port):
228 for line in basic_connect(host,port):
229 if "Compression: NONE" in line:
230 #-----------------------------------XML_Export-----------------------------------#
231 if args.xmloutput:
232 crime = ET.SubElement(scan, "crime")
233 crime.text = "no"
234 #-----------------------------------XML_Export-----------------------------------#
235 print "[+]Compression disabled, CRIME is prevented"
236 return
237 elif "Compression: " in line:
238 #-----------------------------------XML_Export-----------------------------------#
239 if args.xmloutput:
240 crime = ET.SubElement(scan, "crime")
241 crime.text = "yes"
242 #-----------------------------------XML_Export-----------------------------------#
243 print ("\033[0;41m[+]Potentially vulnerable to CRIME:{}\033[0m").format(line)
244 return
245
228 for line in basic_connect(host,port):
229 if "Compression: NONE" in line:
230 #-----------------------------------XML_Export-----------------------------------#
231 if args.xmloutput:
232 crime = ET.SubElement(scan, "crime")
233 crime.text = "no"
234 #-----------------------------------XML_Export-----------------------------------#
235 print "[+]Compression disabled, CRIME is prevented"
236 return
237 elif "Compression: " in line:
238 #-----------------------------------XML_Export-----------------------------------#
239 if args.xmloutput:
240 crime = ET.SubElement(scan, "crime")
241 crime.text = "yes"
242 #-----------------------------------XML_Export-----------------------------------#
243 print ("\033[0;41m[+]Potentially vulnerable to CRIME:{}\033[0m").format(line)
244 return
245
246246 print """\n\033[0;33m
247247 ___ ___ _ ___ _ _
248248 / __/ __| | / __| |_ ___ __| |_
250250 |___/___/____\___|_||_\___\__|_\_\ \033[0m
251251
252252 Version v1.0: November 2014
253 Morgan Lemarechal\n"""
253 Morgan Lemarechal\n"""
254254
255255 if args.xmloutput:
256 root = ET.Element("sslcheck")
257
256 root = ET.Element("sslcheck")
257
258258 for host in args.host:
259
260 if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",host):
261 host_ip = host
262 host_name = ""
263 #host_name = subprocess.check_output("dig -x {} +short|sed 's/\.$//g'".format(host),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE).rstrip()
264 print "[+]Perfoming the scan of {}".format(host_ip)
265 else:
266 host_name = host
267 host_ip = subprocess.check_output("nslookup "+host+" | tail -2 | head -1|awk '{print $2}'",shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE).rstrip()
268 print "[+]Perfoming the scan of {}|{}".format(host_name,host_ip)
269
270 try:
271 #-----------------------------------XML_Export-----------------------------------#
272 if args.xmloutput:
273 scan = ET.SubElement(root, "scan")
274 scan.set('host',host_ip)
275 scan.set('port',str(args.port))
276 scan.set('hostname',host_name)
277 #-----------------------------------XML_Export-----------------------------------#
278 connection_test(host,args.port)
279 for scanning in program_options:
280 if args.choice == "all" or scanning in args.choice:
281 if not scanning == "all":
282 action = scanning+"_check"
283 globals()[action](host,args.port)
284
285 except KeyboardInterrupt:
286 print "[+]Interrupting SSLcheck..."
287 exit(1)
288
289 #-----------------------------------XML_Export-----------------------------------#
259
260 if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",host):
261 host_ip = host
262 host_name = ""
263 #host_name = subprocess.check_output("dig -x {} +short|sed 's/\.$//g'".format(host),shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE).rstrip()
264 print "[+]Perfoming the scan of {}".format(host_ip)
265 else:
266 host_name = host
267 host_ip = subprocess.check_output("nslookup "+host+" | tail -2 | head -1|awk '{print $2}'",shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE).rstrip()
268 print "[+]Perfoming the scan of {}|{}".format(host_name,host_ip)
269
270 try:
271 #-----------------------------------XML_Export-----------------------------------#
272 if args.xmloutput:
273 scan = ET.SubElement(root, "scan")
274 scan.set('host',host_ip)
275 scan.set('port',str(args.port))
276 scan.set('hostname',host_name)
277 #-----------------------------------XML_Export-----------------------------------#
278 connection_test(host,args.port)
279 for scanning in program_options:
280 if args.choice == "all" or scanning in args.choice:
281 if not scanning == "all":
282 action = scanning+"_check"
283 globals()[action](host,args.port)
284
285 except KeyboardInterrupt:
286 print "[+]Interrupting SSLcheck..."
287 exit(1)
288
289 #-----------------------------------XML_Export-----------------------------------#
290290 if args.xmloutput:
291 tree = ET.ElementTree(root)
292 try:
293 fo = open(args.xmloutput, "w")
294 tree.write(fo)
295 fo.close()
296 except IOError:
297 sys.exit('\033[0;41m[+]XML export failed.\033[0m')
298 #-----------------------------------XML_Export-----------------------------------#
291 tree = ET.ElementTree(root)
292 try:
293 fo = open(args.xmloutput, "w")
294 tree.write(fo)
295 fo.close()
296 except IOError:
297 sys.exit('\033[0;41m[+]XML export failed.\033[0m')
298 #-----------------------------------XML_Export-----------------------------------#
0 #!/usr/bin/env python
1 # -*- coding: utf-8 -*-
2 '''
3 Faraday Penetration Test IDE
4 Copyright (C) 2015 Infobyte LLC (http://www.infobytesec.com/)
5 See the file 'doc/LICENSE' for the license information
6
7 '''
8
9 import subprocess
10 import argparse
11 from lxml import etree as ET
12 import os.path
13 from os.path import basename
14 import __builtin__
15 import re
16
17 from wcscans import phpini, webconfig
18
19 def is_valid_address(parser,arg):
20 if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",arg):
21 return arg
22 else:
23 parser.error('{} is not a valid address!'.format(arg))
24
25 def are_valid_files(parser,*args):
26 for arg in args:
27 return is_valid_file(parser, arg)
28
29 def is_valid_file(parser, arg):
30 if not os.path.isfile(arg):
31 parser.error('{} does not exist!'.format(arg))
32 else:
33 try:
34 if re.search("XML",subprocess.check_output("file {}".format(arg),
35 shell=True,
36 stdin=subprocess.PIPE,
37 stderr=subprocess.PIPE)):
38 if not os.path.isfile("wcscans/DotNetConfig.xsd"):
39 parser.error("DotNetConfig.xsd is missing, cannot validate the web.config".format(arg))
40 else:
41 f = open("wcscans/DotNetConfig.xsd","r")
42 webconfig_schema = ET.XMLSchema(ET.parse(f))
43 webconfig_schema.validate(ET.parse(arg))
44
45 if re.search("\.ini$",arg):
46 pass
47
48 return arg
49 except ET.ParseError:
50 parser.error("{} is not a valid file!".format(arg))
51
52 parser = argparse.ArgumentParser(prog='Wcscan')
53 parser.add_argument('files', nargs='+',
54 type=lambda *args: are_valid_files(parser,*args),
55 help='''configuration files as inputs,
56 separated by a space.
57 currently supported:
58 php.ini and web.config''')
59 parser.add_argument('-r', action='store_true', dest='recmode',
60 help='enable the recommendation mode')
61 parser.add_argument('-host', action='store',
62 type=lambda arg: is_valid_address(parser,arg),
63 dest='host', default="127.0.0.1",
64 help='to give the IP address of the conf file owner')
65 parser.add_argument('-port', action='store', type=int,
66 dest='port', default="80",
67 help='to give a associated port')
68 parser.add_argument('--xml', action='store', type=str, dest='xmloutput',
69 help='enabled the XML output in a specified file')
70 parser.add_argument('--version', "-v", action='version',
71 version='%(prog)s v1.0 by Morgan Lemarechal')
72 args = parser.parse_args()
73
74 print basename("/a/b/c.txt")
75 print """\033[0;33m
76 __ __
77 \ \ /\ / /__ ___ ___ __ _ _ __
78 \ \/ \/ / __/ __|/ __/ _` | '_ \
79 \ /\ / (__\__ \ (_| (_| | | | |
80 \/ \/ \___|___/\___\__,_|_| |_|
81 Version v1.0: November 2014
82 Morgan Lemarechal\033[0m"""
83
84 if args.xmloutput:
85 root = ET.Element("wcscan")
86 else:
87 scan = None
88
89 for file in args.files:
90 try:
91 print "\n[+]Perfoming the scan of \033[1;30m{}\033[0m...".format(file)
92
93 #------------------------------XML_Export------------------------------#
94 if args.xmloutput:
95 scan = ET.SubElement(root, "scan")
96 scan.set('file',basename(file))
97 scan.set('host',args.host)
98 scan.set('port',str(args.port))
99 #------------------------------XML_Export------------------------------#
100
101 if re.search("XML",subprocess.check_output("file {}".format(file),
102 shell=True,
103 stdin=subprocess.PIPE,
104 stderr=subprocess.PIPE)):
105 #------------------------------XML_Export------------------------------#
106 if args.xmloutput:
107 scan.set('type','webconfig')
108 #------------------------------XML_Export------------------------------#
109 webconfig.scanner(file,args.recmode,scan)
110
111 if re.search("\.ini$",file):
112 #------------------------------XML_Export------------------------------#
113 if args.xmloutput:
114 scan.set('type','phpini')
115 #------------------------------XML_Export------------------------------#
116 phpini.scanner(file,args.recmode,scan)
117
118 #------------------------------XML_Export------------------------------#
119 if args.xmloutput:
120 tree = ET.ElementTree(root)
121 try:
122 fo = open(args.xmloutput, "w")
123 tree.write(fo)
124 fo.close()
125 except IOError:
126 sys.exit('\033[0;41m[+]XML export failed.\033[0m')
127 #------------------------------XML_Export------------------------------#
128
129 except KeyboardInterrupt:
130 print "\n[+]Interrupting the checking of \033[1;30m{}\033[0m...".format(file)
0 <?xml version="1.0" encoding="us-ascii"?>
1 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense" elementFormDefault="qualified" attributeFormDefault="unqualified" vs:helpNamespace="http://schemas.microsoft.com/.NetConfiguration/v2.0">
2 <xs:element name="configuration">
3 <xs:complexType>
4 <xs:choice minOccurs="0" maxOccurs="unbounded">
5 <xs:any namespace="##any" processContents="lax" />
6 </xs:choice>
7 </xs:complexType>
8 </xs:element>
9 <xs:element name="location">
10 <xs:complexType>
11 <xs:choice>
12 <xs:any namespace="##any" processContents="lax" />
13 </xs:choice>
14 <xs:attribute name="path" type="xs:string" use="optional" />
15 <xs:attribute name="allowOverride" type="small_boolean_Type" use="optional" />
16 </xs:complexType>
17 </xs:element>
18 <xs:element name="configSections" type="configSections_type" />
19 <xs:complexType name="configSectionGroup_type">
20 <xs:choice>
21 <xs:group ref="configTypeDefinition" maxOccurs="unbounded" />
22 </xs:choice>
23 <xs:attribute name="name" type="xs:string" use="required" />
24 <xs:attribute name="type" type="xs:string" use="optional" />
25 </xs:complexType>
26 <xs:complexType name="configSections_type">
27 <xs:choice minOccurs="0" maxOccurs="unbounded">
28 <xs:group ref="configTypeDefinition" minOccurs="0" maxOccurs="unbounded" />
29 </xs:choice>
30 </xs:complexType>
31 <xs:group name="configTypeDefinition">
32 <xs:choice>
33 <xs:element name="section" type="configSection_section" minOccurs="0" maxOccurs="unbounded" />
34 <xs:element name="sectionGroup" type="configSectionGroup_type" minOccurs="0" maxOccurs="unbounded" />
35 </xs:choice>
36 </xs:group>
37 <xs:complexType name="configSection_section">
38 <xs:attribute name="name" type="xs:string" use="required" />
39 <xs:attribute name="type" type="xs:string" use="required" />
40 <xs:attribute name="requirePermission" type="boolean_Type" use="optional" />
41 <xs:attribute name="allowLocation" type="boolean_Type" use="optional" />
42 <xs:attribute name="allowOverride" type="boolean_Type" use="optional" />
43 <xs:attribute name="restartOnExternalChanges" type="boolean_Type" use="optional" />
44 <xs:attribute name="allowDefinition" use="optional">
45 <xs:simpleType>
46 <xs:restriction base="xs:string">
47 <xs:enumeration value="MachineToWebRoot" />
48 <xs:enumeration value="MachineToApplication" />
49 <xs:enumeration value="MachineOnly" />
50 <xs:enumeration value="Everywhere" />
51 </xs:restriction>
52 </xs:simpleType>
53 </xs:attribute>
54 <xs:attribute name="allowExeDefinition" use="optional">
55 <xs:simpleType>
56 <xs:restriction base="xs:string">
57 <xs:enumeration value="MachineOnly" />
58 <xs:enumeration value="MachineToApplication" />
59 <xs:enumeration value="MachineToLocalUser" />
60 <xs:enumeration value="MachineToRoamingUser" />
61 </xs:restriction>
62 </xs:simpleType>
63 </xs:attribute>
64 </xs:complexType>
65 <xs:simpleType name="Infinite_or_int">
66 <xs:union memberTypes="Infinite xs:int" />
67 </xs:simpleType>
68 <xs:simpleType name="Infinite">
69 <xs:restriction base="xs:string">
70 <xs:enumeration value="Infinite" />
71 </xs:restriction>
72 </xs:simpleType>
73 <xs:simpleType name="small_boolean_Type">
74 <xs:restriction base="xs:NMTOKEN">
75 <xs:enumeration value="false" />
76 <xs:enumeration value="true" />
77 </xs:restriction>
78 </xs:simpleType>
79 <xs:simpleType name="boolean_Type">
80 <xs:restriction base="xs:NMTOKEN">
81 <xs:enumeration value="false" />
82 <xs:enumeration value="true" />
83 <xs:enumeration value="True" />
84 <xs:enumeration value="False" />
85 </xs:restriction>
86 </xs:simpleType>
87 <xs:element name="appSettings" vs:help="configuration/appSettings">
88 <xs:complexType>
89 <xs:choice minOccurs="0" maxOccurs="unbounded">
90 <xs:element name="add" vs:help="configuration/appSettings/add">
91 <xs:complexType>
92 <xs:attribute name="key" type="xs:string" use="optional" />
93 <xs:attribute name="value" type="xs:string" use="optional" />
94 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
95 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
96 <xs:attribute name="lockElements" type="xs:string" use="optional" />
97 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
98 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
99 </xs:complexType>
100 </xs:element>
101 <xs:element name="remove" vs:help="configuration/appSettings/remove">
102 <xs:complexType>
103 <xs:attribute name="key" type="xs:string" use="optional" />
104 </xs:complexType>
105 </xs:element>
106 <xs:element name="clear" vs:help="configuration/appSettings/clear">
107 <xs:complexType>
108 <!--tag is empty-->
109 </xs:complexType>
110 </xs:element>
111 </xs:choice>
112 <xs:attribute name="file" type="xs:string" use="optional" />
113 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
114 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
115 <xs:attribute name="lockElements" type="xs:string" use="optional" />
116 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
117 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
118 <xs:attribute name="configSource" type="xs:string" use="optional" />
119 </xs:complexType>
120 </xs:element>
121 <xs:element name="assemblyBinding" vs:help="configuration/assemblyBinding" />
122 <xs:element name="configProtectedData" vs:help="configuration/configProtectedData">
123 <xs:complexType>
124 <xs:choice minOccurs="0" maxOccurs="unbounded">
125 <xs:element name="providers" vs:help="configuration/configProtectedData/providers">
126 <xs:complexType>
127 <xs:choice minOccurs="0" maxOccurs="unbounded">
128 <xs:element name="add" vs:help="configuration/configProtectedData/providers/add">
129 <xs:complexType>
130 <xs:attribute name="name" type="xs:string" use="required" />
131 <xs:attribute name="type" type="xs:string" use="required" />
132 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
133 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
134 <xs:attribute name="lockElements" type="xs:string" use="optional" />
135 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
136 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
137 </xs:complexType>
138 </xs:element>
139 <xs:element name="remove" vs:help="configuration/configProtectedData/providers/remove">
140 <xs:complexType>
141 <xs:attribute name="name" type="xs:string" use="required" />
142 </xs:complexType>
143 </xs:element>
144 <xs:element name="clear" vs:help="configuration/configProtectedData/providers/clear">
145 <xs:complexType>
146 <!--tag is empty-->
147 </xs:complexType>
148 </xs:element>
149 </xs:choice>
150 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
151 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
152 <xs:attribute name="lockElements" type="xs:string" use="optional" />
153 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
154 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
155 </xs:complexType>
156 </xs:element>
157 </xs:choice>
158 <xs:attribute name="defaultProvider" type="xs:string" use="optional" />
159 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
160 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
161 <xs:attribute name="lockElements" type="xs:string" use="optional" />
162 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
163 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
164 <xs:attribute name="configSource" type="xs:string" use="optional" />
165 </xs:complexType>
166 </xs:element>
167 <xs:element name="connectionStrings" vs:help="configuration/connectionStrings">
168 <xs:complexType>
169 <xs:choice minOccurs="0" maxOccurs="unbounded">
170 <xs:element name="add" vs:help="configuration/connectionStrings/add">
171 <xs:complexType>
172 <xs:attribute name="connectionString" type="xs:string" use="required" />
173 <xs:attribute name="name" type="xs:string" use="required" />
174 <xs:attribute name="providerName" type="xs:string" use="optional" />
175 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
176 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
177 <xs:attribute name="lockElements" type="xs:string" use="optional" />
178 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
179 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
180 </xs:complexType>
181 </xs:element>
182 <xs:element name="remove" vs:help="configuration/connectionStrings/remove">
183 <xs:complexType>
184 <xs:attribute name="name" type="xs:string" use="required" />
185 </xs:complexType>
186 </xs:element>
187 <xs:element name="clear" vs:help="configuration/connectionStrings/clear">
188 <xs:complexType>
189 <!--tag is empty-->
190 </xs:complexType>
191 </xs:element>
192 </xs:choice>
193 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
194 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
195 <xs:attribute name="lockElements" type="xs:string" use="optional" />
196 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
197 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
198 <xs:attribute name="configSource" type="xs:string" use="optional" />
199 </xs:complexType>
200 </xs:element>
201 <xs:element name="mscorlib" vs:help="configuration/mscorlib" />
202 <xs:element name="runtime" vs:help="configuration/runtime">
203 <xs:complexType>
204 <xs:choice minOccurs="0" maxOccurs="unbounded">
205 <xs:any namespace="##any" processContents="skip" />
206 </xs:choice>
207 <xs:anyAttribute processContents="skip" />
208 </xs:complexType>
209 </xs:element>
210 <xs:element name="satelliteassemblies" vs:help="configuration/satelliteassemblies" />
211 <xs:element name="startup" vs:help="configuration/startup" />
212 <xs:element name="system.codedom" vs:help="configuration/system.codedom" />
213 <xs:element name="system.data" vs:help="configuration/system.data">
214 <xs:complexType>
215 <xs:choice minOccurs="0" maxOccurs="unbounded">
216 <xs:any namespace="##any" processContents="skip" />
217 </xs:choice>
218 </xs:complexType>
219 </xs:element>
220 <xs:element name="system.data.dataset" vs:help="configuration/system.data.dataset" />
221 <xs:element name="system.data.odbc" vs:help="configuration/system.data.odbc" />
222 <xs:element name="system.data.oledb" vs:help="configuration/system.data.oledb" />
223 <xs:element name="system.data.oracleclient" vs:help="configuration/system.data.oracleclient" />
224 <xs:element name="system.data.sqlclient" vs:help="configuration/system.data.sqlclient" />
225 <xs:element name="system.diagnostics" vs:help="configuration/system.diagnostics">
226 <xs:complexType>
227 <xs:choice minOccurs="0" maxOccurs="unbounded">
228 <xs:element name="assert" vs:help="configuration/system.diagnostics/assert">
229 <xs:complexType>
230 <xs:attribute name="assertuienabled" type="small_boolean_Type" use="optional" />
231 <xs:attribute name="logfilename" type="xs:string" use="optional" />
232 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
233 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
234 <xs:attribute name="lockElements" type="xs:string" use="optional" />
235 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
236 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
237 </xs:complexType>
238 </xs:element>
239 <xs:element name="performanceCounters" vs:help="configuration/system.diagnostics/performanceCounters">
240 <xs:complexType>
241 <xs:attribute name="filemappingsize" type="xs:int" use="optional" />
242 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
243 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
244 <xs:attribute name="lockElements" type="xs:string" use="optional" />
245 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
246 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
247 </xs:complexType>
248 </xs:element>
249 <xs:element name="sharedListeners" vs:help="configuration/system.diagnostics/sharedListeners">
250 <xs:complexType>
251 <xs:choice minOccurs="0" maxOccurs="unbounded">
252 <xs:element name="add" vs:help="configuration/system.diagnostics/sharedListeners/add">
253 <xs:complexType>
254 <xs:choice minOccurs="0" maxOccurs="unbounded">
255 <xs:element name="filter" vs:help="configuration/system.diagnostics/sharedListeners/ListenerElement/filter">
256 <xs:complexType>
257 <xs:attribute name="initializeData" type="xs:string" use="optional" />
258 <xs:attribute name="type" type="xs:string" use="required" />
259 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
260 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
261 <xs:attribute name="lockElements" type="xs:string" use="optional" />
262 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
263 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
264 </xs:complexType>
265 </xs:element>
266 </xs:choice>
267 <xs:attribute name="name" type="xs:string" use="required" />
268 <xs:attribute name="traceOutputOptions" use="optional">
269 <xs:simpleType>
270 <xs:restriction base="xs:NMTOKEN">
271 <xs:enumeration value="Callstack" />
272 <xs:enumeration value="DateTime" />
273 <xs:enumeration value="LogicalOperationStack" />
274 <xs:enumeration value="None" />
275 <xs:enumeration value="ProcessId" />
276 <xs:enumeration value="ThreadId" />
277 <xs:enumeration value="Timestamp" />
278 </xs:restriction>
279 </xs:simpleType>
280 </xs:attribute>
281 <xs:attribute name="initializeData" type="xs:string" use="optional" />
282 <xs:attribute name="type" type="xs:string" use="optional" />
283 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
284 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
285 <xs:attribute name="lockElements" type="xs:string" use="optional" />
286 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
287 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
288 </xs:complexType>
289 </xs:element>
290 <xs:element name="remove" vs:help="configuration/system.diagnostics/sharedListeners/remove">
291 <xs:complexType>
292 <xs:choice minOccurs="0" maxOccurs="unbounded">
293 <xs:element name="filter" vs:help="configuration/system.diagnostics/sharedListeners/ListenerElement/filter">
294 <xs:complexType>
295 <xs:attribute name="initializeData" type="xs:string" use="optional" />
296 <xs:attribute name="type" type="xs:string" use="required" />
297 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
298 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
299 <xs:attribute name="lockElements" type="xs:string" use="optional" />
300 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
301 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
302 </xs:complexType>
303 </xs:element>
304 </xs:choice>
305 <xs:attribute name="name" type="xs:string" use="required" />
306 </xs:complexType>
307 </xs:element>
308 </xs:choice>
309 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
310 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
311 <xs:attribute name="lockElements" type="xs:string" use="optional" />
312 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
313 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
314 </xs:complexType>
315 </xs:element>
316 <xs:element name="sources" vs:help="configuration/system.diagnostics/sources">
317 <xs:complexType>
318 <xs:choice minOccurs="0" maxOccurs="unbounded">
319 <xs:element name="source" vs:help="configuration/system.diagnostics/sources/source">
320 <xs:complexType>
321 <xs:choice minOccurs="0" maxOccurs="unbounded">
322 <xs:element name="listeners" vs:help="configuration/system.diagnostics/sources/SourceElement/listeners">
323 <xs:complexType>
324 <xs:choice minOccurs="0" maxOccurs="unbounded">
325 <xs:element name="add" vs:help="configuration/system.diagnostics/sources/SourceElement/listeners/add">
326 <xs:complexType>
327 <xs:choice minOccurs="0" maxOccurs="unbounded">
328 <xs:element name="filter" vs:help="configuration/system.diagnostics/sources/SourceElement/listeners/ListenerElement/filter">
329 <xs:complexType>
330 <xs:attribute name="initializeData" type="xs:string" use="optional" />
331 <xs:attribute name="type" type="xs:string" use="required" />
332 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
333 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
334 <xs:attribute name="lockElements" type="xs:string" use="optional" />
335 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
336 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
337 </xs:complexType>
338 </xs:element>
339 </xs:choice>
340 <xs:attribute name="name" type="xs:string" use="required" />
341 <xs:attribute name="traceOutputOptions" use="optional">
342 <xs:simpleType>
343 <xs:restriction base="xs:NMTOKEN">
344 <xs:enumeration value="Callstack" />
345 <xs:enumeration value="DateTime" />
346 <xs:enumeration value="LogicalOperationStack" />
347 <xs:enumeration value="None" />
348 <xs:enumeration value="ProcessId" />
349 <xs:enumeration value="ThreadId" />
350 <xs:enumeration value="Timestamp" />
351 </xs:restriction>
352 </xs:simpleType>
353 </xs:attribute>
354 <xs:attribute name="initializeData" type="xs:string" use="optional" />
355 <xs:attribute name="type" type="xs:string" use="optional" />
356 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
357 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
358 <xs:attribute name="lockElements" type="xs:string" use="optional" />
359 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
360 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
361 </xs:complexType>
362 </xs:element>
363 <xs:element name="remove" vs:help="configuration/system.diagnostics/sources/SourceElement/listeners/remove">
364 <xs:complexType>
365 <xs:choice minOccurs="0" maxOccurs="unbounded">
366 <xs:element name="filter" vs:help="configuration/system.diagnostics/sources/SourceElement/listeners/ListenerElement/filter">
367 <xs:complexType>
368 <xs:attribute name="initializeData" type="xs:string" use="optional" />
369 <xs:attribute name="type" type="xs:string" use="optional" />
370 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
371 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
372 <xs:attribute name="lockElements" type="xs:string" use="optional" />
373 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
374 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
375 </xs:complexType>
376 </xs:element>
377 </xs:choice>
378 <xs:attribute name="name" type="xs:string" use="required" />
379 </xs:complexType>
380 </xs:element>
381 </xs:choice>
382 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
383 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
384 <xs:attribute name="lockElements" type="xs:string" use="optional" />
385 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
386 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
387 </xs:complexType>
388 </xs:element>
389 </xs:choice>
390 <xs:attribute name="name" type="xs:string" use="required" />
391 <xs:attribute name="switchName" type="xs:string" use="optional" />
392 <xs:attribute name="switchType" type="xs:string" use="optional" />
393 <xs:attribute name="switchValue" type="xs:string" use="optional" />
394 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
395 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
396 <xs:attribute name="lockElements" type="xs:string" use="optional" />
397 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
398 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
399 </xs:complexType>
400 </xs:element>
401 </xs:choice>
402 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
403 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
404 <xs:attribute name="lockElements" type="xs:string" use="optional" />
405 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
406 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
407 </xs:complexType>
408 </xs:element>
409 <xs:element name="switches" vs:help="configuration/system.diagnostics/switches">
410 <xs:complexType>
411 <xs:choice minOccurs="0" maxOccurs="unbounded">
412 <xs:element name="add" vs:help="configuration/system.diagnostics/switches/add">
413 <xs:complexType>
414 <xs:attribute name="name" type="xs:string" use="required" />
415 <xs:attribute name="value" type="xs:string" use="required" />
416 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
417 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
418 <xs:attribute name="lockElements" type="xs:string" use="optional" />
419 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
420 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
421 </xs:complexType>
422 </xs:element>
423 <xs:element name="remove" vs:help="configuration/system.diagnostics/switches/remove">
424 <xs:complexType>
425 <xs:attribute name="name" type="xs:string" use="required" />
426 </xs:complexType>
427 </xs:element>
428 <xs:element name="clear" vs:help="configuration/system.diagnostics/switches/clear">
429 <xs:complexType>
430 <!--tag is empty-->
431 </xs:complexType>
432 </xs:element>
433 </xs:choice>
434 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
435 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
436 <xs:attribute name="lockElements" type="xs:string" use="optional" />
437 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
438 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
439 </xs:complexType>
440 </xs:element>
441 <xs:element name="trace" vs:help="configuration/system.diagnostics/trace">
442 <xs:complexType>
443 <xs:choice minOccurs="0" maxOccurs="unbounded">
444 <xs:element name="listeners" vs:help="configuration/system.diagnostics/trace/listeners">
445 <xs:complexType>
446 <xs:choice minOccurs="0" maxOccurs="unbounded">
447 <xs:element name="add" vs:help="configuration/system.diagnostics/trace/listeners/add">
448 <xs:complexType>
449 <xs:choice minOccurs="0" maxOccurs="unbounded">
450 <xs:element name="filter" vs:help="configuration/system.diagnostics/trace/listeners/ListenerElement/filter">
451 <xs:complexType>
452 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
453 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
454 <xs:attribute name="lockElements" type="xs:string" use="optional" />
455 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
456 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
457 </xs:complexType>
458 </xs:element>
459 </xs:choice>
460 <xs:attribute name="name" type="xs:string" use="required" />
461 <xs:attribute name="traceOutputOptions" use="optional">
462 <xs:simpleType>
463 <xs:restriction base="xs:NMTOKEN">
464 <xs:enumeration value="Callstack" />
465 <xs:enumeration value="DateTime" />
466 <xs:enumeration value="LogicalOperationStack" />
467 <xs:enumeration value="None" />
468 <xs:enumeration value="ProcessId" />
469 <xs:enumeration value="ThreadId" />
470 <xs:enumeration value="Timestamp" />
471 </xs:restriction>
472 </xs:simpleType>
473 </xs:attribute>
474 <xs:attribute name="initializeData" type="xs:string" use="optional" />
475 <xs:attribute name="type" type="xs:string" use="optional" />
476 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
477 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
478 <xs:attribute name="lockElements" type="xs:string" use="optional" />
479 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
480 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
481 </xs:complexType>
482 </xs:element>
483 <xs:element name="remove" vs:help="configuration/system.diagnostics/trace/listeners/remove">
484 <xs:complexType>
485 <xs:choice minOccurs="0" maxOccurs="unbounded">
486 <xs:element name="filter" vs:help="configuration/system.diagnostics/trace/listeners/ListenerElement/filter">
487 <xs:complexType>
488 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
489 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
490 <xs:attribute name="lockElements" type="xs:string" use="optional" />
491 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
492 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
493 </xs:complexType>
494 </xs:element>
495 </xs:choice>
496 <xs:attribute name="name" type="xs:string" use="required" />
497 </xs:complexType>
498 </xs:element>
499 <xs:element name="clear" vs:help="configuration/system.diagnostics/trace/listeners/clear">
500 <xs:complexType>
501 <!--tag is empty-->
502 </xs:complexType>
503 </xs:element>
504 </xs:choice>
505 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
506 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
507 <xs:attribute name="lockElements" type="xs:string" use="optional" />
508 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
509 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
510 </xs:complexType>
511 </xs:element>
512 </xs:choice>
513 <xs:attribute name="autoflush" type="small_boolean_Type" use="optional" />
514 <xs:attribute name="indentsize" type="xs:int" use="optional" />
515 <xs:attribute name="useGlobalLock" type="small_boolean_Type" use="optional" />
516 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
517 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
518 <xs:attribute name="lockElements" type="xs:string" use="optional" />
519 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
520 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
521 </xs:complexType>
522 </xs:element>
523 </xs:choice>
524 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
525 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
526 <xs:attribute name="lockElements" type="xs:string" use="optional" />
527 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
528 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
529 <xs:attribute name="configSource" type="xs:string" use="optional" />
530 </xs:complexType>
531 </xs:element>
532 <xs:element name="system.runtime.remoting" vs:help="configuration/system.runtime.remoting" />
533 <xs:element name="system.webServer" vs:help="configuration/system.webServer" />
534 <xs:element name="system.windows.forms" vs:help="configuration/system.windows.forms">
535 <xs:complexType>
536 <xs:attribute name="jitDebugging" type="small_boolean_Type" use="optional" />
537 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
538 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
539 <xs:attribute name="lockElements" type="xs:string" use="optional" />
540 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
541 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
542 <xs:attribute name="configSource" type="xs:string" use="optional" />
543 </xs:complexType>
544 </xs:element>
545 <xs:element name="windows" vs:help="configuration/windows" />
546 <xs:element name="system.net" vs:help="configuration/system.net">
547 <xs:complexType>
548 <xs:choice minOccurs="0" maxOccurs="unbounded">
549 <xs:element name="authenticationModules" vs:help="configuration/system.net/authenticationModules">
550 <xs:complexType>
551 <xs:choice minOccurs="0" maxOccurs="unbounded">
552 <xs:element name="add" vs:help="configuration/system.net/authenticationModules/add">
553 <xs:complexType>
554 <xs:attribute name="type" type="xs:string" use="required" />
555 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
556 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
557 <xs:attribute name="lockElements" type="xs:string" use="optional" />
558 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
559 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
560 </xs:complexType>
561 </xs:element>
562 <xs:element name="remove" vs:help="configuration/system.net/authenticationModules/remove">
563 <xs:complexType>
564 <xs:attribute name="type" type="xs:string" use="required" />
565 </xs:complexType>
566 </xs:element>
567 <xs:element name="clear" vs:help="configuration/system.net/authenticationModules/clear">
568 <xs:complexType>
569 <!--tag is empty-->
570 </xs:complexType>
571 </xs:element>
572 </xs:choice>
573 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
574 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
575 <xs:attribute name="lockElements" type="xs:string" use="optional" />
576 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
577 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
578 <xs:attribute name="configSource" type="xs:string" use="optional" />
579 </xs:complexType>
580 </xs:element>
581 <xs:element name="connectionManagement" vs:help="configuration/system.net/connectionManagement">
582 <xs:complexType>
583 <xs:choice minOccurs="0" maxOccurs="unbounded">
584 <xs:element name="add" vs:help="configuration/system.net/connectionManagement/add">
585 <xs:complexType>
586 <xs:attribute name="address" type="xs:string" use="required" />
587 <xs:attribute name="maxconnection" type="xs:int" use="required" />
588 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
589 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
590 <xs:attribute name="lockElements" type="xs:string" use="optional" />
591 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
592 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
593 </xs:complexType>
594 </xs:element>
595 <xs:element name="remove" vs:help="configuration/system.net/connectionManagement/remove">
596 <xs:complexType>
597 <xs:attribute name="address" type="xs:string" use="required" />
598 </xs:complexType>
599 </xs:element>
600 <xs:element name="clear" vs:help="configuration/system.net/connectionManagement/clear">
601 <xs:complexType>
602 <!--tag is empty-->
603 </xs:complexType>
604 </xs:element>
605 </xs:choice>
606 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
607 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
608 <xs:attribute name="lockElements" type="xs:string" use="optional" />
609 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
610 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
611 <xs:attribute name="configSource" type="xs:string" use="optional" />
612 </xs:complexType>
613 </xs:element>
614 <xs:element name="defaultProxy" vs:help="configuration/system.net/defaultProxy">
615 <xs:complexType>
616 <xs:choice minOccurs="0" maxOccurs="unbounded">
617 <xs:element name="bypasslist" vs:help="configuration/system.net/defaultProxy/bypasslist">
618 <xs:complexType>
619 <xs:choice minOccurs="0" maxOccurs="unbounded">
620 <xs:element name="add" vs:help="configuration/system.net/defaultProxy/bypasslist/add">
621 <xs:complexType>
622 <xs:attribute name="address" type="xs:string" use="required" />
623 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
624 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
625 <xs:attribute name="lockElements" type="xs:string" use="optional" />
626 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
627 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
628 </xs:complexType>
629 </xs:element>
630 <xs:element name="remove" vs:help="configuration/system.net/defaultProxy/bypasslist/remove">
631 <xs:complexType>
632 <xs:attribute name="address" type="xs:string" use="required" />
633 </xs:complexType>
634 </xs:element>
635 <xs:element name="clear" vs:help="configuration/system.net/defaultProxy/bypasslist/clear">
636 <xs:complexType>
637 <!--tag is empty-->
638 </xs:complexType>
639 </xs:element>
640 </xs:choice>
641 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
642 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
643 <xs:attribute name="lockElements" type="xs:string" use="optional" />
644 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
645 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
646 </xs:complexType>
647 </xs:element>
648 <xs:element name="module" vs:help="configuration/system.net/defaultProxy/module">
649 <xs:complexType>
650 <xs:attribute name="type" type="xs:string" use="optional" />
651 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
652 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
653 <xs:attribute name="lockElements" type="xs:string" use="optional" />
654 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
655 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
656 </xs:complexType>
657 </xs:element>
658 <xs:element name="proxy" vs:help="configuration/system.net/defaultProxy/proxy">
659 <xs:complexType>
660 <xs:attribute name="autoDetect" use="optional">
661 <xs:simpleType>
662 <xs:restriction base="xs:NMTOKEN">
663 <xs:enumeration value="False" />
664 <xs:enumeration value="True" />
665 <xs:enumeration value="Unspecified" />
666 </xs:restriction>
667 </xs:simpleType>
668 </xs:attribute>
669 <xs:attribute name="bypassonlocal" use="optional">
670 <xs:simpleType>
671 <xs:restriction base="xs:NMTOKEN">
672 <xs:enumeration value="False" />
673 <xs:enumeration value="True" />
674 <xs:enumeration value="Unspecified" />
675 </xs:restriction>
676 </xs:simpleType>
677 </xs:attribute>
678 <xs:attribute name="proxyaddress" type="xs:string" use="optional" />
679 <xs:attribute name="scriptLocation" type="xs:string" use="optional" />
680 <xs:attribute name="usesystemdefault" use="optional">
681 <xs:simpleType>
682 <xs:restriction base="xs:NMTOKEN">
683 <xs:enumeration value="False" />
684 <xs:enumeration value="True" />
685 <xs:enumeration value="Unspecified" />
686 </xs:restriction>
687 </xs:simpleType>
688 </xs:attribute>
689 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
690 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
691 <xs:attribute name="lockElements" type="xs:string" use="optional" />
692 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
693 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
694 </xs:complexType>
695 </xs:element>
696 </xs:choice>
697 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
698 <xs:attribute name="useDefaultCredentials" type="small_boolean_Type" use="optional" />
699 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
700 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
701 <xs:attribute name="lockElements" type="xs:string" use="optional" />
702 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
703 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
704 <xs:attribute name="configSource" type="xs:string" use="optional" />
705 </xs:complexType>
706 </xs:element>
707 <xs:element name="requestCaching" vs:help="configuration/system.net/requestCaching">
708 <xs:complexType>
709 <xs:choice minOccurs="0" maxOccurs="unbounded">
710 <xs:element name="defaultFtpCachePolicy" vs:help="configuration/system.net/requestCaching/defaultFtpCachePolicy">
711 <xs:complexType>
712 <xs:attribute name="policyLevel" use="optional">
713 <xs:simpleType>
714 <xs:restriction base="xs:NMTOKEN">
715 <xs:enumeration value="BypassCache" />
716 <xs:enumeration value="CacheIfAvailable" />
717 <xs:enumeration value="CacheOnly" />
718 <xs:enumeration value="Default" />
719 <xs:enumeration value="NoCacheNoStore" />
720 <xs:enumeration value="Reload" />
721 <xs:enumeration value="Revalidate" />
722 </xs:restriction>
723 </xs:simpleType>
724 </xs:attribute>
725 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
726 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
727 <xs:attribute name="lockElements" type="xs:string" use="optional" />
728 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
729 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
730 </xs:complexType>
731 </xs:element>
732 <xs:element name="defaultHttpCachePolicy" vs:help="configuration/system.net/requestCaching/defaultHttpCachePolicy">
733 <xs:complexType>
734 <xs:attribute name="maximumAge" type="xs:string" use="optional" />
735 <xs:attribute name="maximumStale" type="xs:string" use="optional" />
736 <xs:attribute name="minimumFresh" type="xs:string" use="optional" />
737 <xs:attribute name="policyLevel" use="required">
738 <xs:simpleType>
739 <xs:restriction base="xs:NMTOKEN">
740 <xs:enumeration value="BypassCache" />
741 <xs:enumeration value="CacheIfAvailable" />
742 <xs:enumeration value="CacheOnly" />
743 <xs:enumeration value="CacheOrNextCacheOnly" />
744 <xs:enumeration value="Default" />
745 <xs:enumeration value="NoCacheNoStore" />
746 <xs:enumeration value="Refresh" />
747 <xs:enumeration value="Reload" />
748 <xs:enumeration value="Revalidate" />
749 </xs:restriction>
750 </xs:simpleType>
751 </xs:attribute>
752 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
753 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
754 <xs:attribute name="lockElements" type="xs:string" use="optional" />
755 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
756 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
757 </xs:complexType>
758 </xs:element>
759 </xs:choice>
760 <xs:attribute name="defaultPolicyLevel" use="optional">
761 <xs:simpleType>
762 <xs:restriction base="xs:NMTOKEN">
763 <xs:enumeration value="BypassCache" />
764 <xs:enumeration value="CacheIfAvailable" />
765 <xs:enumeration value="CacheOnly" />
766 <xs:enumeration value="Default" />
767 <xs:enumeration value="NoCacheNoStore" />
768 <xs:enumeration value="Reload" />
769 <xs:enumeration value="Revalidate" />
770 </xs:restriction>
771 </xs:simpleType>
772 </xs:attribute>
773 <xs:attribute name="disableAllCaching" type="small_boolean_Type" use="optional" />
774 <xs:attribute name="isPrivateCache" type="small_boolean_Type" use="optional" />
775 <xs:attribute name="unspecifiedMaximumAge" type="xs:string" use="optional" />
776 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
777 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
778 <xs:attribute name="lockElements" type="xs:string" use="optional" />
779 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
780 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
781 <xs:attribute name="configSource" type="xs:string" use="optional" />
782 </xs:complexType>
783 </xs:element>
784 <xs:element name="settings" vs:help="configuration/system.net/settings">
785 <xs:complexType>
786 <xs:choice minOccurs="0" maxOccurs="unbounded">
787 <xs:element name="httpWebRequest" vs:help="configuration/system.net/settings/httpWebRequest">
788 <xs:complexType>
789 <xs:attribute name="maximumErrorResponseLength" type="xs:int" use="optional" />
790 <xs:attribute name="maximumResponseHeadersLength" type="xs:int" use="optional" />
791 <xs:attribute name="maximumUnauthorizedUploadLength" type="xs:int" use="optional" />
792 <xs:attribute name="useUnsafeHeaderParsing" type="small_boolean_Type" use="optional" />
793 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
794 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
795 <xs:attribute name="lockElements" type="xs:string" use="optional" />
796 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
797 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
798 </xs:complexType>
799 </xs:element>
800 <xs:element name="ipv6" vs:help="configuration/system.net/settings/ipv6">
801 <xs:complexType>
802 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
803 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
804 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
805 <xs:attribute name="lockElements" type="xs:string" use="optional" />
806 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
807 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
808 </xs:complexType>
809 </xs:element>
810 <xs:element name="performanceCounters" vs:help="configuration/system.net/settings/performanceCounters">
811 <xs:complexType>
812 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
813 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
814 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
815 <xs:attribute name="lockElements" type="xs:string" use="optional" />
816 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
817 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
818 </xs:complexType>
819 </xs:element>
820 <xs:element name="servicePointManager" vs:help="configuration/system.net/settings/servicePointManager">
821 <xs:complexType>
822 <xs:attribute name="checkCertificateName" type="small_boolean_Type" use="optional" />
823 <xs:attribute name="checkCertificateRevocationList" type="small_boolean_Type" use="optional" />
824 <xs:attribute name="dnsRefreshTimeout" type="xs:int" use="optional" />
825 <xs:attribute name="enableDnsRoundRobin" type="small_boolean_Type" use="optional" />
826 <xs:attribute name="expect100Continue" type="small_boolean_Type" use="optional" />
827 <xs:attribute name="useNagleAlgorithm" type="small_boolean_Type" use="optional" />
828 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
829 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
830 <xs:attribute name="lockElements" type="xs:string" use="optional" />
831 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
832 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
833 </xs:complexType>
834 </xs:element>
835 <xs:element name="socket" vs:help="configuration/system.net/settings/socket">
836 <xs:complexType>
837 <xs:attribute name="alwaysUseCompletionPortsForAccept" type="small_boolean_Type" use="optional" />
838 <xs:attribute name="alwaysUseCompletionPortsForConnect" type="small_boolean_Type" use="optional" />
839 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
840 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
841 <xs:attribute name="lockElements" type="xs:string" use="optional" />
842 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
843 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
844 </xs:complexType>
845 </xs:element>
846 <xs:element name="webProxyScript" vs:help="configuration/system.net/settings/webProxyScript">
847 <xs:complexType>
848 <xs:attribute name="downloadTimeout" type="xs:string" use="optional" />
849 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
850 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
851 <xs:attribute name="lockElements" type="xs:string" use="optional" />
852 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
853 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
854 </xs:complexType>
855 </xs:element>
856 </xs:choice>
857 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
858 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
859 <xs:attribute name="lockElements" type="xs:string" use="optional" />
860 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
861 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
862 <xs:attribute name="configSource" type="xs:string" use="optional" />
863 </xs:complexType>
864 </xs:element>
865 <xs:element name="webRequestModules" vs:help="configuration/system.net/webRequestModules">
866 <xs:complexType>
867 <xs:choice minOccurs="0" maxOccurs="unbounded">
868 <xs:element name="add" vs:help="configuration/system.net/webRequestModules/add">
869 <xs:complexType>
870 <xs:attribute name="prefix" type="xs:string" use="required" />
871 <xs:attribute name="type" type="xs:string" use="optional" />
872 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
873 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
874 <xs:attribute name="lockElements" type="xs:string" use="optional" />
875 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
876 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
877 </xs:complexType>
878 </xs:element>
879 <xs:element name="remove" vs:help="configuration/system.net/webRequestModules/remove">
880 <xs:complexType>
881 <xs:attribute name="prefix" type="xs:string" use="required" />
882 </xs:complexType>
883 </xs:element>
884 <xs:element name="clear" vs:help="configuration/system.net/webRequestModules/clear">
885 <xs:complexType>
886 <!--tag is empty-->
887 </xs:complexType>
888 </xs:element>
889 </xs:choice>
890 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
891 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
892 <xs:attribute name="lockElements" type="xs:string" use="optional" />
893 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
894 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
895 <xs:attribute name="configSource" type="xs:string" use="optional" />
896 </xs:complexType>
897 </xs:element>
898 <xs:element name="mailSettings" vs:help="configuration/system.net/mailSettings">
899 <xs:complexType>
900 <xs:choice minOccurs="0" maxOccurs="unbounded">
901 <xs:element name="smtp" vs:help="configuration/system.net/mailSettings/smtp">
902 <xs:complexType>
903 <xs:choice minOccurs="0" maxOccurs="unbounded">
904 <xs:element name="network" vs:help="configuration/system.net/mailSettings/smtp/network">
905 <xs:complexType>
906 <xs:attribute name="defaultCredentials" type="small_boolean_Type" use="optional" />
907 <xs:attribute name="host" type="xs:string" use="optional" />
908 <xs:attribute name="password" type="xs:string" use="optional" />
909 <xs:attribute name="port" type="xs:int" use="optional" />
910 <xs:attribute name="userName" type="xs:string" use="optional" />
911 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
912 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
913 <xs:attribute name="lockElements" type="xs:string" use="optional" />
914 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
915 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
916 </xs:complexType>
917 </xs:element>
918 <xs:element name="specifiedPickupDirectory" vs:help="configuration/system.net/mailSettings/smtp/specifiedPickupDirectory">
919 <xs:complexType>
920 <xs:attribute name="pickupDirectoryLocation" type="xs:string" use="optional" />
921 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
922 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
923 <xs:attribute name="lockElements" type="xs:string" use="optional" />
924 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
925 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
926 </xs:complexType>
927 </xs:element>
928 </xs:choice>
929 <xs:attribute name="deliveryMethod" use="optional">
930 <xs:simpleType>
931 <xs:restriction base="xs:NMTOKEN">
932 <xs:enumeration value="Network" />
933 <xs:enumeration value="PickupDirectoryFromIis" />
934 <xs:enumeration value="SpecifiedPickupDirectory" />
935 </xs:restriction>
936 </xs:simpleType>
937 </xs:attribute>
938 <xs:attribute name="from" type="xs:string" use="optional" />
939 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
940 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
941 <xs:attribute name="lockElements" type="xs:string" use="optional" />
942 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
943 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
944 <xs:attribute name="configSource" type="xs:string" use="optional" />
945 </xs:complexType>
946 </xs:element>
947 </xs:choice>
948 </xs:complexType>
949 </xs:element>
950 </xs:choice>
951 </xs:complexType>
952 </xs:element>
953 <xs:element name="system.transactions" vs:help="configuration/system.transactions">
954 <xs:complexType>
955 <xs:choice minOccurs="0" maxOccurs="unbounded">
956 <xs:element name="defaultSettings" vs:help="configuration/system.transactions/defaultSettings">
957 <xs:complexType>
958 <xs:attribute name="distributedTransactionManagerName" type="xs:string" use="optional" />
959 <xs:attribute name="timeout" use="optional">
960 <xs:simpleType>
961 <xs:restriction base="xs:string">
962 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
963 </xs:restriction>
964 </xs:simpleType>
965 </xs:attribute>
966 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
967 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
968 <xs:attribute name="lockElements" type="xs:string" use="optional" />
969 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
970 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
971 <xs:attribute name="configSource" type="xs:string" use="optional" />
972 </xs:complexType>
973 </xs:element>
974 <xs:element name="machineSettings" vs:help="configuration/system.transactions/machineSettings">
975 <xs:complexType>
976 <xs:attribute name="maxTimeout" use="optional">
977 <xs:simpleType>
978 <xs:restriction base="xs:string">
979 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
980 </xs:restriction>
981 </xs:simpleType>
982 </xs:attribute>
983 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
984 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
985 <xs:attribute name="lockElements" type="xs:string" use="optional" />
986 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
987 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
988 <xs:attribute name="configSource" type="xs:string" use="optional" />
989 </xs:complexType>
990 </xs:element>
991 </xs:choice>
992 </xs:complexType>
993 </xs:element>
994 <xs:element name="system.web" vs:help="configuration/system.web">
995 <xs:complexType>
996 <xs:choice minOccurs="0" maxOccurs="unbounded">
997 <xs:element name="anonymousIdentification" vs:help="configuration/system.web/anonymousIdentification">
998 <xs:complexType>
999 <xs:attribute name="cookieless" use="optional">
1000 <xs:simpleType>
1001 <xs:restriction base="xs:NMTOKEN">
1002 <xs:enumeration value="AutoDetect" />
1003 <xs:enumeration value="UseCookies" />
1004 <xs:enumeration value="UseDeviceProfile" />
1005 <xs:enumeration value="UseUri" />
1006 </xs:restriction>
1007 </xs:simpleType>
1008 </xs:attribute>
1009 <xs:attribute name="cookieName" use="optional">
1010 <xs:simpleType>
1011 <xs:restriction base="xs:string">
1012 <xs:minLength value="1" />
1013 </xs:restriction>
1014 </xs:simpleType>
1015 </xs:attribute>
1016 <xs:attribute name="cookiePath" use="optional">
1017 <xs:simpleType>
1018 <xs:restriction base="xs:string">
1019 <xs:minLength value="1" />
1020 </xs:restriction>
1021 </xs:simpleType>
1022 </xs:attribute>
1023 <xs:attribute name="cookieProtection" use="optional">
1024 <xs:simpleType>
1025 <xs:restriction base="xs:NMTOKEN">
1026 <xs:enumeration value="All" />
1027 <xs:enumeration value="Encryption" />
1028 <xs:enumeration value="None" />
1029 <xs:enumeration value="Validation" />
1030 </xs:restriction>
1031 </xs:simpleType>
1032 </xs:attribute>
1033 <xs:attribute name="cookieRequireSSL" type="small_boolean_Type" use="optional" />
1034 <xs:attribute name="cookieSlidingExpiration" type="small_boolean_Type" use="optional" />
1035 <xs:attribute name="cookieTimeout" use="optional">
1036 <xs:simpleType>
1037 <xs:restriction base="xs:string">
1038 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1039 </xs:restriction>
1040 </xs:simpleType>
1041 </xs:attribute>
1042 <xs:attribute name="domain" type="xs:string" use="optional" />
1043 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
1044 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1045 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1046 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1047 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1048 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1049 <xs:attribute name="configSource" type="xs:string" use="optional" />
1050 </xs:complexType>
1051 </xs:element>
1052 <xs:element name="authentication" vs:help="configuration/system.web/authentication">
1053 <xs:complexType>
1054 <xs:choice minOccurs="0" maxOccurs="unbounded">
1055 <xs:element name="forms" vs:help="configuration/system.web/authentication/forms">
1056 <xs:complexType>
1057 <xs:choice minOccurs="0" maxOccurs="unbounded">
1058 <xs:element name="credentials" vs:help="configuration/system.web/authentication/forms/credentials">
1059 <xs:complexType>
1060 <xs:choice minOccurs="0" maxOccurs="unbounded">
1061 <xs:element name="user" vs:help="configuration/system.web/authentication/forms/credentials/user">
1062 <xs:complexType>
1063 <xs:attribute name="name" use="required">
1064 <xs:simpleType>
1065 <xs:restriction base="xs:string">
1066 <xs:minLength value="0" />
1067 </xs:restriction>
1068 </xs:simpleType>
1069 </xs:attribute>
1070 <xs:attribute name="password" use="required">
1071 <xs:simpleType>
1072 <xs:restriction base="xs:string">
1073 <xs:minLength value="0" />
1074 </xs:restriction>
1075 </xs:simpleType>
1076 </xs:attribute>
1077 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1078 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1079 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1080 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1081 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1082 </xs:complexType>
1083 </xs:element>
1084 </xs:choice>
1085 <xs:attribute name="passwordFormat" use="optional">
1086 <xs:simpleType>
1087 <xs:restriction base="xs:NMTOKEN">
1088 <xs:enumeration value="Clear" />
1089 <xs:enumeration value="MD5" />
1090 <xs:enumeration value="SHA1" />
1091 </xs:restriction>
1092 </xs:simpleType>
1093 </xs:attribute>
1094 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1095 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1096 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1097 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1098 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1099 </xs:complexType>
1100 </xs:element>
1101 </xs:choice>
1102 <xs:attribute name="cookieless" use="optional">
1103 <xs:simpleType>
1104 <xs:restriction base="xs:NMTOKEN">
1105 <xs:enumeration value="AutoDetect" />
1106 <xs:enumeration value="UseCookies" />
1107 <xs:enumeration value="UseDeviceProfile" />
1108 <xs:enumeration value="UseUri" />
1109 </xs:restriction>
1110 </xs:simpleType>
1111 </xs:attribute>
1112 <xs:attribute name="defaultUrl" use="optional">
1113 <xs:simpleType>
1114 <xs:restriction base="xs:string">
1115 <xs:minLength value="1" />
1116 </xs:restriction>
1117 </xs:simpleType>
1118 </xs:attribute>
1119 <xs:attribute name="domain" type="xs:string" use="optional" />
1120 <xs:attribute name="enableCrossAppRedirects" type="small_boolean_Type" use="optional" />
1121 <xs:attribute name="loginUrl" use="optional">
1122 <xs:simpleType>
1123 <xs:restriction base="xs:string">
1124 <xs:minLength value="1" />
1125 </xs:restriction>
1126 </xs:simpleType>
1127 </xs:attribute>
1128 <xs:attribute name="name" use="optional">
1129 <xs:simpleType>
1130 <xs:restriction base="xs:string">
1131 <xs:minLength value="1" />
1132 </xs:restriction>
1133 </xs:simpleType>
1134 </xs:attribute>
1135 <xs:attribute name="path" use="optional">
1136 <xs:simpleType>
1137 <xs:restriction base="xs:string">
1138 <xs:minLength value="1" />
1139 </xs:restriction>
1140 </xs:simpleType>
1141 </xs:attribute>
1142 <xs:attribute name="protection" use="optional">
1143 <xs:simpleType>
1144 <xs:restriction base="xs:NMTOKEN">
1145 <xs:enumeration value="All" />
1146 <xs:enumeration value="Encryption" />
1147 <xs:enumeration value="None" />
1148 <xs:enumeration value="Validation" />
1149 </xs:restriction>
1150 </xs:simpleType>
1151 </xs:attribute>
1152 <xs:attribute name="requireSSL" type="small_boolean_Type" use="optional" />
1153 <xs:attribute name="slidingExpiration" type="small_boolean_Type" use="optional" />
1154 <xs:attribute name="timeout" use="optional">
1155 <xs:simpleType>
1156 <xs:restriction base="xs:string">
1157 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1158 </xs:restriction>
1159 </xs:simpleType>
1160 </xs:attribute>
1161 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1162 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1163 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1164 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1165 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1166 </xs:complexType>
1167 </xs:element>
1168 <xs:element name="passport" vs:help="configuration/system.web/authentication/passport">
1169 <xs:complexType>
1170 <xs:attribute name="redirectUrl" use="optional">
1171 <xs:simpleType>
1172 <xs:restriction base="xs:string">
1173 <xs:minLength value="0" />
1174 </xs:restriction>
1175 </xs:simpleType>
1176 </xs:attribute>
1177 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1178 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1179 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1180 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1181 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1182 </xs:complexType>
1183 </xs:element>
1184 </xs:choice>
1185 <xs:attribute name="mode" use="optional">
1186 <xs:simpleType>
1187 <xs:restriction base="xs:NMTOKEN">
1188 <xs:enumeration value="Forms" />
1189 <xs:enumeration value="None" />
1190 <xs:enumeration value="Passport" />
1191 <xs:enumeration value="Windows" />
1192 </xs:restriction>
1193 </xs:simpleType>
1194 </xs:attribute>
1195 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1196 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1197 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1198 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1199 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1200 <xs:attribute name="configSource" type="xs:string" use="optional" />
1201 </xs:complexType>
1202 </xs:element>
1203 <xs:element name="authorization" vs:help="configuration/system.web/authorization">
1204 <xs:complexType>
1205 <xs:choice minOccurs="0" maxOccurs="unbounded">
1206 <xs:element name="allow" vs:help="configuration/system.web/authorization/allow">
1207 <xs:complexType>
1208 <xs:attribute name="roles" type="xs:string" use="optional" />
1209 <xs:attribute name="users" type="xs:string" use="optional" />
1210 <xs:attribute name="verbs" type="xs:string" use="optional" />
1211 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1212 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1213 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1214 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1215 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1216 </xs:complexType>
1217 </xs:element>
1218 <xs:element name="deny" vs:help="configuration/system.web/authorization/deny">
1219 <xs:complexType>
1220 <xs:attribute name="roles" type="xs:string" use="optional" />
1221 <xs:attribute name="users" type="xs:string" use="optional" />
1222 <xs:attribute name="verbs" type="xs:string" use="optional" />
1223 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1224 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1225 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1226 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1227 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1228 </xs:complexType>
1229 </xs:element>
1230 </xs:choice>
1231 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1232 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1233 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1234 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1235 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1236 <xs:attribute name="configSource" type="xs:string" use="optional" />
1237 </xs:complexType>
1238 </xs:element>
1239 <xs:element name="browserCaps" vs:help="configuration/system.web/browserCaps" />
1240 <xs:element name="clientTarget" vs:help="configuration/system.web/clientTarget">
1241 <xs:complexType>
1242 <xs:choice minOccurs="0" maxOccurs="unbounded">
1243 <xs:element name="add" vs:help="configuration/system.web/clientTarget/add">
1244 <xs:complexType>
1245 <xs:attribute name="alias" use="required">
1246 <xs:simpleType>
1247 <xs:restriction base="xs:string">
1248 <xs:minLength value="1" />
1249 </xs:restriction>
1250 </xs:simpleType>
1251 </xs:attribute>
1252 <xs:attribute name="userAgent" use="required">
1253 <xs:simpleType>
1254 <xs:restriction base="xs:string">
1255 <xs:minLength value="1" />
1256 </xs:restriction>
1257 </xs:simpleType>
1258 </xs:attribute>
1259 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1260 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1261 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1262 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1263 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1264 </xs:complexType>
1265 </xs:element>
1266 <xs:element name="remove" vs:help="configuration/system.web/clientTarget/remove">
1267 <xs:complexType>
1268 <xs:attribute name="alias" use="required">
1269 <xs:simpleType>
1270 <xs:restriction base="xs:string">
1271 <xs:minLength value="1" />
1272 </xs:restriction>
1273 </xs:simpleType>
1274 </xs:attribute>
1275 </xs:complexType>
1276 </xs:element>
1277 <xs:element name="clear" vs:help="configuration/system.web/clientTarget/clear">
1278 <xs:complexType>
1279 <!--tag is empty-->
1280 </xs:complexType>
1281 </xs:element>
1282 </xs:choice>
1283 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1284 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1285 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1286 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1287 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1288 <xs:attribute name="configSource" type="xs:string" use="optional" />
1289 </xs:complexType>
1290 </xs:element>
1291 <xs:element name="compilation" vs:help="configuration/system.web/compilation">
1292 <xs:complexType>
1293 <xs:choice minOccurs="0" maxOccurs="unbounded">
1294 <xs:element name="assemblies" vs:help="configuration/system.web/compilation/assemblies">
1295 <xs:complexType>
1296 <xs:choice minOccurs="0" maxOccurs="unbounded">
1297 <xs:element name="add" vs:help="configuration/system.web/compilation/assemblies/add">
1298 <xs:complexType>
1299 <xs:attribute name="assembly" use="required">
1300 <xs:simpleType>
1301 <xs:restriction base="xs:string">
1302 <xs:minLength value="1" />
1303 </xs:restriction>
1304 </xs:simpleType>
1305 </xs:attribute>
1306 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1307 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1308 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1309 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1310 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1311 </xs:complexType>
1312 </xs:element>
1313 <xs:element name="remove" vs:help="configuration/system.web/compilation/assemblies/remove">
1314 <xs:complexType>
1315 <xs:attribute name="assembly" use="required">
1316 <xs:simpleType>
1317 <xs:restriction base="xs:string">
1318 <xs:minLength value="1" />
1319 </xs:restriction>
1320 </xs:simpleType>
1321 </xs:attribute>
1322 </xs:complexType>
1323 </xs:element>
1324 <xs:element name="clear" vs:help="configuration/system.web/compilation/assemblies/clear">
1325 <xs:complexType>
1326 <!--tag is empty-->
1327 </xs:complexType>
1328 </xs:element>
1329 </xs:choice>
1330 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1331 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1332 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1333 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1334 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1335 </xs:complexType>
1336 </xs:element>
1337 <xs:element name="buildProviders" vs:help="configuration/system.web/compilation/buildProviders">
1338 <xs:complexType>
1339 <xs:choice minOccurs="0" maxOccurs="unbounded">
1340 <xs:element name="add" vs:help="configuration/system.web/compilation/buildProviders/add">
1341 <xs:complexType>
1342 <xs:attribute name="extension" use="required">
1343 <xs:simpleType>
1344 <xs:restriction base="xs:string">
1345 <xs:minLength value="1" />
1346 </xs:restriction>
1347 </xs:simpleType>
1348 </xs:attribute>
1349 <xs:attribute name="type" use="required">
1350 <xs:simpleType>
1351 <xs:restriction base="xs:string">
1352 <xs:minLength value="1" />
1353 </xs:restriction>
1354 </xs:simpleType>
1355 </xs:attribute>
1356 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1357 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1358 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1359 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1360 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1361 </xs:complexType>
1362 </xs:element>
1363 <xs:element name="remove" vs:help="configuration/system.web/compilation/buildProviders/remove">
1364 <xs:complexType>
1365 <xs:attribute name="extension" use="required">
1366 <xs:simpleType>
1367 <xs:restriction base="xs:string">
1368 <xs:minLength value="1" />
1369 </xs:restriction>
1370 </xs:simpleType>
1371 </xs:attribute>
1372 </xs:complexType>
1373 </xs:element>
1374 <xs:element name="clear" vs:help="configuration/system.web/compilation/buildProviders/clear">
1375 <xs:complexType>
1376 <!--tag is empty-->
1377 </xs:complexType>
1378 </xs:element>
1379 </xs:choice>
1380 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1381 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1382 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1383 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1384 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1385 </xs:complexType>
1386 </xs:element>
1387 <xs:element name="codeSubDirectories" vs:help="configuration/system.web/compilation/codeSubDirectories">
1388 <xs:complexType>
1389 <xs:choice minOccurs="0" maxOccurs="unbounded">
1390 <xs:element name="add" vs:help="configuration/system.web/compilation/codeSubDirectories/add">
1391 <xs:complexType>
1392 <xs:attribute name="directoryName" use="required">
1393 <xs:simpleType>
1394 <xs:restriction base="xs:string">
1395 <xs:whiteSpace value="collapse" />
1396 </xs:restriction>
1397 </xs:simpleType>
1398 </xs:attribute>
1399 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1400 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1401 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1402 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1403 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1404 </xs:complexType>
1405 </xs:element>
1406 </xs:choice>
1407 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1408 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1409 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1410 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1411 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1412 </xs:complexType>
1413 </xs:element>
1414 <xs:element name="expressionBuilders" vs:help="configuration/system.web/compilation/expressionBuilders">
1415 <xs:complexType>
1416 <xs:choice minOccurs="0" maxOccurs="unbounded">
1417 <xs:element name="add" vs:help="configuration/system.web/compilation/expressionBuilders/add">
1418 <xs:complexType>
1419 <xs:attribute name="expressionPrefix" use="required">
1420 <xs:simpleType>
1421 <xs:restriction base="xs:string">
1422 <xs:minLength value="1" />
1423 </xs:restriction>
1424 </xs:simpleType>
1425 </xs:attribute>
1426 <xs:attribute name="type" use="required">
1427 <xs:simpleType>
1428 <xs:restriction base="xs:string">
1429 <xs:minLength value="1" />
1430 </xs:restriction>
1431 </xs:simpleType>
1432 </xs:attribute>
1433 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1434 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1435 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1436 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1437 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1438 </xs:complexType>
1439 </xs:element>
1440 <xs:element name="remove" vs:help="configuration/system.web/compilation/expressionBuilders/remove">
1441 <xs:complexType>
1442 <xs:attribute name="expressionPrefix" use="required">
1443 <xs:simpleType>
1444 <xs:restriction base="xs:string">
1445 <xs:minLength value="1" />
1446 </xs:restriction>
1447 </xs:simpleType>
1448 </xs:attribute>
1449 </xs:complexType>
1450 </xs:element>
1451 <xs:element name="clear" vs:help="configuration/system.web/compilation/expressionBuilders/clear">
1452 <xs:complexType>
1453 <!--tag is empty-->
1454 </xs:complexType>
1455 </xs:element>
1456 </xs:choice>
1457 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1458 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1459 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1460 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1461 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1462 </xs:complexType>
1463 </xs:element>
1464 </xs:choice>
1465 <xs:attribute name="assemblyPostProcessorType" type="xs:string" use="optional" />
1466 <xs:attribute name="batch" type="small_boolean_Type" use="optional" />
1467 <xs:attribute name="batchTimeout" use="optional">
1468 <xs:simpleType>
1469 <xs:restriction base="xs:string">
1470 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1471 </xs:restriction>
1472 </xs:simpleType>
1473 </xs:attribute>
1474 <xs:attribute name="debug" type="small_boolean_Type" use="optional" />
1475 <xs:attribute name="defaultLanguage" type="xs:string" use="optional" />
1476 <xs:attribute name="explicit" type="small_boolean_Type" use="optional" />
1477 <xs:attribute name="maxBatchGeneratedFileSize" type="xs:int" use="optional" />
1478 <xs:attribute name="maxBatchSize" type="xs:int" use="optional" />
1479 <xs:attribute name="numRecompilesBeforeAppRestart" type="xs:int" use="optional" />
1480 <xs:attribute name="strict" type="small_boolean_Type" use="optional" />
1481 <xs:attribute name="tempDirectory" type="xs:string" use="optional" />
1482 <xs:attribute name="urlLinePragmas" type="small_boolean_Type" use="optional" />
1483 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1484 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1485 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1486 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1487 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1488 <xs:attribute name="configSource" type="xs:string" use="optional" />
1489 </xs:complexType>
1490 </xs:element>
1491 <xs:element name="customErrors" vs:help="configuration/system.web/customErrors">
1492 <xs:complexType>
1493 <xs:choice minOccurs="0" maxOccurs="unbounded">
1494 <xs:element name="error" vs:help="configuration/system.web/customErrors/error">
1495 <xs:complexType>
1496 <xs:attribute name="redirect" use="required">
1497 <xs:simpleType>
1498 <xs:restriction base="xs:string">
1499 <xs:minLength value="1" />
1500 </xs:restriction>
1501 </xs:simpleType>
1502 </xs:attribute>
1503 <xs:attribute name="statusCode" use="required">
1504 <xs:simpleType>
1505 <xs:restriction base="xs:int">
1506 <xs:minInclusive value="100" />
1507 <xs:maxInclusive value="999" />
1508 </xs:restriction>
1509 </xs:simpleType>
1510 </xs:attribute>
1511 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1512 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1513 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1514 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1515 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1516 </xs:complexType>
1517 </xs:element>
1518 </xs:choice>
1519 <xs:attribute name="defaultRedirect" type="xs:string" use="optional" />
1520 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1521 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1522 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1523 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1524 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1525 <xs:attribute name="mode" use="optional">
1526 <xs:simpleType>
1527 <xs:restriction base="xs:NMTOKEN">
1528 <xs:enumeration value="Off" />
1529 <xs:enumeration value="On" />
1530 <xs:enumeration value="RemoteOnly" />
1531 </xs:restriction>
1532 </xs:simpleType>
1533 </xs:attribute>
1534 <xs:attribute name="configSource" type="xs:string" use="optional" />
1535 </xs:complexType>
1536 </xs:element>
1537 <xs:element name="deployment" vs:help="configuration/system.web/deployment">
1538 <xs:complexType>
1539 <xs:attribute name="retail" type="small_boolean_Type" use="optional" />
1540 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1541 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1542 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1543 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1544 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1545 <xs:attribute name="configSource" type="xs:string" use="optional" />
1546 </xs:complexType>
1547 </xs:element>
1548 <xs:element name="deviceFilters" vs:help="configuration/system.web/deviceFilters">
1549 <xs:complexType>
1550 <xs:choice minOccurs="0" maxOccurs="unbounded">
1551 <xs:element name="filter" vs:help="configuration/system.web/deviceFilters/filter">
1552 <xs:complexType>
1553 <xs:attribute name="argument" use="optional">
1554 <xs:simpleType>
1555 <xs:restriction base="xs:string">
1556 <xs:minLength value="1" />
1557 </xs:restriction>
1558 </xs:simpleType>
1559 </xs:attribute>
1560 <xs:attribute name="compare" use="optional">
1561 <xs:simpleType>
1562 <xs:restriction base="xs:string">
1563 <xs:minLength value="1" />
1564 </xs:restriction>
1565 </xs:simpleType>
1566 </xs:attribute>
1567 <xs:attribute name="type" type="xs:string" use="optional" />
1568 <xs:attribute name="method" use="optional">
1569 <xs:simpleType>
1570 <xs:restriction base="xs:string">
1571 <xs:minLength value="1" />
1572 </xs:restriction>
1573 </xs:simpleType>
1574 </xs:attribute>
1575 <xs:attribute name="name" use="required">
1576 <xs:simpleType>
1577 <xs:restriction base="xs:string">
1578 <xs:minLength value="1" />
1579 </xs:restriction>
1580 </xs:simpleType>
1581 </xs:attribute>
1582 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1583 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1584 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1585 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1586 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1587 </xs:complexType>
1588 </xs:element>
1589 </xs:choice>
1590 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1591 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1592 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1593 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1594 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1595 <xs:attribute name="configSource" type="xs:string" use="optional" />
1596 </xs:complexType>
1597 </xs:element>
1598 <xs:element name="globalization" vs:help="configuration/system.web/globalization">
1599 <xs:complexType>
1600 <xs:attribute name="culture" type="xs:string" use="optional" />
1601 <xs:attribute name="enableBestFitResponseEncoding" type="small_boolean_Type" use="optional" />
1602 <xs:attribute name="enableClientBasedCulture" type="small_boolean_Type" use="optional" />
1603 <xs:attribute name="fileEncoding" type="xs:string" use="optional" />
1604 <xs:attribute name="requestEncoding" type="xs:string" use="optional" />
1605 <xs:attribute name="resourceProviderFactoryType" type="xs:string" use="optional" />
1606 <xs:attribute name="responseEncoding" type="xs:string" use="optional" />
1607 <xs:attribute name="responseHeaderEncoding" type="xs:string" use="optional" />
1608 <xs:attribute name="uiCulture" type="xs:string" use="optional" />
1609 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1610 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1611 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1612 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1613 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1614 <xs:attribute name="configSource" type="xs:string" use="optional" />
1615 </xs:complexType>
1616 </xs:element>
1617 <xs:element name="healthMonitoring" vs:help="configuration/system.web/healthMonitoring">
1618 <xs:complexType>
1619 <xs:choice minOccurs="0" maxOccurs="unbounded">
1620 <xs:element name="bufferModes" vs:help="configuration/system.web/healthMonitoring/bufferModes">
1621 <xs:complexType>
1622 <xs:choice minOccurs="0" maxOccurs="unbounded">
1623 <xs:element name="add" vs:help="configuration/system.web/healthMonitoring/bufferModes/add">
1624 <xs:complexType>
1625 <xs:attribute name="maxBufferSize" use="required">
1626 <xs:simpleType>
1627 <xs:union memberTypes="xs:int Infinite">
1628 <xs:simpleType>
1629 <xs:restriction base="xs:int">
1630 <xs:minInclusive value="1" />
1631 </xs:restriction>
1632 </xs:simpleType>
1633 </xs:union>
1634 </xs:simpleType>
1635 </xs:attribute>
1636 <xs:attribute name="maxBufferThreads" use="optional">
1637 <xs:simpleType>
1638 <xs:union memberTypes="xs:int Infinite">
1639 <xs:simpleType>
1640 <xs:restriction base="xs:int">
1641 <xs:minInclusive value="1" />
1642 </xs:restriction>
1643 </xs:simpleType>
1644 </xs:union>
1645 </xs:simpleType>
1646 </xs:attribute>
1647 <xs:attribute name="maxFlushSize" use="required">
1648 <xs:simpleType>
1649 <xs:union memberTypes="xs:int Infinite">
1650 <xs:simpleType>
1651 <xs:restriction base="xs:int">
1652 <xs:minInclusive value="1" />
1653 </xs:restriction>
1654 </xs:simpleType>
1655 </xs:union>
1656 </xs:simpleType>
1657 </xs:attribute>
1658 <xs:attribute name="name" use="required">
1659 <xs:simpleType>
1660 <xs:restriction base="xs:string">
1661 <xs:minLength value="1" />
1662 </xs:restriction>
1663 </xs:simpleType>
1664 </xs:attribute>
1665 <xs:attribute name="regularFlushInterval" use="required">
1666 <xs:simpleType>
1667 <xs:restriction base="xs:string">
1668 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1669 </xs:restriction>
1670 </xs:simpleType>
1671 </xs:attribute>
1672 <xs:attribute name="urgentFlushInterval" type="xs:string" use="required" />
1673 <xs:attribute name="urgentFlushThreshold" use="required">
1674 <xs:simpleType>
1675 <xs:union memberTypes="xs:int Infinite">
1676 <xs:simpleType>
1677 <xs:restriction base="xs:int">
1678 <xs:minInclusive value="1" />
1679 </xs:restriction>
1680 </xs:simpleType>
1681 </xs:union>
1682 </xs:simpleType>
1683 </xs:attribute>
1684 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1685 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1686 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1687 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1688 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1689 </xs:complexType>
1690 </xs:element>
1691 <xs:element name="remove" vs:help="configuration/system.web/healthMonitoring/bufferModes/remove">
1692 <xs:complexType>
1693 <xs:attribute name="name" use="required">
1694 <xs:simpleType>
1695 <xs:restriction base="xs:string">
1696 <xs:minLength value="1" />
1697 </xs:restriction>
1698 </xs:simpleType>
1699 </xs:attribute>
1700 </xs:complexType>
1701 </xs:element>
1702 <xs:element name="clear" vs:help="configuration/system.web/healthMonitoring/bufferModes/clear">
1703 <xs:complexType>
1704 <!--tag is empty-->
1705 </xs:complexType>
1706 </xs:element>
1707 </xs:choice>
1708 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1709 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1710 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1711 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1712 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1713 </xs:complexType>
1714 </xs:element>
1715 <xs:element name="eventMappings" vs:help="configuration/system.web/healthMonitoring/eventMappings">
1716 <xs:complexType>
1717 <xs:choice minOccurs="0" maxOccurs="unbounded">
1718 <xs:element name="add" vs:help="configuration/system.web/healthMonitoring/eventMappings/add">
1719 <xs:complexType>
1720 <xs:attribute name="endEventCode" use="optional">
1721 <xs:simpleType>
1722 <xs:restriction base="xs:int">
1723 <xs:minInclusive value="0" />
1724 </xs:restriction>
1725 </xs:simpleType>
1726 </xs:attribute>
1727 <xs:attribute name="name" type="xs:string" use="required" />
1728 <xs:attribute name="startEventCode" use="optional">
1729 <xs:simpleType>
1730 <xs:restriction base="xs:int">
1731 <xs:minInclusive value="0" />
1732 </xs:restriction>
1733 </xs:simpleType>
1734 </xs:attribute>
1735 <xs:attribute name="type" type="xs:string" use="required" />
1736 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1737 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1738 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1739 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1740 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1741 </xs:complexType>
1742 </xs:element>
1743 <xs:element name="remove" vs:help="configuration/system.web/healthMonitoring/eventMappings/remove">
1744 <xs:complexType>
1745 <xs:attribute name="name" type="xs:string" use="required" />
1746 </xs:complexType>
1747 </xs:element>
1748 <xs:element name="clear" vs:help="configuration/system.web/healthMonitoring/eventMappings/clear">
1749 <xs:complexType>
1750 <!--tag is empty-->
1751 </xs:complexType>
1752 </xs:element>
1753 </xs:choice>
1754 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1755 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1756 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1757 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1758 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1759 </xs:complexType>
1760 </xs:element>
1761 <xs:element name="profiles" vs:help="configuration/system.web/healthMonitoring/profiles">
1762 <xs:complexType>
1763 <xs:choice minOccurs="0" maxOccurs="unbounded">
1764 <xs:element name="add" vs:help="configuration/system.web/healthMonitoring/profiles/add">
1765 <xs:complexType>
1766 <xs:attribute name="custom" type="xs:string" use="optional" />
1767 <xs:attribute name="maxLimit" use="optional">
1768 <xs:simpleType>
1769 <xs:union memberTypes="xs:int Infinite">
1770 <xs:simpleType>
1771 <xs:restriction base="xs:int">
1772 <xs:minInclusive value="0" />
1773 </xs:restriction>
1774 </xs:simpleType>
1775 </xs:union>
1776 </xs:simpleType>
1777 </xs:attribute>
1778 <xs:attribute name="minInstances" use="optional">
1779 <xs:simpleType>
1780 <xs:restriction base="xs:int">
1781 <xs:minInclusive value="1" />
1782 </xs:restriction>
1783 </xs:simpleType>
1784 </xs:attribute>
1785 <xs:attribute name="minInterval" type="xs:string" use="optional" />
1786 <xs:attribute name="name" use="required">
1787 <xs:simpleType>
1788 <xs:restriction base="xs:string">
1789 <xs:minLength value="1" />
1790 </xs:restriction>
1791 </xs:simpleType>
1792 </xs:attribute>
1793 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1794 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1795 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1796 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1797 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1798 </xs:complexType>
1799 </xs:element>
1800 <xs:element name="remove" vs:help="configuration/system.web/healthMonitoring/profiles/remove">
1801 <xs:complexType>
1802 <xs:attribute name="name" use="required">
1803 <xs:simpleType>
1804 <xs:restriction base="xs:string">
1805 <xs:minLength value="1" />
1806 </xs:restriction>
1807 </xs:simpleType>
1808 </xs:attribute>
1809 </xs:complexType>
1810 </xs:element>
1811 <xs:element name="clear" vs:help="configuration/system.web/healthMonitoring/profiles/clear">
1812 <xs:complexType>
1813 <!--tag is empty-->
1814 </xs:complexType>
1815 </xs:element>
1816 </xs:choice>
1817 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1818 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1819 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1820 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1821 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1822 </xs:complexType>
1823 </xs:element>
1824 <xs:element name="providers" vs:help="configuration/system.web/healthMonitoring/providers">
1825 <xs:complexType>
1826 <xs:choice minOccurs="0" maxOccurs="unbounded">
1827 <xs:element name="add" vs:help="configuration/system.web/healthMonitoring/providers/add">
1828 <xs:complexType>
1829 <xs:attribute name="name" type="xs:string" use="required" />
1830 <xs:attribute name="type" type="xs:string" use="required" />
1831 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1832 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1833 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1834 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1835 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1836 <xs:anyAttribute processContents="skip" />
1837 </xs:complexType>
1838 </xs:element>
1839 <xs:element name="remove" vs:help="configuration/system.web/healthMonitoring/providers/remove">
1840 <xs:complexType>
1841 <xs:attribute name="name" type="xs:string" use="required" />
1842 </xs:complexType>
1843 </xs:element>
1844 <xs:element name="clear" vs:help="configuration/system.web/healthMonitoring/providers/clear">
1845 <xs:complexType>
1846 <!--tag is empty-->
1847 </xs:complexType>
1848 </xs:element>
1849 </xs:choice>
1850 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1851 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1852 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1853 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1854 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1855 </xs:complexType>
1856 </xs:element>
1857 <xs:element name="rules" vs:help="configuration/system.web/healthMonitoring/rules">
1858 <xs:complexType>
1859 <xs:choice minOccurs="0" maxOccurs="unbounded">
1860 <xs:element name="add" vs:help="configuration/system.web/healthMonitoring/rules/add">
1861 <xs:complexType>
1862 <xs:attribute name="custom" type="xs:string" use="optional" />
1863 <xs:attribute name="eventName" type="xs:string" use="required" />
1864 <xs:attribute name="maxLimit" use="optional">
1865 <xs:simpleType>
1866 <xs:union memberTypes="xs:int Infinite">
1867 <xs:simpleType>
1868 <xs:restriction base="xs:int">
1869 <xs:minInclusive value="0" />
1870 </xs:restriction>
1871 </xs:simpleType>
1872 </xs:union>
1873 </xs:simpleType>
1874 </xs:attribute>
1875 <xs:attribute name="minInstances" use="optional">
1876 <xs:simpleType>
1877 <xs:restriction base="xs:int">
1878 <xs:minInclusive value="1" />
1879 </xs:restriction>
1880 </xs:simpleType>
1881 </xs:attribute>
1882 <xs:attribute name="minInterval" type="xs:string" use="optional" />
1883 <xs:attribute name="name" use="required">
1884 <xs:simpleType>
1885 <xs:restriction base="xs:string">
1886 <xs:minLength value="1" />
1887 </xs:restriction>
1888 </xs:simpleType>
1889 </xs:attribute>
1890 <xs:attribute name="profile" type="xs:string" use="optional" />
1891 <xs:attribute name="provider" type="xs:string" use="optional" />
1892 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1893 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1894 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1895 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1896 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1897 </xs:complexType>
1898 </xs:element>
1899 <xs:element name="remove" vs:help="configuration/system.web/healthMonitoring/rules/remove">
1900 <xs:complexType>
1901 <xs:attribute name="name" use="required">
1902 <xs:simpleType>
1903 <xs:restriction base="xs:string">
1904 <xs:minLength value="1" />
1905 </xs:restriction>
1906 </xs:simpleType>
1907 </xs:attribute>
1908 </xs:complexType>
1909 </xs:element>
1910 <xs:element name="clear" vs:help="configuration/system.web/healthMonitoring/rules/clear">
1911 <xs:complexType>
1912 <!--tag is empty-->
1913 </xs:complexType>
1914 </xs:element>
1915 </xs:choice>
1916 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1917 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1918 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1919 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1920 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1921 </xs:complexType>
1922 </xs:element>
1923 </xs:choice>
1924 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
1925 <xs:attribute name="heartbeatInterval" use="optional">
1926 <xs:simpleType>
1927 <xs:restriction base="xs:string">
1928 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1929 </xs:restriction>
1930 </xs:simpleType>
1931 </xs:attribute>
1932 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1933 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1934 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1935 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1936 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1937 <xs:attribute name="configSource" type="xs:string" use="optional" />
1938 </xs:complexType>
1939 </xs:element>
1940 <xs:element name="hostingEnvironment" vs:help="configuration/system.web/hostingEnvironment">
1941 <xs:complexType>
1942 <xs:attribute name="idleTimeout" use="optional">
1943 <xs:simpleType>
1944 <xs:restriction base="xs:string">
1945 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1946 </xs:restriction>
1947 </xs:simpleType>
1948 </xs:attribute>
1949 <xs:attribute name="shadowCopyBinAssemblies" type="small_boolean_Type" use="optional" />
1950 <xs:attribute name="shutdownTimeout" use="optional">
1951 <xs:simpleType>
1952 <xs:restriction base="xs:string">
1953 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
1954 </xs:restriction>
1955 </xs:simpleType>
1956 </xs:attribute>
1957 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1958 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1959 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1960 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1961 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1962 <xs:attribute name="configSource" type="xs:string" use="optional" />
1963 </xs:complexType>
1964 </xs:element>
1965 <xs:element name="httpCookies" vs:help="configuration/system.web/httpCookies">
1966 <xs:complexType>
1967 <xs:attribute name="domain" type="xs:string" use="optional" />
1968 <xs:attribute name="httpOnlyCookies" type="small_boolean_Type" use="optional" />
1969 <xs:attribute name="requireSSL" type="small_boolean_Type" use="optional" />
1970 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1971 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1972 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1973 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1974 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1975 <xs:attribute name="configSource" type="xs:string" use="optional" />
1976 </xs:complexType>
1977 </xs:element>
1978 <xs:element name="httpHandlers" vs:help="configuration/system.web/httpHandlers">
1979 <xs:complexType>
1980 <xs:choice minOccurs="0" maxOccurs="unbounded">
1981 <xs:element name="add" vs:help="configuration/system.web/httpHandlers/add">
1982 <xs:complexType>
1983 <xs:attribute name="path" type="xs:string" use="required" />
1984 <xs:attribute name="type" type="xs:string" use="required" />
1985 <xs:attribute name="validate" type="small_boolean_Type" use="optional" />
1986 <xs:attribute name="verb" type="xs:string" use="required" />
1987 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
1988 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
1989 <xs:attribute name="lockElements" type="xs:string" use="optional" />
1990 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
1991 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
1992 </xs:complexType>
1993 </xs:element>
1994 <xs:element name="remove" vs:help="configuration/system.web/httpHandlers/remove">
1995 <xs:complexType>
1996 <xs:attribute name="path" type="xs:string" use="required" />
1997 <xs:attribute name="verb" type="xs:string" use="required" />
1998 </xs:complexType>
1999 </xs:element>
2000 <xs:element name="clear" vs:help="configuration/system.web/httpHandlers/clear">
2001 <xs:complexType>
2002 <!--tag is empty-->
2003 </xs:complexType>
2004 </xs:element>
2005 </xs:choice>
2006 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2007 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2008 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2009 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2010 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2011 <xs:attribute name="configSource" type="xs:string" use="optional" />
2012 </xs:complexType>
2013 </xs:element>
2014 <xs:element name="httpModules" vs:help="configuration/system.web/httpModules">
2015 <xs:complexType>
2016 <xs:choice minOccurs="0" maxOccurs="unbounded">
2017 <xs:element name="add" vs:help="configuration/system.web/httpModules/add">
2018 <xs:complexType>
2019 <xs:attribute name="name" use="required">
2020 <xs:simpleType>
2021 <xs:restriction base="xs:string">
2022 <xs:minLength value="1" />
2023 </xs:restriction>
2024 </xs:simpleType>
2025 </xs:attribute>
2026 <xs:attribute name="type" type="xs:string" use="required" />
2027 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2028 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2029 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2030 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2031 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2032 </xs:complexType>
2033 </xs:element>
2034 <xs:element name="remove" vs:help="configuration/system.web/httpModules/remove">
2035 <xs:complexType>
2036 <xs:attribute name="name" use="required">
2037 <xs:simpleType>
2038 <xs:restriction base="xs:string">
2039 <xs:minLength value="1" />
2040 </xs:restriction>
2041 </xs:simpleType>
2042 </xs:attribute>
2043 </xs:complexType>
2044 </xs:element>
2045 <xs:element name="clear" vs:help="configuration/system.web/httpModules/clear">
2046 <xs:complexType>
2047 <!--tag is empty-->
2048 </xs:complexType>
2049 </xs:element>
2050 </xs:choice>
2051 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2052 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2053 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2054 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2055 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2056 <xs:attribute name="configSource" type="xs:string" use="optional" />
2057 </xs:complexType>
2058 </xs:element>
2059 <xs:element name="httpRuntime" vs:help="configuration/system.web/httpRuntime">
2060 <xs:complexType>
2061 <xs:attribute name="apartmentThreading" type="small_boolean_Type" use="optional" />
2062 <xs:attribute name="appRequestQueueLimit" use="optional">
2063 <xs:simpleType>
2064 <xs:restriction base="xs:int">
2065 <xs:minInclusive value="1" />
2066 </xs:restriction>
2067 </xs:simpleType>
2068 </xs:attribute>
2069 <xs:attribute name="delayNotificationTimeout" type="xs:string" use="optional" />
2070 <xs:attribute name="enable" type="small_boolean_Type" use="optional" />
2071 <xs:attribute name="enableHeaderChecking" type="small_boolean_Type" use="optional" />
2072 <xs:attribute name="enableKernelOutputCache" type="small_boolean_Type" use="optional" />
2073 <xs:attribute name="enableVersionHeader" type="small_boolean_Type" use="optional" />
2074 <xs:attribute name="executionTimeout" use="optional">
2075 <xs:simpleType>
2076 <xs:restriction base="xs:string">
2077 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2078 </xs:restriction>
2079 </xs:simpleType>
2080 </xs:attribute>
2081 <xs:attribute name="maxRequestLength" use="optional">
2082 <xs:simpleType>
2083 <xs:restriction base="xs:int">
2084 <xs:minInclusive value="0" />
2085 </xs:restriction>
2086 </xs:simpleType>
2087 </xs:attribute>
2088 <xs:attribute name="maxWaitChangeNotification" use="optional">
2089 <xs:simpleType>
2090 <xs:restriction base="xs:int">
2091 <xs:minInclusive value="0" />
2092 </xs:restriction>
2093 </xs:simpleType>
2094 </xs:attribute>
2095 <xs:attribute name="minFreeThreads" use="optional">
2096 <xs:simpleType>
2097 <xs:restriction base="xs:int">
2098 <xs:minInclusive value="0" />
2099 </xs:restriction>
2100 </xs:simpleType>
2101 </xs:attribute>
2102 <xs:attribute name="minLocalRequestFreeThreads" use="optional">
2103 <xs:simpleType>
2104 <xs:restriction base="xs:int">
2105 <xs:minInclusive value="0" />
2106 </xs:restriction>
2107 </xs:simpleType>
2108 </xs:attribute>
2109 <xs:attribute name="requestLengthDiskThreshold" use="optional">
2110 <xs:simpleType>
2111 <xs:restriction base="xs:int">
2112 <xs:minInclusive value="1" />
2113 </xs:restriction>
2114 </xs:simpleType>
2115 </xs:attribute>
2116 <xs:attribute name="requireRootedSaveAsPath" type="small_boolean_Type" use="optional" />
2117 <xs:attribute name="sendCacheControlHeader" type="small_boolean_Type" use="optional" />
2118 <xs:attribute name="shutdownTimeout" type="xs:string" use="optional" />
2119 <xs:attribute name="useFullyQualifiedRedirectUrl" type="small_boolean_Type" use="optional" />
2120 <xs:attribute name="waitChangeNotification" use="optional">
2121 <xs:simpleType>
2122 <xs:restriction base="xs:int">
2123 <xs:minInclusive value="0" />
2124 </xs:restriction>
2125 </xs:simpleType>
2126 </xs:attribute>
2127 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2128 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2129 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2130 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2131 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2132 <xs:attribute name="configSource" type="xs:string" use="optional" />
2133 </xs:complexType>
2134 </xs:element>
2135 <xs:element name="identity" vs:help="configuration/system.web/identity">
2136 <xs:complexType>
2137 <xs:attribute name="impersonate" type="small_boolean_Type" use="optional" />
2138 <xs:attribute name="password" type="xs:string" use="optional" />
2139 <xs:attribute name="userName" type="xs:string" use="optional" />
2140 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2141 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2142 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2143 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2144 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2145 <xs:attribute name="configSource" type="xs:string" use="optional" />
2146 </xs:complexType>
2147 </xs:element>
2148 <xs:element name="machineKey" vs:help="configuration/system.web/machineKey">
2149 <xs:complexType>
2150 <xs:attribute name="decryption" use="optional">
2151 <xs:simpleType>
2152 <xs:restriction base="xs:string">
2153 <xs:minLength value="1" />
2154 <xs:whiteSpace value="collapse" />
2155 </xs:restriction>
2156 </xs:simpleType>
2157 </xs:attribute>
2158 <xs:attribute name="decryptionKey" use="optional">
2159 <xs:simpleType>
2160 <xs:restriction base="xs:string">
2161 <xs:minLength value="1" />
2162 <xs:whiteSpace value="collapse" />
2163 </xs:restriction>
2164 </xs:simpleType>
2165 </xs:attribute>
2166 <xs:attribute name="validation" use="optional">
2167 <xs:simpleType>
2168 <xs:restriction base="xs:NMTOKEN">
2169 <xs:enumeration value="AES" />
2170 <xs:enumeration value="MD5" />
2171 <xs:enumeration value="SHA1" />
2172 <xs:enumeration value="3DES" />
2173 </xs:restriction>
2174 </xs:simpleType>
2175 </xs:attribute>
2176 <xs:attribute name="validationKey" use="optional">
2177 <xs:simpleType>
2178 <xs:restriction base="xs:string">
2179 <xs:minLength value="1" />
2180 <xs:whiteSpace value="collapse" />
2181 </xs:restriction>
2182 </xs:simpleType>
2183 </xs:attribute>
2184 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2185 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2186 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2187 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2188 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2189 <xs:attribute name="configSource" type="xs:string" use="optional" />
2190 </xs:complexType>
2191 </xs:element>
2192 <xs:element name="membership" vs:help="configuration/system.web/membership">
2193 <xs:complexType>
2194 <xs:choice minOccurs="0" maxOccurs="unbounded">
2195 <xs:element name="providers" vs:help="configuration/system.web/membership/providers">
2196 <xs:complexType>
2197 <xs:choice minOccurs="0" maxOccurs="unbounded">
2198 <xs:element name="add" vs:help="configuration/system.web/membership/providers/add">
2199 <xs:complexType>
2200 <xs:attribute name="name" type="xs:string" use="required" />
2201 <xs:attribute name="type" type="xs:string" use="required" />
2202 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2203 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2204 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2205 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2206 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2207 <xs:anyAttribute processContents="skip" />
2208 </xs:complexType>
2209 </xs:element>
2210 <xs:element name="remove" vs:help="configuration/system.web/membership/providers/remove">
2211 <xs:complexType>
2212 <xs:attribute name="name" type="xs:string" use="required" />
2213 </xs:complexType>
2214 </xs:element>
2215 <xs:element name="clear" vs:help="configuration/system.web/membership/providers/clear">
2216 <xs:complexType>
2217 <!--tag is empty-->
2218 </xs:complexType>
2219 </xs:element>
2220 </xs:choice>
2221 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2222 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2223 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2224 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2225 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2226 </xs:complexType>
2227 </xs:element>
2228 </xs:choice>
2229 <xs:attribute name="defaultProvider" use="optional">
2230 <xs:simpleType>
2231 <xs:restriction base="xs:string">
2232 <xs:minLength value="1" />
2233 </xs:restriction>
2234 </xs:simpleType>
2235 </xs:attribute>
2236 <xs:attribute name="hashAlgorithmType" type="xs:string" use="optional" />
2237 <xs:attribute name="userIsOnlineTimeWindow" use="optional">
2238 <xs:simpleType>
2239 <xs:restriction base="xs:string">
2240 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2241 </xs:restriction>
2242 </xs:simpleType>
2243 </xs:attribute>
2244 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2245 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2246 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2247 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2248 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2249 <xs:attribute name="configSource" type="xs:string" use="optional" />
2250 </xs:complexType>
2251 </xs:element>
2252 <xs:element name="mobileControls" vs:help="configuration/system.web/mobileControls">
2253 <xs:complexType>
2254 <xs:choice minOccurs="0" maxOccurs="unbounded">
2255 <xs:element name="device" vs:help="configuration/system.web/mobileControls/device">
2256 <xs:complexType>
2257 <xs:choice minOccurs="0" maxOccurs="unbounded">
2258 <xs:element name="control" vs:help="configuration/system.web/mobileControls/DeviceElement/control">
2259 <xs:complexType>
2260 <xs:attribute name="adapter" type="xs:string" use="required" />
2261 <xs:attribute name="name" use="required">
2262 <xs:simpleType>
2263 <xs:restriction base="xs:string">
2264 <xs:minLength value="1" />
2265 </xs:restriction>
2266 </xs:simpleType>
2267 </xs:attribute>
2268 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2269 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2270 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2271 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2272 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2273 </xs:complexType>
2274 </xs:element>
2275 <xs:element name="remove" vs:help="configuration/system.web/mobileControls/DeviceElement/remove">
2276 <xs:complexType>
2277 <xs:attribute name="name" use="required">
2278 <xs:simpleType>
2279 <xs:restriction base="xs:string">
2280 <xs:minLength value="1" />
2281 </xs:restriction>
2282 </xs:simpleType>
2283 </xs:attribute>
2284 </xs:complexType>
2285 </xs:element>
2286 <xs:element name="clear" vs:help="configuration/system.web/mobileControls/DeviceElement/clear">
2287 <xs:complexType>
2288 <!--tag is empty-->
2289 </xs:complexType>
2290 </xs:element>
2291 </xs:choice>
2292 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2293 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2294 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2295 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2296 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2297 <xs:attribute name="inheritsFrom" use="optional">
2298 <xs:simpleType>
2299 <xs:restriction base="xs:string">
2300 <xs:minLength value="1" />
2301 </xs:restriction>
2302 </xs:simpleType>
2303 </xs:attribute>
2304 <xs:attribute name="name" use="required">
2305 <xs:simpleType>
2306 <xs:restriction base="xs:string">
2307 <xs:minLength value="1" />
2308 </xs:restriction>
2309 </xs:simpleType>
2310 </xs:attribute>
2311 <xs:attribute name="pageAdapter" type="xs:string" use="optional" />
2312 <xs:attribute name="predicateClass" type="xs:string" use="optional" />
2313 <xs:attribute name="predicateMethod" use="optional">
2314 <xs:simpleType>
2315 <xs:restriction base="xs:string">
2316 <xs:minLength value="1" />
2317 </xs:restriction>
2318 </xs:simpleType>
2319 </xs:attribute>
2320 </xs:complexType>
2321 </xs:element>
2322 <xs:element name="remove" vs:help="configuration/system.web/mobileControls/remove">
2323 <xs:complexType>
2324 <xs:choice minOccurs="0" maxOccurs="unbounded">
2325 <xs:element name="control" vs:help="configuration/system.web/mobileControls/DeviceElement/control">
2326 <xs:complexType>
2327 <xs:attribute name="adapter" type="xs:string" use="required" />
2328 <xs:attribute name="name" use="required">
2329 <xs:simpleType>
2330 <xs:restriction base="xs:string">
2331 <xs:minLength value="1" />
2332 </xs:restriction>
2333 </xs:simpleType>
2334 </xs:attribute>
2335 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2336 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2337 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2338 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2339 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2340 </xs:complexType>
2341 </xs:element>
2342 <xs:element name="remove" vs:help="configuration/system.web/mobileControls/DeviceElement/remove">
2343 <xs:complexType>
2344 <xs:attribute name="name" use="required">
2345 <xs:simpleType>
2346 <xs:restriction base="xs:string">
2347 <xs:minLength value="1" />
2348 </xs:restriction>
2349 </xs:simpleType>
2350 </xs:attribute>
2351 </xs:complexType>
2352 </xs:element>
2353 <xs:element name="clear" vs:help="configuration/system.web/mobileControls/DeviceElement/clear">
2354 <xs:complexType>
2355 <!--tag is empty-->
2356 </xs:complexType>
2357 </xs:element>
2358 </xs:choice>
2359 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2360 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2361 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2362 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2363 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2364 <xs:attribute name="name" use="required">
2365 <xs:simpleType>
2366 <xs:restriction base="xs:string">
2367 <xs:minLength value="1" />
2368 </xs:restriction>
2369 </xs:simpleType>
2370 </xs:attribute>
2371 </xs:complexType>
2372 </xs:element>
2373 <xs:element name="clear" vs:help="configuration/system.web/mobileControls/clear">
2374 <xs:complexType>
2375 <!--tag is empty-->
2376 </xs:complexType>
2377 </xs:element>
2378 </xs:choice>
2379 <xs:attribute name="allowCustomAttributes" type="small_boolean_Type" use="optional" />
2380 <xs:attribute name="cookielessDataDictionaryType" type="xs:string" use="optional" />
2381 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2382 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2383 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2384 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2385 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2386 <xs:attribute name="sessionStateHistorySize" use="optional">
2387 <xs:simpleType>
2388 <xs:restriction base="xs:int">
2389 <xs:minInclusive value="0" />
2390 </xs:restriction>
2391 </xs:simpleType>
2392 </xs:attribute>
2393 <xs:attribute name="configSource" type="xs:string" use="optional" />
2394 </xs:complexType>
2395 </xs:element>
2396 <xs:element name="pages" vs:help="configuration/system.web/pages">
2397 <xs:complexType>
2398 <xs:choice minOccurs="0" maxOccurs="unbounded">
2399 <xs:element name="controls" vs:help="configuration/system.web/pages/controls">
2400 <xs:complexType>
2401 <xs:choice minOccurs="0" maxOccurs="unbounded">
2402 <xs:element name="add" vs:help="configuration/system.web/pages/controls/add">
2403 <xs:complexType>
2404 <xs:attribute name="assembly" type="xs:string" use="optional" />
2405 <xs:attribute name="namespace" type="xs:string" use="optional" />
2406 <xs:attribute name="src" type="xs:string" use="optional" />
2407 <xs:attribute name="tagName" type="xs:string" use="optional" />
2408 <xs:attribute name="tagPrefix" use="required">
2409 <xs:simpleType>
2410 <xs:restriction base="xs:string">
2411 <xs:minLength value="1" />
2412 </xs:restriction>
2413 </xs:simpleType>
2414 </xs:attribute>
2415 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2416 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2417 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2418 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2419 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2420 </xs:complexType>
2421 </xs:element>
2422 </xs:choice>
2423 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2424 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2425 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2426 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2427 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2428 </xs:complexType>
2429 </xs:element>
2430 <xs:element name="namespaces" vs:help="configuration/system.web/pages/namespaces">
2431 <xs:complexType>
2432 <xs:choice minOccurs="0" maxOccurs="unbounded">
2433 <xs:element name="add" vs:help="configuration/system.web/pages/namespaces/add">
2434 <xs:complexType>
2435 <xs:attribute name="namespace" use="required">
2436 <xs:simpleType>
2437 <xs:restriction base="xs:string">
2438 <xs:minLength value="1" />
2439 </xs:restriction>
2440 </xs:simpleType>
2441 </xs:attribute>
2442 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2443 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2444 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2445 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2446 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2447 </xs:complexType>
2448 </xs:element>
2449 <xs:element name="remove" vs:help="configuration/system.web/pages/namespaces/remove">
2450 <xs:complexType>
2451 <xs:attribute name="namespace" use="required">
2452 <xs:simpleType>
2453 <xs:restriction base="xs:string">
2454 <xs:minLength value="1" />
2455 </xs:restriction>
2456 </xs:simpleType>
2457 </xs:attribute>
2458 </xs:complexType>
2459 </xs:element>
2460 <xs:element name="clear" vs:help="configuration/system.web/pages/namespaces/clear">
2461 <xs:complexType>
2462 <!--tag is empty-->
2463 </xs:complexType>
2464 </xs:element>
2465 </xs:choice>
2466 <xs:attribute name="autoImportVBNamespace" type="small_boolean_Type" use="optional" />
2467 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2468 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2469 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2470 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2471 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2472 </xs:complexType>
2473 </xs:element>
2474 <xs:element name="tagMapping" vs:help="configuration/system.web/pages/tagMapping">
2475 <xs:complexType>
2476 <xs:choice minOccurs="0" maxOccurs="unbounded">
2477 <xs:element name="add" vs:help="configuration/system.web/pages/tagMapping/add">
2478 <xs:complexType>
2479 <xs:attribute name="mappedTagType" use="optional">
2480 <xs:simpleType>
2481 <xs:restriction base="xs:string">
2482 <xs:minLength value="1" />
2483 </xs:restriction>
2484 </xs:simpleType>
2485 </xs:attribute>
2486 <xs:attribute name="tagType" use="required">
2487 <xs:simpleType>
2488 <xs:restriction base="xs:string">
2489 <xs:minLength value="1" />
2490 </xs:restriction>
2491 </xs:simpleType>
2492 </xs:attribute>
2493 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2494 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2495 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2496 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2497 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2498 </xs:complexType>
2499 </xs:element>
2500 <xs:element name="remove" vs:help="configuration/system.web/pages/tagMapping/remove">
2501 <xs:complexType>
2502 <xs:attribute name="tagType" use="required">
2503 <xs:simpleType>
2504 <xs:restriction base="xs:string">
2505 <xs:minLength value="1" />
2506 </xs:restriction>
2507 </xs:simpleType>
2508 </xs:attribute>
2509 </xs:complexType>
2510 </xs:element>
2511 <xs:element name="clear" vs:help="configuration/system.web/pages/tagMapping/clear">
2512 <xs:complexType>
2513 <!--tag is empty-->
2514 </xs:complexType>
2515 </xs:element>
2516 </xs:choice>
2517 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2518 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2519 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2520 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2521 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2522 </xs:complexType>
2523 </xs:element>
2524 </xs:choice>
2525 <xs:attribute name="asyncTimeout" use="optional">
2526 <xs:simpleType>
2527 <xs:restriction base="xs:string">
2528 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2529 </xs:restriction>
2530 </xs:simpleType>
2531 </xs:attribute>
2532 <xs:attribute name="autoEventWireup" type="small_boolean_Type" use="optional" />
2533 <xs:attribute name="buffer" type="small_boolean_Type" use="optional" />
2534 <xs:attribute name="compilationMode" use="optional">
2535 <xs:simpleType>
2536 <xs:restriction base="xs:NMTOKEN">
2537 <xs:enumeration value="Always" />
2538 <xs:enumeration value="Auto" />
2539 <xs:enumeration value="Never" />
2540 </xs:restriction>
2541 </xs:simpleType>
2542 </xs:attribute>
2543 <xs:attribute name="enableEventValidation" type="small_boolean_Type" use="optional" />
2544 <xs:attribute name="enableSessionState" use="optional">
2545 <xs:simpleType>
2546 <xs:restriction base="xs:NMTOKEN">
2547 <xs:enumeration value="false" />
2548 <xs:enumeration value="ReadOnly" />
2549 <xs:enumeration value="true" />
2550 </xs:restriction>
2551 </xs:simpleType>
2552 </xs:attribute>
2553 <xs:attribute name="enableViewState" type="small_boolean_Type" use="optional" />
2554 <xs:attribute name="enableViewStateMac" type="small_boolean_Type" use="optional" />
2555 <xs:attribute name="maintainScrollPositionOnPostBack" type="small_boolean_Type" use="optional" />
2556 <xs:attribute name="masterPageFile" type="xs:string" use="optional" />
2557 <xs:attribute name="maxPageStateFieldLength" type="xs:int" use="optional" />
2558 <xs:attribute name="pageBaseType" type="xs:string" use="optional" />
2559 <xs:attribute name="pageParserFilterType" type="xs:string" use="optional" />
2560 <xs:attribute name="smartNavigation" type="small_boolean_Type" use="optional" />
2561 <xs:attribute name="styleSheetTheme" type="xs:string" use="optional" />
2562 <xs:attribute name="theme" type="xs:string" use="optional" />
2563 <xs:attribute name="userControlBaseType" type="xs:string" use="optional" />
2564 <xs:attribute name="validateRequest" type="small_boolean_Type" use="optional" />
2565 <xs:attribute name="viewStateEncryptionMode" use="optional">
2566 <xs:simpleType>
2567 <xs:restriction base="xs:NMTOKEN">
2568 <xs:enumeration value="Always" />
2569 <xs:enumeration value="Auto" />
2570 <xs:enumeration value="Never" />
2571 </xs:restriction>
2572 </xs:simpleType>
2573 </xs:attribute>
2574 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2575 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2576 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2577 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2578 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2579 <xs:attribute name="configSource" type="xs:string" use="optional" />
2580 </xs:complexType>
2581 </xs:element>
2582 <xs:element name="processModel" vs:help="configuration/system.web/processModel">
2583 <xs:complexType>
2584 <xs:attribute name="autoConfig" type="small_boolean_Type" use="optional" />
2585 <xs:attribute name="clientConnectedCheck" type="xs:string" use="optional" />
2586 <xs:attribute name="comAuthenticationLevel" use="optional">
2587 <xs:simpleType>
2588 <xs:restriction base="xs:NMTOKEN">
2589 <xs:enumeration value="Call" />
2590 <xs:enumeration value="Connect" />
2591 <xs:enumeration value="Default" />
2592 <xs:enumeration value="None" />
2593 <xs:enumeration value="Pkt" />
2594 <xs:enumeration value="PktIntegrity" />
2595 <xs:enumeration value="PktPrivacy" />
2596 </xs:restriction>
2597 </xs:simpleType>
2598 </xs:attribute>
2599 <xs:attribute name="comImpersonationLevel" use="optional">
2600 <xs:simpleType>
2601 <xs:restriction base="xs:NMTOKEN">
2602 <xs:enumeration value="Anonymous" />
2603 <xs:enumeration value="Default" />
2604 <xs:enumeration value="Delegate" />
2605 <xs:enumeration value="Identify" />
2606 <xs:enumeration value="Impersonate" />
2607 </xs:restriction>
2608 </xs:simpleType>
2609 </xs:attribute>
2610 <xs:attribute name="cpuMask" type="xs:int" use="optional" />
2611 <xs:attribute name="enable" type="small_boolean_Type" use="optional" />
2612 <xs:attribute name="idleTimeout" type="xs:string" use="optional" />
2613 <xs:attribute name="logLevel" use="optional">
2614 <xs:simpleType>
2615 <xs:restriction base="xs:NMTOKEN">
2616 <xs:enumeration value="All" />
2617 <xs:enumeration value="Errors" />
2618 <xs:enumeration value="None" />
2619 </xs:restriction>
2620 </xs:simpleType>
2621 </xs:attribute>
2622 <xs:attribute name="maxAppDomains" use="optional">
2623 <xs:simpleType>
2624 <xs:restriction base="xs:int">
2625 <xs:minInclusive value="1" />
2626 <xs:maxInclusive value="2147483646" />
2627 </xs:restriction>
2628 </xs:simpleType>
2629 </xs:attribute>
2630 <xs:attribute name="maxIoThreads" use="optional">
2631 <xs:simpleType>
2632 <xs:restriction base="xs:int">
2633 <xs:minInclusive value="1" />
2634 <xs:maxInclusive value="2147483646" />
2635 </xs:restriction>
2636 </xs:simpleType>
2637 </xs:attribute>
2638 <xs:attribute name="maxWorkerThreads" use="optional">
2639 <xs:simpleType>
2640 <xs:restriction base="xs:int">
2641 <xs:minInclusive value="1" />
2642 <xs:maxInclusive value="2147483646" />
2643 </xs:restriction>
2644 </xs:simpleType>
2645 </xs:attribute>
2646 <xs:attribute name="memoryLimit" type="xs:int" use="optional" />
2647 <xs:attribute name="minIoThreads" use="optional">
2648 <xs:simpleType>
2649 <xs:restriction base="xs:int">
2650 <xs:minInclusive value="1" />
2651 <xs:maxInclusive value="2147483646" />
2652 </xs:restriction>
2653 </xs:simpleType>
2654 </xs:attribute>
2655 <xs:attribute name="minWorkerThreads" use="optional">
2656 <xs:simpleType>
2657 <xs:restriction base="xs:int">
2658 <xs:minInclusive value="1" />
2659 <xs:maxInclusive value="2147483646" />
2660 </xs:restriction>
2661 </xs:simpleType>
2662 </xs:attribute>
2663 <xs:attribute name="password" type="xs:string" use="optional" />
2664 <xs:attribute name="pingFrequency" type="xs:string" use="optional" />
2665 <xs:attribute name="pingTimeout" type="xs:string" use="optional" />
2666 <xs:attribute name="requestLimit" use="optional">
2667 <xs:simpleType>
2668 <xs:union memberTypes="xs:int Infinite">
2669 <xs:simpleType>
2670 <xs:restriction base="xs:int">
2671 <xs:minInclusive value="0" />
2672 </xs:restriction>
2673 </xs:simpleType>
2674 </xs:union>
2675 </xs:simpleType>
2676 </xs:attribute>
2677 <xs:attribute name="requestQueueLimit" use="optional">
2678 <xs:simpleType>
2679 <xs:union memberTypes="xs:int Infinite">
2680 <xs:simpleType>
2681 <xs:restriction base="xs:int">
2682 <xs:minInclusive value="0" />
2683 </xs:restriction>
2684 </xs:simpleType>
2685 </xs:union>
2686 </xs:simpleType>
2687 </xs:attribute>
2688 <xs:attribute name="responseDeadlockInterval" use="optional">
2689 <xs:simpleType>
2690 <xs:restriction base="xs:string">
2691 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2692 </xs:restriction>
2693 </xs:simpleType>
2694 </xs:attribute>
2695 <xs:attribute name="responseRestartDeadlockInterval" type="xs:string" use="optional" />
2696 <xs:attribute name="restartQueueLimit" use="optional">
2697 <xs:simpleType>
2698 <xs:union memberTypes="xs:int Infinite">
2699 <xs:simpleType>
2700 <xs:restriction base="xs:int">
2701 <xs:minInclusive value="0" />
2702 </xs:restriction>
2703 </xs:simpleType>
2704 </xs:union>
2705 </xs:simpleType>
2706 </xs:attribute>
2707 <xs:attribute name="serverErrorMessageFile" type="xs:string" use="optional" />
2708 <xs:attribute name="shutdownTimeout" use="optional">
2709 <xs:simpleType>
2710 <xs:restriction base="xs:string">
2711 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2712 </xs:restriction>
2713 </xs:simpleType>
2714 </xs:attribute>
2715 <xs:attribute name="timeout" type="xs:string" use="optional" />
2716 <xs:attribute name="userName" type="xs:string" use="optional" />
2717 <xs:attribute name="webGarden" type="small_boolean_Type" use="optional" />
2718 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2719 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2720 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2721 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2722 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2723 <xs:attribute name="configSource" type="xs:string" use="optional" />
2724 </xs:complexType>
2725 </xs:element>
2726 <xs:element name="profile" vs:help="configuration/system.web/profile">
2727 <xs:complexType>
2728 <xs:choice minOccurs="0" maxOccurs="unbounded">
2729 <xs:element name="properties" vs:help="configuration/system.web/profile/properties">
2730 <xs:complexType>
2731 <xs:choice minOccurs="0" maxOccurs="unbounded">
2732 <xs:element name="add" vs:help="configuration/system.web/profile/properties/add">
2733 <xs:complexType>
2734 <xs:attribute name="allowAnonymous" type="small_boolean_Type" use="optional" />
2735 <xs:attribute name="customProviderData" type="xs:string" use="optional" />
2736 <xs:attribute name="defaultValue" type="xs:string" use="optional" />
2737 <xs:attribute name="name" type="xs:string" use="required" />
2738 <xs:attribute name="provider" type="xs:string" use="optional" />
2739 <xs:attribute name="readOnly" type="small_boolean_Type" use="optional" />
2740 <xs:attribute name="serializeAs" use="optional">
2741 <xs:simpleType>
2742 <xs:restriction base="xs:NMTOKEN">
2743 <xs:enumeration value="Binary" />
2744 <xs:enumeration value="ProviderSpecific" />
2745 <xs:enumeration value="String" />
2746 <xs:enumeration value="Xml" />
2747 </xs:restriction>
2748 </xs:simpleType>
2749 </xs:attribute>
2750 <xs:attribute name="type" type="xs:string" use="optional" />
2751 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2752 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2753 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2754 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2755 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2756 </xs:complexType>
2757 </xs:element>
2758 <xs:element name="remove" vs:help="configuration/system.web/profile/properties/remove">
2759 <xs:complexType>
2760 <xs:attribute name="name" type="xs:string" use="required" />
2761 </xs:complexType>
2762 </xs:element>
2763 <xs:element name="clear" vs:help="configuration/system.web/profile/properties/clear">
2764 <xs:complexType>
2765 <!--tag is empty-->
2766 </xs:complexType>
2767 </xs:element>
2768 <xs:element name="group" vs:help="configuration/system.web/profile/properties/group/group">
2769 <xs:complexType>
2770 <xs:choice minOccurs="0" maxOccurs="unbounded">
2771 <xs:element name="add" vs:help="configuration/system.web/profile/properties/group/ProfileGroupSettings/add">
2772 <xs:complexType>
2773 <xs:attribute name="allowAnonymous" type="small_boolean_Type" use="optional" />
2774 <xs:attribute name="customProviderData" type="xs:string" use="optional" />
2775 <xs:attribute name="defaultValue" type="xs:string" use="optional" />
2776 <xs:attribute name="name" type="xs:string" use="required" />
2777 <xs:attribute name="provider" type="xs:string" use="optional" />
2778 <xs:attribute name="readOnly" type="small_boolean_Type" use="optional" />
2779 <xs:attribute name="serializeAs" use="optional">
2780 <xs:simpleType>
2781 <xs:restriction base="xs:NMTOKEN">
2782 <xs:enumeration value="Binary" />
2783 <xs:enumeration value="ProviderSpecific" />
2784 <xs:enumeration value="String" />
2785 <xs:enumeration value="Xml" />
2786 </xs:restriction>
2787 </xs:simpleType>
2788 </xs:attribute>
2789 <xs:attribute name="type" type="xs:string" use="optional" />
2790 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2791 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2792 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2793 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2794 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2795 </xs:complexType>
2796 </xs:element>
2797 <xs:element name="remove" vs:help="configuration/system.web/profile/properties/group/ProfileGroupSettings/remove">
2798 <xs:complexType>
2799 <xs:attribute name="name" type="xs:string" use="required" />
2800 </xs:complexType>
2801 </xs:element>
2802 <xs:element name="clear" vs:help="configuration/system.web/profile/properties/group/ProfileGroupSettings/clear">
2803 <xs:complexType>
2804 <!--tag is empty-->
2805 </xs:complexType>
2806 </xs:element>
2807 </xs:choice>
2808 <xs:attribute name="name" type="xs:string" use="required" />
2809 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2810 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2811 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2812 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2813 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2814 </xs:complexType>
2815 </xs:element>
2816 </xs:choice>
2817 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2818 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2819 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2820 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2821 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2822 </xs:complexType>
2823 </xs:element>
2824 <xs:element name="providers" vs:help="configuration/system.web/profile/providers">
2825 <xs:complexType>
2826 <xs:choice minOccurs="0" maxOccurs="unbounded">
2827 <xs:element name="add" vs:help="configuration/system.web/profile/providers/add">
2828 <xs:complexType>
2829 <xs:attribute name="name" type="xs:string" use="required" />
2830 <xs:attribute name="type" type="xs:string" use="required" />
2831 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2832 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2833 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2834 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2835 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2836 <xs:anyAttribute processContents="skip" />
2837 </xs:complexType>
2838 </xs:element>
2839 <xs:element name="remove" vs:help="configuration/system.web/profile/providers/remove">
2840 <xs:complexType>
2841 <xs:attribute name="name" type="xs:string" use="required" />
2842 </xs:complexType>
2843 </xs:element>
2844 <xs:element name="clear" vs:help="configuration/system.web/profile/providers/clear">
2845 <xs:complexType>
2846 <!--tag is empty-->
2847 </xs:complexType>
2848 </xs:element>
2849 </xs:choice>
2850 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2851 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2852 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2853 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2854 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2855 </xs:complexType>
2856 </xs:element>
2857 </xs:choice>
2858 <xs:attribute name="automaticSaveEnabled" type="small_boolean_Type" use="optional" />
2859 <xs:attribute name="defaultProvider" use="optional">
2860 <xs:simpleType>
2861 <xs:restriction base="xs:string">
2862 <xs:minLength value="1" />
2863 </xs:restriction>
2864 </xs:simpleType>
2865 </xs:attribute>
2866 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
2867 <xs:attribute name="inherits" type="xs:string" use="optional" />
2868 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2869 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2870 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2871 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2872 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2873 <xs:attribute name="configSource" type="xs:string" use="optional" />
2874 </xs:complexType>
2875 </xs:element>
2876 <xs:element name="roleManager" vs:help="configuration/system.web/roleManager">
2877 <xs:complexType>
2878 <xs:choice minOccurs="0" maxOccurs="unbounded">
2879 <xs:element name="providers" vs:help="configuration/system.web/roleManager/providers">
2880 <xs:complexType>
2881 <xs:choice minOccurs="0" maxOccurs="unbounded">
2882 <xs:element name="add" vs:help="configuration/system.web/roleManager/providers/add">
2883 <xs:complexType>
2884 <xs:attribute name="name" type="xs:string" use="required" />
2885 <xs:attribute name="type" type="xs:string" use="required" />
2886 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2887 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2888 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2889 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2890 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2891 <xs:anyAttribute processContents="skip" />
2892 </xs:complexType>
2893 </xs:element>
2894 <xs:element name="remove" vs:help="configuration/system.web/roleManager/providers/remove">
2895 <xs:complexType>
2896 <xs:attribute name="name" type="xs:string" use="required" />
2897 </xs:complexType>
2898 </xs:element>
2899 <xs:element name="clear" vs:help="configuration/system.web/roleManager/providers/clear">
2900 <xs:complexType>
2901 <!--tag is empty-->
2902 </xs:complexType>
2903 </xs:element>
2904 </xs:choice>
2905 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2906 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2907 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2908 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2909 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2910 </xs:complexType>
2911 </xs:element>
2912 </xs:choice>
2913 <xs:attribute name="cacheRolesInCookie" type="small_boolean_Type" use="optional" />
2914 <xs:attribute name="cookieName" use="optional">
2915 <xs:simpleType>
2916 <xs:restriction base="xs:string">
2917 <xs:minLength value="1" />
2918 <xs:whiteSpace value="collapse" />
2919 </xs:restriction>
2920 </xs:simpleType>
2921 </xs:attribute>
2922 <xs:attribute name="cookiePath" use="optional">
2923 <xs:simpleType>
2924 <xs:restriction base="xs:string">
2925 <xs:minLength value="1" />
2926 <xs:whiteSpace value="collapse" />
2927 </xs:restriction>
2928 </xs:simpleType>
2929 </xs:attribute>
2930 <xs:attribute name="cookieProtection" use="optional">
2931 <xs:simpleType>
2932 <xs:restriction base="xs:NMTOKEN">
2933 <xs:enumeration value="All" />
2934 <xs:enumeration value="Encryption" />
2935 <xs:enumeration value="None" />
2936 <xs:enumeration value="Validation" />
2937 </xs:restriction>
2938 </xs:simpleType>
2939 </xs:attribute>
2940 <xs:attribute name="cookieRequireSSL" type="small_boolean_Type" use="optional" />
2941 <xs:attribute name="cookieSlidingExpiration" type="small_boolean_Type" use="optional" />
2942 <xs:attribute name="cookieTimeout" use="optional">
2943 <xs:simpleType>
2944 <xs:restriction base="xs:string">
2945 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
2946 </xs:restriction>
2947 </xs:simpleType>
2948 </xs:attribute>
2949 <xs:attribute name="createPersistentCookie" type="small_boolean_Type" use="optional" />
2950 <xs:attribute name="defaultProvider" use="optional">
2951 <xs:simpleType>
2952 <xs:restriction base="xs:string">
2953 <xs:minLength value="1" />
2954 <xs:whiteSpace value="collapse" />
2955 </xs:restriction>
2956 </xs:simpleType>
2957 </xs:attribute>
2958 <xs:attribute name="domain" type="xs:string" use="optional" />
2959 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
2960 <xs:attribute name="maxCachedResults" type="xs:int" use="optional" />
2961 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2962 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2963 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2964 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2965 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2966 <xs:attribute name="configSource" type="xs:string" use="optional" />
2967 </xs:complexType>
2968 </xs:element>
2969 <xs:element name="securityPolicy" vs:help="configuration/system.web/securityPolicy">
2970 <xs:complexType>
2971 <xs:choice minOccurs="0" maxOccurs="unbounded">
2972 <xs:element name="trustLevel" vs:help="configuration/system.web/securityPolicy/trustLevel">
2973 <xs:complexType>
2974 <xs:attribute name="name" use="required">
2975 <xs:simpleType>
2976 <xs:restriction base="xs:string">
2977 <xs:minLength value="1" />
2978 </xs:restriction>
2979 </xs:simpleType>
2980 </xs:attribute>
2981 <xs:attribute name="policyFile" type="xs:string" use="required" />
2982 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2983 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2984 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2985 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2986 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2987 </xs:complexType>
2988 </xs:element>
2989 </xs:choice>
2990 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
2991 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
2992 <xs:attribute name="lockElements" type="xs:string" use="optional" />
2993 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
2994 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
2995 <xs:attribute name="configSource" type="xs:string" use="optional" />
2996 </xs:complexType>
2997 </xs:element>
2998 <xs:element name="sessionPageState" vs:help="configuration/system.web/sessionPageState">
2999 <xs:complexType>
3000 <xs:attribute name="historySize" use="optional">
3001 <xs:simpleType>
3002 <xs:restriction base="xs:int">
3003 <xs:minInclusive value="1" />
3004 </xs:restriction>
3005 </xs:simpleType>
3006 </xs:attribute>
3007 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3008 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3009 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3010 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3011 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3012 <xs:attribute name="configSource" type="xs:string" use="optional" />
3013 </xs:complexType>
3014 </xs:element>
3015 <xs:element name="sessionState" vs:help="configuration/system.web/sessionState">
3016 <xs:complexType>
3017 <xs:choice minOccurs="0" maxOccurs="unbounded">
3018 <xs:element name="providers" vs:help="configuration/system.web/sessionState/providers">
3019 <xs:complexType>
3020 <xs:choice minOccurs="0" maxOccurs="unbounded">
3021 <xs:element name="add" vs:help="configuration/system.web/sessionState/providers/add">
3022 <xs:complexType>
3023 <xs:attribute name="name" type="xs:string" use="required" />
3024 <xs:attribute name="type" type="xs:string" use="required" />
3025 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3026 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3027 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3028 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3029 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3030 </xs:complexType>
3031 </xs:element>
3032 <xs:element name="remove" vs:help="configuration/system.web/sessionState/providers/remove">
3033 <xs:complexType>
3034 <xs:attribute name="name" type="xs:string" use="required" />
3035 </xs:complexType>
3036 </xs:element>
3037 <xs:element name="clear" vs:help="configuration/system.web/sessionState/providers/clear">
3038 <xs:complexType>
3039 <!--tag is empty-->
3040 </xs:complexType>
3041 </xs:element>
3042 </xs:choice>
3043 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3044 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3045 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3046 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3047 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3048 </xs:complexType>
3049 </xs:element>
3050 </xs:choice>
3051 <xs:attribute name="allowCustomSqlDatabase" type="small_boolean_Type" use="optional" />
3052 <xs:attribute name="cookieless" use="optional">
3053 <xs:simpleType>
3054 <xs:restriction base="xs:NMTOKEN">
3055 <xs:enumeration value="AutoDetect" />
3056 <xs:enumeration value="UseCookies" />
3057 <xs:enumeration value="UseDeviceProfile" />
3058 <xs:enumeration value="UseUri" />
3059 <xs:enumeration value="true" />
3060 <xs:enumeration value="false" />
3061 </xs:restriction>
3062 </xs:simpleType>
3063 </xs:attribute>
3064 <xs:attribute name="cookieName" type="xs:string" use="optional" />
3065 <xs:attribute name="customProvider" type="xs:string" use="optional" />
3066 <xs:attribute name="mode" use="optional">
3067 <xs:simpleType>
3068 <xs:restriction base="xs:NMTOKEN">
3069 <xs:enumeration value="Custom" />
3070 <xs:enumeration value="InProc" />
3071 <xs:enumeration value="Off" />
3072 <xs:enumeration value="SQLServer" />
3073 <xs:enumeration value="StateServer" />
3074 </xs:restriction>
3075 </xs:simpleType>
3076 </xs:attribute>
3077 <xs:attribute name="partitionResolverType" type="xs:string" use="optional" />
3078 <xs:attribute name="regenerateExpiredSessionId" type="small_boolean_Type" use="optional" />
3079 <xs:attribute name="sessionIDManagerType" type="xs:string" use="optional" />
3080 <xs:attribute name="sqlCommandTimeout" type="xs:string" use="optional" />
3081 <xs:attribute name="sqlConnectionString" type="xs:string" use="optional" />
3082 <xs:attribute name="stateConnectionString" type="xs:string" use="optional" />
3083 <xs:attribute name="stateNetworkTimeout" type="xs:string" use="optional" />
3084 <xs:attribute name="timeout" use="optional">
3085 <xs:simpleType>
3086 <xs:restriction base="xs:string">
3087 <xs:pattern value="([0-9.]+:){0,1}([0-9]+:){0,1}[0-9.]+" />
3088 </xs:restriction>
3089 </xs:simpleType>
3090 </xs:attribute>
3091 <xs:attribute name="useHostingIdentity" type="small_boolean_Type" use="optional" />
3092 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3093 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3094 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3095 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3096 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3097 <xs:attribute name="configSource" type="xs:string" use="optional" />
3098 </xs:complexType>
3099 </xs:element>
3100 <xs:element name="siteMap" vs:help="configuration/system.web/siteMap">
3101 <xs:complexType>
3102 <xs:choice minOccurs="0" maxOccurs="unbounded">
3103 <xs:element name="providers" vs:help="configuration/system.web/siteMap/providers">
3104 <xs:complexType>
3105 <xs:choice minOccurs="0" maxOccurs="unbounded">
3106 <xs:element name="add" vs:help="configuration/system.web/siteMap/providers/add">
3107 <xs:complexType>
3108 <xs:attribute name="name" type="xs:string" use="required" />
3109 <xs:attribute name="type" type="xs:string" use="required" />
3110 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3111 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3112 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3113 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3114 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3115 <xs:anyAttribute processContents="skip" />
3116 </xs:complexType>
3117 </xs:element>
3118 <xs:element name="remove" vs:help="configuration/system.web/siteMap/providers/remove">
3119 <xs:complexType>
3120 <xs:attribute name="name" type="xs:string" use="required" />
3121 </xs:complexType>
3122 </xs:element>
3123 <xs:element name="clear" vs:help="configuration/system.web/siteMap/providers/clear">
3124 <xs:complexType>
3125 <!--tag is empty-->
3126 </xs:complexType>
3127 </xs:element>
3128 </xs:choice>
3129 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3130 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3131 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3132 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3133 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3134 </xs:complexType>
3135 </xs:element>
3136 </xs:choice>
3137 <xs:attribute name="defaultProvider" use="optional">
3138 <xs:simpleType>
3139 <xs:restriction base="xs:string">
3140 <xs:minLength value="1" />
3141 </xs:restriction>
3142 </xs:simpleType>
3143 </xs:attribute>
3144 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
3145 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3146 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3147 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3148 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3149 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3150 <xs:attribute name="configSource" type="xs:string" use="optional" />
3151 </xs:complexType>
3152 </xs:element>
3153 <xs:element name="trace" vs:help="configuration/system.web/trace">
3154 <xs:complexType>
3155 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
3156 <xs:attribute name="localOnly" type="small_boolean_Type" use="optional" />
3157 <xs:attribute name="mostRecent" type="small_boolean_Type" use="optional" />
3158 <xs:attribute name="pageOutput" type="small_boolean_Type" use="optional" />
3159 <xs:attribute name="requestLimit" use="optional">
3160 <xs:simpleType>
3161 <xs:restriction base="xs:int">
3162 <xs:minInclusive value="0" />
3163 </xs:restriction>
3164 </xs:simpleType>
3165 </xs:attribute>
3166 <xs:attribute name="traceMode" use="optional">
3167 <xs:simpleType>
3168 <xs:restriction base="xs:NMTOKEN">
3169 <xs:enumeration value="SortByCategory" />
3170 <xs:enumeration value="SortByTime" />
3171 </xs:restriction>
3172 </xs:simpleType>
3173 </xs:attribute>
3174 <xs:attribute name="writeToDiagnosticsTrace" type="small_boolean_Type" use="optional" />
3175 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3176 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3177 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3178 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3179 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3180 <xs:attribute name="configSource" type="xs:string" use="optional" />
3181 </xs:complexType>
3182 </xs:element>
3183 <xs:element name="trust" vs:help="configuration/system.web/trust">
3184 <xs:complexType>
3185 <xs:attribute name="level" use="required">
3186 <xs:simpleType>
3187 <xs:restriction base="xs:string">
3188 <xs:minLength value="1" />
3189 </xs:restriction>
3190 </xs:simpleType>
3191 </xs:attribute>
3192 <xs:attribute name="originUrl" type="xs:string" use="optional" />
3193 <xs:attribute name="processRequestInApplicationTrust" type="small_boolean_Type" use="optional" />
3194 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3195 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3196 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3197 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3198 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3199 <xs:attribute name="configSource" type="xs:string" use="optional" />
3200 </xs:complexType>
3201 </xs:element>
3202 <xs:element name="urlMappings" vs:help="configuration/system.web/urlMappings">
3203 <xs:complexType>
3204 <xs:choice minOccurs="0" maxOccurs="unbounded">
3205 <xs:element name="add" vs:help="configuration/system.web/urlMappings/add">
3206 <xs:complexType>
3207 <xs:attribute name="mappedUrl" type="xs:string" use="required" />
3208 <xs:attribute name="url" type="xs:string" use="required" />
3209 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3210 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3211 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3212 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3213 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3214 </xs:complexType>
3215 </xs:element>
3216 <xs:element name="remove" vs:help="configuration/system.web/urlMappings/remove">
3217 <xs:complexType>
3218 <xs:attribute name="url" type="xs:string" use="required" />
3219 </xs:complexType>
3220 </xs:element>
3221 <xs:element name="clear" vs:help="configuration/system.web/urlMappings/clear">
3222 <xs:complexType>
3223 <!--tag is empty-->
3224 </xs:complexType>
3225 </xs:element>
3226 </xs:choice>
3227 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
3228 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3229 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3230 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3231 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3232 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3233 <xs:attribute name="configSource" type="xs:string" use="optional" />
3234 </xs:complexType>
3235 </xs:element>
3236 <xs:element name="webControls" vs:help="configuration/system.web/webControls">
3237 <xs:complexType>
3238 <xs:attribute name="clientScriptsLocation" use="required">
3239 <xs:simpleType>
3240 <xs:restriction base="xs:string">
3241 <xs:minLength value="1" />
3242 </xs:restriction>
3243 </xs:simpleType>
3244 </xs:attribute>
3245 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3246 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3247 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3248 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3249 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3250 <xs:attribute name="configSource" type="xs:string" use="optional" />
3251 </xs:complexType>
3252 </xs:element>
3253 <xs:element name="webParts" vs:help="configuration/system.web/webParts">
3254 <xs:complexType>
3255 <xs:choice minOccurs="0" maxOccurs="unbounded">
3256 <xs:element name="personalization" vs:help="configuration/system.web/webParts/personalization">
3257 <xs:complexType>
3258 <xs:choice minOccurs="0" maxOccurs="unbounded">
3259 <xs:element name="authorization" vs:help="configuration/system.web/webParts/personalization/authorization">
3260 <xs:complexType>
3261 <xs:choice minOccurs="0" maxOccurs="unbounded">
3262 <xs:element name="allow" vs:help="configuration/system.web/webParts/personalization/authorization/allow">
3263 <xs:complexType>
3264 <xs:attribute name="roles" type="xs:string" use="optional" />
3265 <xs:attribute name="users" type="xs:string" use="optional" />
3266 <xs:attribute name="verbs" type="xs:string" use="optional" />
3267 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3268 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3269 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3270 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3271 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3272 </xs:complexType>
3273 </xs:element>
3274 <xs:element name="deny" vs:help="configuration/system.web/webParts/personalization/authorization/deny">
3275 <xs:complexType>
3276 <xs:attribute name="roles" type="xs:string" use="optional" />
3277 <xs:attribute name="users" type="xs:string" use="optional" />
3278 <xs:attribute name="verbs" type="xs:string" use="optional" />
3279 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3280 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3281 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3282 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3283 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3284 </xs:complexType>
3285 </xs:element>
3286 </xs:choice>
3287 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3288 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3289 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3290 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3291 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3292 </xs:complexType>
3293 </xs:element>
3294 <xs:element name="providers" vs:help="configuration/system.web/webParts/personalization/providers">
3295 <xs:complexType>
3296 <xs:choice minOccurs="0" maxOccurs="unbounded">
3297 <xs:element name="add" vs:help="configuration/system.web/webParts/personalization/providers/add">
3298 <xs:complexType>
3299 <xs:attribute name="name" type="xs:string" use="required" />
3300 <xs:attribute name="type" type="xs:string" use="required" />
3301 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3302 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3303 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3304 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3305 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3306 <xs:anyAttribute processContents="skip" />
3307 </xs:complexType>
3308 </xs:element>
3309 <xs:element name="remove" vs:help="configuration/system.web/webParts/personalization/providers/remove">
3310 <xs:complexType>
3311 <xs:attribute name="name" type="xs:string" use="required" />
3312 </xs:complexType>
3313 </xs:element>
3314 <xs:element name="clear" vs:help="configuration/system.web/webParts/personalization/providers/clear">
3315 <xs:complexType>
3316 <!--tag is empty-->
3317 </xs:complexType>
3318 </xs:element>
3319 </xs:choice>
3320 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3321 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3322 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3323 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3324 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3325 </xs:complexType>
3326 </xs:element>
3327 </xs:choice>
3328 <xs:attribute name="defaultProvider" use="optional">
3329 <xs:simpleType>
3330 <xs:restriction base="xs:string">
3331 <xs:minLength value="1" />
3332 </xs:restriction>
3333 </xs:simpleType>
3334 </xs:attribute>
3335 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3336 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3337 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3338 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3339 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3340 </xs:complexType>
3341 </xs:element>
3342 <xs:element name="transformers" vs:help="configuration/system.web/webParts/transformers">
3343 <xs:complexType>
3344 <xs:choice minOccurs="0" maxOccurs="unbounded">
3345 <xs:element name="add" vs:help="configuration/system.web/webParts/transformers/add">
3346 <xs:complexType>
3347 <xs:anyAttribute processContents="skip" />
3348 </xs:complexType>
3349 </xs:element>
3350 <xs:element name="remove" vs:help="configuration/system.web/webParts/transformers/remove">
3351 <xs:complexType>
3352 <xs:attribute name="name" use="required">
3353 <xs:simpleType>
3354 <xs:restriction base="xs:string">
3355 <xs:minLength value="1" />
3356 </xs:restriction>
3357 </xs:simpleType>
3358 </xs:attribute>
3359 </xs:complexType>
3360 </xs:element>
3361 <xs:element name="clear" vs:help="configuration/system.web/webParts/transformers/clear">
3362 <xs:complexType>
3363 <!--tag is empty-->
3364 </xs:complexType>
3365 </xs:element>
3366 </xs:choice>
3367 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3368 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3369 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3370 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3371 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3372 </xs:complexType>
3373 </xs:element>
3374 </xs:choice>
3375 <xs:attribute name="enableExport" type="small_boolean_Type" use="optional" />
3376 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3377 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3378 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3379 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3380 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3381 <xs:attribute name="configSource" type="xs:string" use="optional" />
3382 </xs:complexType>
3383 </xs:element>
3384 <xs:element name="webServices" vs:help="configuration/system.web/webServices">
3385 <xs:complexType>
3386 <xs:choice minOccurs="0" maxOccurs="unbounded">
3387 <xs:element name="conformanceWarnings" vs:help="configuration/system.web/webServices/conformanceWarnings">
3388 <xs:complexType>
3389 <xs:choice minOccurs="0" maxOccurs="unbounded">
3390 <xs:element name="add" vs:help="configuration/system.web/webServices/conformanceWarnings/add">
3391 <xs:complexType>
3392 <xs:attribute name="name" use="optional">
3393 <xs:simpleType>
3394 <xs:union>
3395 <xs:simpleType>
3396 <xs:restriction base="xs:NMTOKEN">
3397 <xs:enumeration value="BasicProfile1_1" />
3398 <xs:enumeration value="None" />
3399 </xs:restriction>
3400 </xs:simpleType>
3401 <xs:simpleType>
3402 <xs:restriction base="xs:string" />
3403 </xs:simpleType>
3404 </xs:union>
3405 </xs:simpleType>
3406 </xs:attribute>
3407 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3408 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3409 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3410 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3411 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3412 </xs:complexType>
3413 </xs:element>
3414 <xs:element name="remove" vs:help="configuration/system.web/webServices/conformanceWarnings/remove">
3415 <xs:complexType>
3416 <xs:attribute name="name" use="optional">
3417 <xs:simpleType>
3418 <xs:union>
3419 <xs:simpleType>
3420 <xs:restriction base="xs:NMTOKEN">
3421 <xs:enumeration value="BasicProfile1_1" />
3422 <xs:enumeration value="None" />
3423 </xs:restriction>
3424 </xs:simpleType>
3425 <xs:simpleType>
3426 <xs:restriction base="xs:string" />
3427 </xs:simpleType>
3428 </xs:union>
3429 </xs:simpleType>
3430 </xs:attribute>
3431 </xs:complexType>
3432 </xs:element>
3433 <xs:element name="clear" vs:help="configuration/system.web/webServices/conformanceWarnings/clear">
3434 <xs:complexType>
3435 <!--tag is empty-->
3436 </xs:complexType>
3437 </xs:element>
3438 </xs:choice>
3439 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3440 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3441 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3442 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3443 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3444 </xs:complexType>
3445 </xs:element>
3446 <xs:element name="diagnostics" vs:help="configuration/system.web/webServices/diagnostics">
3447 <xs:complexType>
3448 <xs:attribute name="suppressReturningExceptions" type="small_boolean_Type" use="optional" />
3449 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3450 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3451 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3452 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3453 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3454 </xs:complexType>
3455 </xs:element>
3456 <xs:element name="protocols" vs:help="configuration/system.web/webServices/protocols">
3457 <xs:complexType>
3458 <xs:choice minOccurs="0" maxOccurs="unbounded">
3459 <xs:element name="add" vs:help="configuration/system.web/webServices/protocols/add">
3460 <xs:complexType>
3461 <xs:attribute name="name" use="optional">
3462 <xs:simpleType>
3463 <xs:union>
3464 <xs:simpleType>
3465 <xs:restriction base="xs:NMTOKEN">
3466 <xs:enumeration value="AnyHttpSoap" />
3467 <xs:enumeration value="Documentation" />
3468 <xs:enumeration value="HttpGet" />
3469 <xs:enumeration value="HttpPost" />
3470 <xs:enumeration value="HttpPostLocalhost" />
3471 <xs:enumeration value="HttpSoap" />
3472 <xs:enumeration value="HttpSoap12" />
3473 <xs:enumeration value="Unknown" />
3474 </xs:restriction>
3475 </xs:simpleType>
3476 <xs:simpleType>
3477 <xs:restriction base="xs:string" />
3478 </xs:simpleType>
3479 </xs:union>
3480 </xs:simpleType>
3481 </xs:attribute>
3482 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3483 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3484 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3485 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3486 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3487 </xs:complexType>
3488 </xs:element>
3489 <xs:element name="remove" vs:help="configuration/system.web/webServices/protocols/remove">
3490 <xs:complexType>
3491 <xs:attribute name="name" use="optional">
3492 <xs:simpleType>
3493 <xs:union>
3494 <xs:simpleType>
3495 <xs:restriction base="xs:NMTOKEN">
3496 <xs:enumeration value="AnyHttpSoap" />
3497 <xs:enumeration value="Documentation" />
3498 <xs:enumeration value="HttpGet" />
3499 <xs:enumeration value="HttpPost" />
3500 <xs:enumeration value="HttpPostLocalhost" />
3501 <xs:enumeration value="HttpSoap" />
3502 <xs:enumeration value="HttpSoap12" />
3503 <xs:enumeration value="Unknown" />
3504 </xs:restriction>
3505 </xs:simpleType>
3506 <xs:simpleType>
3507 <xs:restriction base="xs:string" />
3508 </xs:simpleType>
3509 </xs:union>
3510 </xs:simpleType>
3511 </xs:attribute>
3512 </xs:complexType>
3513 </xs:element>
3514 <xs:element name="clear" vs:help="configuration/system.web/webServices/protocols/clear">
3515 <xs:complexType>
3516 <!--tag is empty-->
3517 </xs:complexType>
3518 </xs:element>
3519 </xs:choice>
3520 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3521 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3522 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3523 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3524 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3525 </xs:complexType>
3526 </xs:element>
3527 <xs:element name="serviceDescriptionFormatExtensionTypes" vs:help="configuration/system.web/webServices/serviceDescriptionFormatExtensionTypes">
3528 <xs:complexType>
3529 <xs:choice minOccurs="0" maxOccurs="unbounded">
3530 <xs:element name="add" vs:help="configuration/system.web/webServices/serviceDescriptionFormatExtensionTypes/add">
3531 <xs:complexType>
3532 <xs:attribute name="type" type="xs:string" use="optional" />
3533 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3534 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3535 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3536 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3537 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3538 </xs:complexType>
3539 </xs:element>
3540 <xs:element name="remove" vs:help="configuration/system.web/webServices/serviceDescriptionFormatExtensionTypes/remove">
3541 <xs:complexType>
3542 <xs:attribute name="type" type="xs:string" use="optional" />
3543 </xs:complexType>
3544 </xs:element>
3545 <xs:element name="clear" vs:help="configuration/system.web/webServices/serviceDescriptionFormatExtensionTypes/clear">
3546 <xs:complexType>
3547 <!--tag is empty-->
3548 </xs:complexType>
3549 </xs:element>
3550 </xs:choice>
3551 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3552 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3553 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3554 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3555 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3556 </xs:complexType>
3557 </xs:element>
3558 <xs:element name="soapEnvelopeProcessing" vs:help="configuration/system.web/webServices/soapEnvelopeProcessing">
3559 <xs:complexType>
3560 <xs:attribute name="strict" type="small_boolean_Type" use="optional" />
3561 <xs:attribute name="readTimeout" use="optional">
3562 <xs:simpleType>
3563 <xs:union memberTypes="xs:int Infinite">
3564 <xs:simpleType>
3565 <xs:restriction base="xs:int" />
3566 </xs:simpleType>
3567 </xs:union>
3568 </xs:simpleType>
3569 </xs:attribute>
3570 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3571 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3572 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3573 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3574 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3575 </xs:complexType>
3576 </xs:element>
3577 <xs:element name="soapExtensionImporterTypes" vs:help="configuration/system.web/webServices/soapExtensionImporterTypes">
3578 <xs:complexType>
3579 <xs:choice minOccurs="0" maxOccurs="unbounded">
3580 <xs:element name="add" vs:help="configuration/system.web/webServices/soapExtensionImporterTypes/add">
3581 <xs:complexType>
3582 <xs:attribute name="type" type="xs:string" use="optional" />
3583 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3584 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3585 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3586 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3587 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3588 </xs:complexType>
3589 </xs:element>
3590 <xs:element name="remove" vs:help="configuration/system.web/webServices/soapExtensionImporterTypes/remove">
3591 <xs:complexType>
3592 <xs:attribute name="type" type="xs:string" use="optional" />
3593 </xs:complexType>
3594 </xs:element>
3595 <xs:element name="clear" vs:help="configuration/system.web/webServices/soapExtensionImporterTypes/clear">
3596 <xs:complexType>
3597 <!--tag is empty-->
3598 </xs:complexType>
3599 </xs:element>
3600 </xs:choice>
3601 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3602 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3603 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3604 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3605 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3606 </xs:complexType>
3607 </xs:element>
3608 <xs:element name="soapExtensionReflectorTypes" vs:help="configuration/system.web/webServices/soapExtensionReflectorTypes">
3609 <xs:complexType>
3610 <xs:choice minOccurs="0" maxOccurs="unbounded">
3611 <xs:element name="add" vs:help="configuration/system.web/webServices/soapExtensionReflectorTypes/add">
3612 <xs:complexType>
3613 <xs:attribute name="type" type="xs:string" use="optional" />
3614 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3615 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3616 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3617 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3618 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3619 </xs:complexType>
3620 </xs:element>
3621 <xs:element name="remove" vs:help="configuration/system.web/webServices/soapExtensionReflectorTypes/remove">
3622 <xs:complexType>
3623 <xs:attribute name="type" type="xs:string" use="optional" />
3624 </xs:complexType>
3625 </xs:element>
3626 <xs:element name="clear" vs:help="configuration/system.web/webServices/soapExtensionReflectorTypes/clear">
3627 <xs:complexType>
3628 <!--tag is empty-->
3629 </xs:complexType>
3630 </xs:element>
3631 </xs:choice>
3632 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3633 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3634 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3635 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3636 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3637 </xs:complexType>
3638 </xs:element>
3639 <xs:element name="soapExtensionTypes" vs:help="configuration/system.web/webServices/soapExtensionTypes">
3640 <xs:complexType>
3641 <xs:choice minOccurs="0" maxOccurs="unbounded">
3642 <xs:element name="add" vs:help="configuration/system.web/webServices/soapExtensionTypes/add">
3643 <xs:complexType>
3644 <xs:attribute name="group" use="optional">
3645 <xs:simpleType>
3646 <xs:restriction base="xs:NMTOKEN">
3647 <xs:enumeration value="High" />
3648 <xs:enumeration value="Low" />
3649 </xs:restriction>
3650 </xs:simpleType>
3651 </xs:attribute>
3652 <xs:attribute name="priority" use="optional">
3653 <xs:simpleType>
3654 <xs:restriction base="xs:int">
3655 <xs:minInclusive value="0" />
3656 </xs:restriction>
3657 </xs:simpleType>
3658 </xs:attribute>
3659 <xs:attribute name="type" type="xs:string" use="optional" />
3660 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3661 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3662 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3663 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3664 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3665 </xs:complexType>
3666 </xs:element>
3667 <xs:element name="remove" vs:help="configuration/system.web/webServices/soapExtensionTypes/remove">
3668 <xs:complexType>
3669 <xs:attribute name="group" use="optional">
3670 <xs:simpleType>
3671 <xs:restriction base="xs:NMTOKEN">
3672 <xs:enumeration value="High" />
3673 <xs:enumeration value="Low" />
3674 </xs:restriction>
3675 </xs:simpleType>
3676 </xs:attribute>
3677 <xs:attribute name="priority" use="optional">
3678 <xs:simpleType>
3679 <xs:restriction base="xs:int">
3680 <xs:minInclusive value="0" />
3681 </xs:restriction>
3682 </xs:simpleType>
3683 </xs:attribute>
3684 <xs:attribute name="type" type="xs:string" use="optional" />
3685 </xs:complexType>
3686 </xs:element>
3687 <xs:element name="clear" vs:help="configuration/system.web/webServices/soapExtensionTypes/clear">
3688 <xs:complexType>
3689 <!--tag is empty-->
3690 </xs:complexType>
3691 </xs:element>
3692 </xs:choice>
3693 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3694 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3695 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3696 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3697 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3698 </xs:complexType>
3699 </xs:element>
3700 <xs:element name="soapServerProtocolFactory" vs:help="configuration/system.web/webServices/soapServerProtocolFactory">
3701 <xs:complexType>
3702 <xs:attribute name="type" type="xs:string" use="optional" />
3703 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3704 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3705 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3706 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3707 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3708 </xs:complexType>
3709 </xs:element>
3710 <xs:element name="soapTransportImporterTypes" vs:help="configuration/system.web/webServices/soapTransportImporterTypes">
3711 <xs:complexType>
3712 <xs:choice minOccurs="0" maxOccurs="unbounded">
3713 <xs:element name="add" vs:help="configuration/system.web/webServices/soapTransportImporterTypes/add">
3714 <xs:complexType>
3715 <xs:attribute name="type" type="xs:string" use="optional" />
3716 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3717 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3718 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3719 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3720 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3721 </xs:complexType>
3722 </xs:element>
3723 <xs:element name="remove" vs:help="configuration/system.web/webServices/soapTransportImporterTypes/remove">
3724 <xs:complexType>
3725 <xs:attribute name="type" type="xs:string" use="optional" />
3726 </xs:complexType>
3727 </xs:element>
3728 <xs:element name="clear" vs:help="configuration/system.web/webServices/soapTransportImporterTypes/clear">
3729 <xs:complexType>
3730 <!--tag is empty-->
3731 </xs:complexType>
3732 </xs:element>
3733 </xs:choice>
3734 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3735 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3736 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3737 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3738 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3739 </xs:complexType>
3740 </xs:element>
3741 <xs:element name="wsdlHelpGenerator" vs:help="configuration/system.web/webServices/wsdlHelpGenerator">
3742 <xs:complexType>
3743 <xs:attribute name="href" type="xs:string" use="required" />
3744 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3745 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3746 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3747 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3748 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3749 </xs:complexType>
3750 </xs:element>
3751 </xs:choice>
3752 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3753 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3754 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3755 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3756 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3757 <xs:attribute name="configSource" type="xs:string" use="optional" />
3758 </xs:complexType>
3759 </xs:element>
3760 <xs:element name="xhtmlConformance" vs:help="configuration/system.web/xhtmlConformance">
3761 <xs:complexType>
3762 <xs:attribute name="mode" use="optional">
3763 <xs:simpleType>
3764 <xs:restriction base="xs:NMTOKEN">
3765 <xs:enumeration value="Legacy" />
3766 <xs:enumeration value="Strict" />
3767 <xs:enumeration value="Transitional" />
3768 </xs:restriction>
3769 </xs:simpleType>
3770 </xs:attribute>
3771 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3772 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3773 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3774 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3775 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3776 <xs:attribute name="configSource" type="xs:string" use="optional" />
3777 </xs:complexType>
3778 </xs:element>
3779 <xs:element name="caching" vs:help="configuration/system.web/caching">
3780 <xs:complexType>
3781 <xs:choice minOccurs="0" maxOccurs="unbounded">
3782 <xs:element name="cache" vs:help="configuration/system.web/caching/cache">
3783 <xs:complexType>
3784 <xs:attribute name="disableExpiration" type="small_boolean_Type" use="optional" />
3785 <xs:attribute name="disableMemoryCollection" type="small_boolean_Type" use="optional" />
3786 <xs:attribute name="percentagePhysicalMemoryUsedLimit" use="optional">
3787 <xs:simpleType>
3788 <xs:restriction base="xs:int">
3789 <xs:minInclusive value="0" />
3790 </xs:restriction>
3791 </xs:simpleType>
3792 </xs:attribute>
3793 <xs:attribute name="privateBytesLimit" type="xs:int" use="optional" />
3794 <xs:attribute name="privateBytesPollTime" type="xs:string" use="optional" />
3795 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3796 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3797 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3798 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3799 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3800 <xs:attribute name="configSource" type="xs:string" use="optional" />
3801 </xs:complexType>
3802 </xs:element>
3803 <xs:element name="outputCache" vs:help="configuration/system.web/caching/outputCache">
3804 <xs:complexType>
3805 <xs:attribute name="enableFragmentCache" type="small_boolean_Type" use="optional" />
3806 <xs:attribute name="enableOutputCache" type="small_boolean_Type" use="optional" />
3807 <xs:attribute name="omitVaryStar" type="small_boolean_Type" use="optional" />
3808 <xs:attribute name="sendCacheControlHeader" type="small_boolean_Type" use="optional" />
3809 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3810 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3811 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3812 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3813 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3814 <xs:attribute name="configSource" type="xs:string" use="optional" />
3815 </xs:complexType>
3816 </xs:element>
3817 <xs:element name="outputCacheSettings" vs:help="configuration/system.web/caching/outputCacheSettings">
3818 <xs:complexType>
3819 <xs:choice minOccurs="0" maxOccurs="unbounded">
3820 <xs:element name="outputCacheProfiles" vs:help="configuration/system.web/caching/outputCacheSettings/outputCacheProfiles">
3821 <xs:complexType>
3822 <xs:choice minOccurs="0" maxOccurs="unbounded">
3823 <xs:element name="add" vs:help="configuration/system.web/caching/outputCacheSettings/outputCacheProfiles/add">
3824 <xs:complexType>
3825 <xs:attribute name="duration" type="xs:int" use="optional" />
3826 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
3827 <xs:attribute name="location" use="optional">
3828 <xs:simpleType>
3829 <xs:restriction base="xs:NMTOKEN">
3830 <xs:enumeration value="Any" />
3831 <xs:enumeration value="Client" />
3832 <xs:enumeration value="Downstream" />
3833 <xs:enumeration value="None" />
3834 <xs:enumeration value="Server" />
3835 <xs:enumeration value="ServerAndClient" />
3836 </xs:restriction>
3837 </xs:simpleType>
3838 </xs:attribute>
3839 <xs:attribute name="name" use="required">
3840 <xs:simpleType>
3841 <xs:restriction base="xs:string">
3842 <xs:minLength value="1" />
3843 <xs:whiteSpace value="collapse" />
3844 </xs:restriction>
3845 </xs:simpleType>
3846 </xs:attribute>
3847 <xs:attribute name="noStore" type="small_boolean_Type" use="optional" />
3848 <xs:attribute name="sqlDependency" type="xs:string" use="optional" />
3849 <xs:attribute name="varyByControl" type="xs:string" use="optional" />
3850 <xs:attribute name="varyByCustom" type="xs:string" use="optional" />
3851 <xs:attribute name="varyByHeader" type="xs:string" use="optional" />
3852 <xs:attribute name="varyByParam" type="xs:string" use="optional" />
3853 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3854 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3855 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3856 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3857 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3858 </xs:complexType>
3859 </xs:element>
3860 <xs:element name="remove" vs:help="configuration/system.web/caching/outputCacheSettings/outputCacheProfiles/remove">
3861 <xs:complexType>
3862 <xs:attribute name="name" use="required">
3863 <xs:simpleType>
3864 <xs:restriction base="xs:string">
3865 <xs:minLength value="1" />
3866 <xs:whiteSpace value="collapse" />
3867 </xs:restriction>
3868 </xs:simpleType>
3869 </xs:attribute>
3870 </xs:complexType>
3871 </xs:element>
3872 <xs:element name="clear" vs:help="configuration/system.web/caching/outputCacheSettings/outputCacheProfiles/clear">
3873 <xs:complexType>
3874 <!--tag is empty-->
3875 </xs:complexType>
3876 </xs:element>
3877 </xs:choice>
3878 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3879 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3880 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3881 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3882 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3883 </xs:complexType>
3884 </xs:element>
3885 </xs:choice>
3886 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3887 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3888 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3889 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3890 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3891 <xs:attribute name="configSource" type="xs:string" use="optional" />
3892 </xs:complexType>
3893 </xs:element>
3894 <xs:element name="sqlCacheDependency" vs:help="configuration/system.web/caching/sqlCacheDependency">
3895 <xs:complexType>
3896 <xs:choice minOccurs="0" maxOccurs="unbounded">
3897 <xs:element name="databases" vs:help="configuration/system.web/caching/sqlCacheDependency/databases">
3898 <xs:complexType>
3899 <xs:choice minOccurs="0" maxOccurs="unbounded">
3900 <xs:element name="add" vs:help="configuration/system.web/caching/sqlCacheDependency/databases/add">
3901 <xs:complexType>
3902 <xs:attribute name="connectionStringName" use="required">
3903 <xs:simpleType>
3904 <xs:restriction base="xs:string">
3905 <xs:minLength value="1" />
3906 </xs:restriction>
3907 </xs:simpleType>
3908 </xs:attribute>
3909 <xs:attribute name="name" use="required">
3910 <xs:simpleType>
3911 <xs:restriction base="xs:string">
3912 <xs:minLength value="1" />
3913 </xs:restriction>
3914 </xs:simpleType>
3915 </xs:attribute>
3916 <xs:attribute name="pollTime" type="xs:int" use="optional" />
3917 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3918 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3919 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3920 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3921 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3922 </xs:complexType>
3923 </xs:element>
3924 <xs:element name="remove" vs:help="configuration/system.web/caching/sqlCacheDependency/databases/remove">
3925 <xs:complexType>
3926 <xs:attribute name="name" use="required">
3927 <xs:simpleType>
3928 <xs:restriction base="xs:string">
3929 <xs:minLength value="1" />
3930 </xs:restriction>
3931 </xs:simpleType>
3932 </xs:attribute>
3933 </xs:complexType>
3934 </xs:element>
3935 <xs:element name="clear" vs:help="configuration/system.web/caching/sqlCacheDependency/databases/clear">
3936 <xs:complexType>
3937 <!--tag is empty-->
3938 </xs:complexType>
3939 </xs:element>
3940 </xs:choice>
3941 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3942 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3943 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3944 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3945 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3946 </xs:complexType>
3947 </xs:element>
3948 </xs:choice>
3949 <xs:attribute name="enabled" type="small_boolean_Type" use="optional" />
3950 <xs:attribute name="pollTime" type="xs:int" use="optional" />
3951 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3952 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3953 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3954 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3955 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3956 <xs:attribute name="configSource" type="xs:string" use="optional" />
3957 </xs:complexType>
3958 </xs:element>
3959 </xs:choice>
3960 </xs:complexType>
3961 </xs:element>
3962 </xs:choice>
3963 </xs:complexType>
3964 </xs:element>
3965 <xs:element name="system.xml.serialization" vs:help="configuration/system.xml.serialization">
3966 <xs:complexType>
3967 <xs:choice minOccurs="0" maxOccurs="unbounded">
3968 <xs:element name="dateTimeSerialization" vs:help="configuration/system.xml.serialization/dateTimeSerialization">
3969 <xs:complexType>
3970 <xs:attribute name="mode" use="optional">
3971 <xs:simpleType>
3972 <xs:restriction base="xs:NMTOKEN">
3973 <xs:enumeration value="Default" />
3974 <xs:enumeration value="Local" />
3975 <xs:enumeration value="Roundtrip" />
3976 </xs:restriction>
3977 </xs:simpleType>
3978 </xs:attribute>
3979 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3980 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3981 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3982 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3983 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3984 <xs:attribute name="configSource" type="xs:string" use="optional" />
3985 </xs:complexType>
3986 </xs:element>
3987 <xs:element name="schemaImporterExtensions" vs:help="configuration/system.xml.serialization/schemaImporterExtensions">
3988 <xs:complexType>
3989 <xs:choice minOccurs="0" maxOccurs="unbounded">
3990 <xs:element name="add" vs:help="configuration/system.xml.serialization/schemaImporterExtensions/add">
3991 <xs:complexType>
3992 <xs:attribute name="name" type="xs:string" use="required" />
3993 <xs:attribute name="type" type="xs:string" use="optional" />
3994 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
3995 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
3996 <xs:attribute name="lockElements" type="xs:string" use="optional" />
3997 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
3998 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
3999 </xs:complexType>
4000 </xs:element>
4001 <xs:element name="remove" vs:help="configuration/system.xml.serialization/schemaImporterExtensions/remove">
4002 <xs:complexType>
4003 <xs:attribute name="name" type="xs:string" use="required" />
4004 </xs:complexType>
4005 </xs:element>
4006 <xs:element name="clear" vs:help="configuration/system.xml.serialization/schemaImporterExtensions/clear">
4007 <xs:complexType>
4008 <!--tag is empty-->
4009 </xs:complexType>
4010 </xs:element>
4011 </xs:choice>
4012 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
4013 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
4014 <xs:attribute name="lockElements" type="xs:string" use="optional" />
4015 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
4016 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
4017 <xs:attribute name="configSource" type="xs:string" use="optional" />
4018 </xs:complexType>
4019 </xs:element>
4020 <xs:element name="xmlSerializer" vs:help="configuration/system.xml.serialization/xmlSerializer">
4021 <xs:complexType>
4022 <xs:attribute name="checkDeserializeAdvances" type="small_boolean_Type" use="optional" />
4023 <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
4024 <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
4025 <xs:attribute name="lockElements" type="xs:string" use="optional" />
4026 <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
4027 <xs:attribute name="lockItem" type="small_boolean_Type" use="optional" />
4028 <xs:attribute name="configSource" type="xs:string" use="optional" />
4029 </xs:complexType>
4030 </xs:element>
4031 </xs:choice>
4032 </xs:complexType>
4033 </xs:element>
4034 </xs:schema>
(New empty file)
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 #!/usr/bin/env python
8 # -*- coding: utf-8 -*-
9
10 import re
11 from lxml import etree as ET
12
13 VRAI = ['yes','on','1']
14 FAUX = ['no','off','0']
15
16 def equals(value1,value2):
17 if (value1.lower() in VRAI and value2.lower() in VRAI) or (value1.lower() in FAUX and value2.lower() in FAUX):
18 return True
19 else:
20 return False
21
22 #Good practices
23 rules = {
24 'session.use_cookies':['Cookies for sessions are disabled','1'],
25 'session.use_only_cookies':['Only cookies for sessions is disabled','1'],
26 'session.cookie_httponly':['Cookies are not set to HTTP only','1'],
27 'session.bug_compat_42':['Bug compatibility 42 is enabled','0'],
28 'session.bug_compat_warn':['Bug compatibility 42 warning is enabled','0'],
29 'session.use_trans_sid':['Use of \'use_trans_sid\' is considered harmful','0'],
30 'session.cookie_secure':['Cookie is not set to secure connection','1'],
31 'session.use_strict_mode':['Strict mode is disabled for session fixation prevention','1'],
32 'session.cookie_domain':['Cookie domain is not set',''],
33 'session.hash_function':['Weak session id generation: a stronger hash function such as SHA256 should be used',''],
34 'allow_url_fopen':['Remote file opening is allowed','off'],
35 'allow_url_include':['Remote file including is allowed','off'],
36 'error_reporting':['Errors reports are enabled in production','0'],
37 'display_errors':['Errors should not be shown in production','off'],
38 'log_errors':['Log errors are not written in production','on'],
39 'expose_php':['PHP signature should disabled','off'],
40 'register_globals':['Register globals is enabled','off'],
41 'magic_quotes_gpc':['Magic quotes is enabled','off'],
42 'magic_quotes_runtime':['Magic quotes is enabled at runtime','off'],
43 'safe_mode':['Safe mode is enabled','off'],
44 'register_long_arrays':['Register long arrays is enabled','off'],
45 'display_startup_errors':['Startup errors is displayed','off'],
46 'max_input_vars':['Maximum input variables is not set',''],
47 'open_basedir':['You should restrict PHP\'s file system access (basedir)',''],
48 'memory_limit':['You should define a reasonable memory limit (<128 M)',''],
49 'post_max_size':['You should define a reasonable max post size ',''],
50 'upload_max_filesize':['You should define a reasonable max upload size',''],
51 'upload_tmp_dir':['You should define a temporary directory used for file uploads',''],
52 'asp_tags':['ASP tag handling is not turned off','0'],
53 'xdebug.default_enable':['Xdebug is enabled','0'],
54 'xdebug.remote_enable':['Xdebug should not be trying to contact debug clients','0'],
55 }
56
57 #Lines of config whose default values are bad
58 bad_default_config = ['session.cookie_httponly','session.bug_compat_42',
59 'session.bug_compat_warn','allow_url_fopen',
60 'error_reporting','display_errors','log_errors',
61 'expose_php','magic_quotes_gpc','register_long_arrays']
62
63 #Lines of config that is not set (value by the user)
64 is_set_config = ['max_input_vars','open_basedir', 'memory_limit','post_max_size',
65 'upload_max_filesize','upload_tmp_dir']
66
67 #Weak hashing functions
68 weak_functions = ['md2', 'md4', 'md5', 'sha1', 'gost', 'snefru', '0', '1']
69
70 #To-be-disabled functions
71 weak_php_functions = ['passthru', 'shell_exec', 'exec',
72 'system', 'popen', 'stream_select']
73
74
75 class PhpIniScan:
76
77 def __init__(self, file, xml):
78 self.config = ""
79 for line in open(file,"r"):
80 if not re.match(r'(^(;|\[))',line,) and line[0] != '\n':
81 self.config += line.lstrip()
82 self.recommended = "\nRecommended configuration changes in php.ini:\n"
83 self.xml = xml
84
85 def xml_export(self,directive,rec):
86 if self.xml is not None:
87 newElement = ET.SubElement(self.xml, directive[0])
88 newElement.attrib['rec'] = rec
89 newElement.text = directive[1]
90
91 def global_check(self):
92 print "[+]\033[0;41mVulnerabilites/Informations\033[0m:"
93 for line in self.config.split('\n'):
94 directive = ''.join(line.split()).split('=')
95
96 if ( rules.has_key(directive[0]) and not equals(rules[directive[0]][1],directive[1])) or directive[0] in bad_default_config:
97 print " \033[1;30m({})\033[0m {}".format(directive[0],rules[directive[0]][0])
98 self.recommended += " {} = {}\n".format(directive[0],rules[directive[0]][1])
99 self.xml_export(directive,rules[directive[0]][0])
100 continue
101
102 if rules.has_key(directive[0]) and directive[1] == "":
103 print " \033[1;30m({})\033[0m {}".format(directive[0],rules[directive[0]][0])
104 self.recommended += " {} = {}\n".format(directive[0],rules[directive[0]][1])
105 self.xml_export(directive,rules[directive[0]][0])
106 continue
107
108 if directive[0] == "session.hash_function" and directive[1] in weak_functions:
109 print " \033[1;30m({})\033[0m {}".format(directive[0],rules[directive[0]][0])
110 self.recommended += " {} = sha256\n".format(directive[0])
111 self.xml_export(directive,rules[directive[0]][0])
112 continue
113
114 if directive[0] == "disable_functions":
115 for option in weak_php_functions:
116 if not option in directive[1]:
117 print " \033[1;30m(disable_functions)\033[0m {} not listed".format(option)
118 self.recommended += " disable_functions = ... , {} , ...\n".format(option)
119 self.xml_export(directive,"")
120 continue
121
122 for element in is_set_config:
123 if not element in self.config:
124 print " \033[1;30m({})\033[0m {}".format(element,rules[element][0])
125 self.recommended += " {} is not set\n".format(element)
126 directive = [element,'isNotSet']
127 self.xml_export(directive,rules[directive[0]][0])
128
129 for element in bad_default_config:
130 if not element in self.config:
131 print " \033[1;30m({})\033[0m {}".format(element,rules[element][0])
132 self.recommended += " {} = {}\n".format(element,rules[element][1])
133 directive = [element,'defaultValue']
134 self.xml_export(directive,rules[directive[0]][0])
135
136 # TODO Session save path not set or world writeable || CheckSessionPath
137 # TODO Entropy file is not defined || CheckSessionEntropyPath
138 # TODO Maximum post size too large || MaximumPostSize
139 # TODO Disable harmful CLI functions || DisableCliFunctions
140 # TODO CVE-2013-1635 || CheckSoapWsdlCacheDir
141 # TODO Ensure file uploads workCheck || UploadTmpDir
142 # TODO check the sizes (in M) f some parameters)
143
144 def scanner(file,recmode,xml):
145 filetoscan = PhpIniScan(file,xml)
146 filetoscan.global_check()
147 if recmode:
148 print filetoscan.recommended
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 #!/usr/bin/env python
8 # -*- coding: utf-8 -*-
9
10 from lxml import etree as ET
11
12 rules = {
13 'compilation':{'debug':['ASP.NET Debugging enabled',
14 'false']},
15 'customErrors':{'mode':['Custom Errors disabled',
16 'on remoteonly']},
17 'forms':{'cookieless':['Cookieless authentication Enabled for form',
18 'usecookies'],
19 'requireSSL':['SSL connection is not required',
20 'true'],
21 'slidingExpiration':['Sliding expiration enabled',
22 'false'],
23 'enableCrossAppRedirects':['URL Redirection enabled',
24 'false'],
25 'protection':['The cookies are only encrypted or only validated or not protected',
26 'all']},
27 'httpCookies':{'httpOnlyCookies':['Web cookies are not HttpOnly',
28 'true'],
29 'requireSSL':['Web cookies don\'t require SSL',
30 'true']},
31 'pages':{'enableViewState':['ViewState is enabled (CRSF vulnerability)',
32 'true'],
33 'enableViewStateMac':['ViewState integrity is not checked',
34 'true'],
35 'viewStateEncryptionMode':['ViewState may not be encrypted',
36 'always'],
37 'validateRequest':['Page Validation is not used (XSS vulnerability)',
38 'true']},
39 'roleManager':{'cookieRequireSSL':['Cookies don\'t Require SSL',
40 'true'],
41 'cookieSlidingExpiration':['Sliding expiration enabled',
42 'false'],
43 'cookieProtection':['The cookies are only encrypted or only validated or not protected',
44 'all'],
45 'cookiePath':['Liberal path defined','']},
46 'sessionState':{'cookieless':['Cookieless session stated enabled',
47 'usecookies']},
48 'trace':{'enabled':['Trace is enabled',
49 'false'],
50 'localOnly':['Trace localOnly on false',
51 'true']},
52 'trust':{'level':['Web application\'s trust level is higher than Minimal',
53 'minimal']},
54 'user':{'':['Passwords (or its hashes) are hardcoded','']}
55 }
56
57 class WebConfigScan:
58
59 def __init__(self, file, xml):
60 tree = ET.parse(file)
61 self.root = tree.getroot()
62 self.recommended = "\nRecommended configuration changes in web.config:\n"
63 self.xml = xml
64
65 def xml_export(self,directive,rec):
66 if self.xml is not None:
67 newElement = ET.SubElement(self.xml, directive[0])
68 if len(directive) == 4:
69 newElement.attrib['name'] = directive[3]
70 newElement.attrib['option'] = directive[1]
71 newElement.attrib['rec'] = rec
72 newElement.text = directive[2]
73
74
75 def global_check(self):
76 print "[+]\033[0;41mVulnerabilites/Informations\033[0m:"
77 countforms = 0
78 nameforms = []
79 for element in rules:
80 for tag in self.root.findall(".//"+element):
81 if element == "forms":
82 countforms += 1
83 nameforms.append(tag.attrib['name'])
84 if element == "user":
85 print " \033[1;30m{}\033[0m {}: {} \033[1;30m({})\033[0m".format(element,
86 tag.attrib['name'],
87 rules[element][''][0],
88 option)
89 self.recommended += " Not to store passwords or hashes in web.config\n"
90 self.xml_export(directive=[element, tag.attrib['name'],'hardcoded'],
91 rec=rules[element][''][0])
92 continue
93
94 for option in tag.attrib:
95 if element == "customErrors" and rules[element].has_key(option) and not tag.attrib[option].lower() in rules[element][option][1]:
96 print " \033[1;30m{}\033[0m: {} \033[1;30m({})\033[0m".format(element,
97 rules[element][option][0],
98 option)
99 self.recommended += " <{} {}=\"{}\"/>\n".format(element,option,rules[element][option][1])
100 self.xml_export(directive=[element,option,'disabled'],
101 rec=rules[element][option][0])
102 continue
103
104 elif element == "roleManager" and option == "cookiePath":
105 print " \033[1;30mroleManager\033[0m: Liberal path defined ('{}') (\033[1;30mcookiePath\033[0m)".format(tag.attrib[option].lower())
106 self.recommended += " <roleManager cookiePath=\"{abcd1234…}\">\n"
107 self.xml_export(directive=[element,option,'liberal'],
108 rec=rules[element][option][0])
109 continue
110
111 if rules[element].has_key(option) and tag.attrib[option].lower() != rules[element][option][1]:
112 if element == "forms":
113 print " \033[1;30m{}\033[0m {}: {} \033[1;30m({})\033[0m".format(element,
114 tag.attrib['name'],
115 rules[element][option][0],
116 option)
117 self.xml_export(directive=[element,option,tag.attrib[option],tag.attrib['name']],
118 rec=rules[element][option][0])
119
120 else:
121 print " \033[1;30m{}\033[0m: {} \033[1;30m({})\033[0m".format(element,
122 rules[element][option][0],
123 option)
124
125 self.xml_export(directive=[element,option,tag.attrib[option]],
126 rec=rules[element][option][0])
127 self.recommended += " <{} {}=\"{}\"/>\n".format(element,option,rules[element][option][1])
128 continue
129
130 if countforms > 1 and (nameforms.index('.ASPXAUTH') != "-1" or nameforms.index('ASPXAUTH') != "-1"):
131 print " \033[1;30mforms\033[0m: Non-Unique authentication cookie used\033[1;30m (name)\033[0m"
132 self.recommended += " <forms name=\"{abcd1234…}\">\n"
133 self.xml_export(directive=['nameforms','name','false'],
134 rec="Non-Unique authentication cookie used")
135
136 def scanner(file,recmode,xml):
137 filetoscan = WebConfigScan(file,xml)
138 filetoscan.global_check()
139 if recmode:
140 print filetoscan.recommended
141
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
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
07 __all__ = ['pty_']
212212 try:
213213 buf = os.read(fd, 4096)
214214 except OSError:
215 import traceback
216 traceback.print_exc()
215 # import traceback
216 # traceback.print_exc()
217217 return
218218 lenlist[0] = len(buf)
219219 if not buf:
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
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 '''
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
0 #!/usr/bin/python
1 '''
2 Faraday Penetration Test IDE
3 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
4 See the file 'doc/LICENSE' for the license information
5
6 '''
7 import unittest
8 import sys
9 import os
10 sys.path.append(os.path.abspath(os.getcwd()))
11
12 from model.common import ModelObjectVuln
13
14
15 class VulnerabilityCreationTests(unittest.TestCase):
16
17 def testStandarizeNumericVulnSeverity(self):
18 """ Verifies numeric severity transformed into 'info, low, high,
19 critical' severity"""
20
21 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
22 severity=0)
23
24 self.assertEquals(vuln.severity, 'info',
25 'Vulnerability severity not transformed correctly')
26
27 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
28 severity=1)
29
30 self.assertEquals(vuln.severity, 'low',
31 'Vulnerability severity not transformed correctly')
32
33 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
34 severity=2)
35
36 self.assertEquals(vuln.severity, 'med',
37 'Vulnerability severity not transformed correctly')
38
39 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
40 severity=3)
41
42 self.assertEquals(vuln.severity, 'high',
43 'Vulnerability severity not transformed correctly')
44
45 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
46 severity=4)
47
48 self.assertEquals(vuln.severity, 'critical',
49 'Vulnerability severity not transformed correctly')
50
51
52 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
53 severity=5)
54
55 self.assertEquals(vuln.severity, 'unclassified',
56 'Vulnerability severity not transformed correctly')
57
58 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
59 severity=-1)
60
61 self.assertEquals(vuln.severity, 'unclassified',
62 'Vulnerability severity not transformed correctly')
63
64 def testStandarizeShortnameVulnSeverity(self):
65 """ Verifies longname severity transformed into 'info, low, high,
66 critical' severity (informational -> info)"""
67
68 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
69 severity='informational')
70
71 self.assertEquals(vuln.severity, 'info',
72 'Vulnerability severity not transformed correctly')
73
74 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
75 severity='medium')
76
77 self.assertEquals(vuln.severity, 'med',
78 'Vulnerability severity not transformed correctly')
79
80 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
81 severity='highest')
82
83 self.assertEquals(vuln.severity, 'high',
84 'Vulnerability severity not transformed correctly')
85
86 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
87 severity='criticalosiuos')
88
89 self.assertEquals(vuln.severity, 'critical',
90 'Vulnerability severity not transformed correctly')
91
92 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
93 severity='tuvieja')
94
95 self.assertEquals(vuln.severity, 'unclassified',
96 'Vulnerability severity not transformed correctly')
97
98 def testStandarizeUpdatedSeverity(self):
99 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
100 severity='informational')
101
102 self.assertEquals(vuln.severity, 'info',
103 'Vulnerability severity not transformed correctly')
104
105 vuln.updateAttributes(severity='3')
106 self.assertEquals(vuln.severity, 'high',
107 'Vulnerability severity not transformed correctly')
108
109
110 class VulnerabiltyEdtionTests(unittest.TestCase):
111 def testChangeVulnDescription(self):
112 """
113 Until we have a single attribute to store the vuln's descrption
114 we need to make sure we're always accessing the valid one (_desc)
115 """
116 vuln = ModelObjectVuln(
117 name='VulnTest', desc='TestDescription', severity='info')
118
119 self.assertEquals(vuln._desc, 'TestDescription',
120 'Vulnerability desc should be the given during creation')
121
122 vuln.setDescription("new description")
123
124 self.assertEquals(vuln.getDescription(), 'new description',
125 'Vulnerability desc wasn\'t updated correctly')
126
127 self.assertEquals(vuln._desc, 'new description',
128 'Vulnerability desc wasn\'t updated correctly')
129
130 def testChangeVulnDescriptionUsingUpdateAttributesMethod(self):
131 """
132 Until we have a single attribute to store the vuln's descrption
133 we need to make sure we're always accessing the valid one (_desc)
134 """
135 vuln = ModelObjectVuln(
136 name='VulnTest', desc='TestDescription', severity='info')
137
138 self.assertEquals(vuln._desc, 'TestDescription',
139 'Vulnerability desc should be the given during creation')
140
141 vuln.updateAttributes(desc="new description")
142
143 self.assertEquals(vuln.getDescription(), 'new description',
144 'Vulnerability desc wasn\'t updated correctly')
145
146 self.assertEquals(vuln._desc, 'new description',
147 'Vulnerability desc wasn\'t updated correctly')
148
149
150 if __name__ == '__main__':
151 unittest.main()
152
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
00 #!/usr/bin/python
11
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
+0
-122
test_cases/vulns.py less more
0 #!/usr/bin/python
1 '''
2 Faraday Penetration Test IDE - Community Version
3 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
4 See the file 'doc/LICENSE' for the license information
5
6 '''
7 from unittest import TestCase
8 import unittest
9 import sys
10 sys.path.append('.')
11 import model.controller as controller
12 import plugins.core as plcore
13 from mockito import mock
14 from model import api
15 from model.hosts import Host, Interface, Service
16 from managers.model_managers import WorkspaceManager
17 from model.common import ModelObjectVuln, ModelObjectVulnWeb
18 from persistence.orm import WorkspacePersister
19 import random
20 from persistence.orm import WorkspacePersister
21
22
23 class VulnerabilityCreationTests(unittest.TestCase):
24
25 def testStandarizeNumericVulnSeverity(self):
26 """ Verifies numeric severity transformed into 'info, low, high,
27 critical' severity"""
28
29 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
30 severity=0)
31
32 self.assertEquals(vuln.severity, 'info',
33 'Vulnerability severity not transformed correctly')
34
35 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
36 severity=1)
37
38 self.assertEquals(vuln.severity, 'low',
39 'Vulnerability severity not transformed correctly')
40
41 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
42 severity=2)
43
44 self.assertEquals(vuln.severity, 'med',
45 'Vulnerability severity not transformed correctly')
46
47 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
48 severity=3)
49
50 self.assertEquals(vuln.severity, 'high',
51 'Vulnerability severity not transformed correctly')
52
53 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
54 severity=4)
55
56 self.assertEquals(vuln.severity, 'critical',
57 'Vulnerability severity not transformed correctly')
58
59
60 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
61 severity=5)
62
63 self.assertEquals(vuln.severity, 'unclassified',
64 'Vulnerability severity not transformed correctly')
65
66 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
67 severity=-1)
68
69 self.assertEquals(vuln.severity, 'unclassified',
70 'Vulnerability severity not transformed correctly')
71
72 def testStandarizeShortnameVulnSeverity(self):
73 """ Verifies longname severity transformed into 'info, low, high,
74 critical' severity (informational -> info)"""
75
76 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
77 severity='informational')
78
79 self.assertEquals(vuln.severity, 'info',
80 'Vulnerability severity not transformed correctly')
81
82 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
83 severity='medium')
84
85 self.assertEquals(vuln.severity, 'med',
86 'Vulnerability severity not transformed correctly')
87
88 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
89 severity='highest')
90
91 self.assertEquals(vuln.severity, 'high',
92 'Vulnerability severity not transformed correctly')
93
94 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
95 severity='criticalosiuos')
96
97 self.assertEquals(vuln.severity, 'critical',
98 'Vulnerability severity not transformed correctly')
99
100 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
101 severity='tuvieja')
102
103 self.assertEquals(vuln.severity, 'unclassified',
104 'Vulnerability severity not transformed correctly')
105
106 def testStandarizeUpdatedSeverity(self):
107 vuln = ModelObjectVuln(name='VulnTest', desc='TestDescription',
108 severity='informational')
109
110 self.assertEquals(vuln.severity, 'info',
111 'Vulnerability severity not transformed correctly')
112
113 vuln.updateAttributes(severity='3')
114 self.assertEquals(vuln.severity, 'high',
115 'Vulnerability severity not transformed correctly')
116
117
118
119 if __name__ == '__main__':
120 unittest.main()
121
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 #!/usr/bin/python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55
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 '''
00 #!/usr/bin/env python2
11 # -*- coding: utf-8 -*-
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
7676 serv = couchdbkit.Server(source_server)
7777
7878 logger.info('We are about to upload CouchdbViews in Server [%s]' % source_server)
79 if not query_yes_no("Faraday won't behave correctly with older versions, proceed?", 'no'):
80 return
79 # if not query_yes_no("Faraday won't behave correctly with older versions, proceed?", 'no'):
80 # return
8181
8282 dbs = filter(lambda x: not x.startswith("_") and 'backup' not in x and \
8383 'reports' not in x, serv.all_dbs())
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
99 import socket
1010 import struct
1111 import sys
12 import requests
1213
1314 def get_hash(parts):
14
15
1516 return hashlib.sha1("._.".join(parts)).hexdigest()
1617
1718 def new_id():
1819 return uuid.uuid4()
19
20
2021 def get_macaddress(host):
2122 if sys.platform in ['linux','linux2']:
2223 with open("/proc/net/arp") as fh:
2627 return fields[3]
2728 else:
2829 return None
29
30
3031 def gateway():
3132 ip=""
3233 if sys.platform in ['linux','linux2']:
3940 mac=get_macaddress(ip)
4041 return [str(ip),str(mac)]
4142 elif sys.platform in ['darwin']:
42
43
4344 return None
4445 else:
4546 return None
46
4747
48
48
49 def checkSSL(uri):
50 """
51 This method checks SSL validation
52 It only returns True if the certificate is valid
53 and the http server returned a 200 OK
54 """
55 try:
56 res = requests.get(uri, timeout=5)
57 return res.ok
58 except Exception:
59 return False
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
11 # -*- coding: utf-8 -*-
22
33 '''
4 Faraday Penetration Test IDE - Community Version
4 Faraday Penetration Test IDE
55 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
66 See the file 'doc/LICENSE' for the license information
77
88 '''
99 import logging
10 import logging.config
10 import logging.handlers
1111 import os
12 from config.globals import *
1213
13 logname = 'log.conf'
1414
15 logpath = os.path.dirname(os.path.realpath(__file__))
16 logfile = os.path.join(logpath, logname)
17 logging.config.fileConfig(logfile)
15 FARADAY_USER_HOME = os.path.expanduser(CONST_FARADAY_HOME_PATH)
16 LOG_FILE = os.path.join(FARADAY_USER_HOME, CONST_FARADAY_LOGS_PATH, 'faraday.log')
17
18 # Default logger
19
20 logger = logging.getLogger('faraday')
21 logger.propagate = False
22 logger.setLevel(logging.INFO)
23
24 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
25
26 ch = logging.StreamHandler()
27 ch.setFormatter(formatter)
28 logger.addHandler(ch)
29
30
31 def setUpLogger():
32 from config.configuration import getInstanceConfiguration
33 CONF = getInstanceConfiguration()
34 logger = logging.getLogger('faraday')
35
36 level = logging.INFO
37 if CONF.getDebugStatus():
38 level = logging.DEBUG
39
40 logger.setLevel(level)
41 fh = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=5*1024*1024, backupCount=5)
42 fh.setFormatter(formatter)
43 logger.addHandler(fh)
44
1845
1946 def getLogger(obj):
2047 """Creates a logger named by a string or an object's class name.
2148 Allowing logger to additionally accept strings as names for non-class loggings.
2249 """
2350 if type(obj) is str:
24 logger = logging.getLogger(obj)
51 logger = logging.getLogger('%s.%s' % ('faraday', obj))
2552 else:
26 logger = logging.getLogger(obj.__class__.__name__)
53 logger = logging.getLogger('%s.%s' % ('faraday', obj.__class__.__name__))
2754 return logger
00 #!/usr/bin/env python
11
22 '''
3 Faraday Penetration Test IDE - Community Version
3 Faraday Penetration Test IDE
44 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
55 See the file 'doc/LICENSE' for the license information
66
00 '''
1 Faraday Penetration Test IDE - Community Version
1 Faraday Penetration Test IDE
22 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 See the file 'doc/LICENSE' for the license information
44
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
07 """
18 Profiling hooks
29
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
07 import sys
18
29 def query_yes_no(question, default="yes"):
+0
-9
views/_design/commands/views/list/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="CommandRunInformation"){
5 key = doc.command + " " + doc.params;
6 emit(key, {"startdate": doc.itime, "duration": doc.duration, "hostname": doc.hostname, "user": doc.user, "ip": doc.ip});
7 }
8 }
+0
-1
views/_design/hosts/views/byinterfacecount/desc.txt less more
0 cuenta cantidad de interfaces por host, devuelve idHost, cant
+0
-11
views/_design/hosts/views/byinterfacecount/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Interface"){
5 if(doc.parent != 'null') {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, 1);
8 }
9 }
10 }
+0
-10
views/_design/hosts/views/byinterfacecount/reduce.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
+0
-1
views/_design/hosts/views/byservicecount/desc.txt less more
0 cuenta cantidad de servicios por host, devuelve idHost, cant
+0
-10
views/_design/hosts/views/byservicecount/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 if(doc.type=="Service" & (doc.status =='open' | doc.status =='running')){
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, 1);
8 }
9 }
+0
-8
views/_design/hosts/views/byservicecount/reduce.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4 return values.reduce(function(previousValue, currentValue, index, array){
5 return previousValue + currentValue;
6 });
7 }
+0
-1
views/_design/hosts/views/byservices/desc.txt less more
0 cuenta cantidad de servicios totales, devuelve nombreServicio, cant
+0
-11
views/_design/hosts/views/byservices/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null' & (doc.status =='open' | doc.status =='running')) {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(doc.name, 1);
8 }
9 }
10 }
+0
-10
views/_design/hosts/views/byservices/reduce.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
+0
-1
views/_design/hosts/views/hosts/desc.txt less more
0 cuenta hosts totales, devuelve idHost, nombreHost
+0
-8
views/_design/hosts/views/hosts/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Host"){
5 emit(doc._id, {"name": doc.name, "os": doc.os, "owned": doc.owned});
6 }
7 }
+0
-1
views/_design/hosts/views/summarized/desc.txt less more
0 cuenta cantidad de items totales, nombreItem, cant para Services, Serv owned, Hosts, Hosts owned, Interfaces, Notes, Total Vulnerabilities, Web Vulns, Common Vulns
+0
-25
views/_design/hosts/views/summarized/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service") {
5 emit("services", 1);
6 } else if(doc.type=="Service" && doc.owned == "True") {
7 emit("services owned", 1);
8 } else if(doc.type=="Host") {
9 emit("hosts", 1);
10 } else if(doc.type=="Host" && doc.owned == "True") {
11 emit("hosts owned", 1);
12 } else if(doc.type=="Interface") {
13 emit("interfaces", 1);
14 } else if(doc.type=="Note") {
15 emit("notes", 1);
16 } else if(doc.type=="VulnerabilityWeb" || doc.type=="Vulnerability") {
17 if(doc.type=="VulnerabilityWeb") {
18 emit("web vulns", 1);
19 } else {
20 emit("vulns", 1);
21 }
22 emit("total vulns", 1);
23 }
24 }
+0
-10
views/_design/hosts/views/summarized/reduce.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
+0
-1
views/_design/hosts/views/vulns/desc.txt less more
0 cuenta vulnerabilidades por prioridad, devuelve idPrioridad, cant donde idPrioridad esta entre 0 y 4 (info, low, medium, high, critical y 5 unclassified)
+0
-9
views/_design/hosts/views/vulns/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 if(doc.type=="Vulnerability" || doc.type=="VulnerabilityWeb") {
6 emit(doc.severity, 1);
7 }
8 }
+0
-12
views/_design/hosts/views/vulns/reduce.js less more
0
1 // Faraday Penetration Test IDE - Community Version
2 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
3 // See the file 'doc/LICENSE' for the license information
4 //
5 function (key, values) {
6
7 return values.reduce(function(previousValue, currentValue, index, array){
8 return previousValue + currentValue;
9 });
10
11 }
+0
-3
views/_design/mapper/views/byparent/desc.txt less more
0 Get the documents grouped by parent.
1
2 The mapper needs to get the documents owned by some parent
+0
-8
views/_design/mapper/views/byparent/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 parent = doc.parent
6 emit(parent, {'_id': doc._id, 'type': doc.type});
7 }
+0
-3
views/_design/mapper/views/byparentandtype/desc.txt less more
0 Get the documents grouped by parent and type.
1
2 The mapper needs to get the documents owned by some parent, and of some kind (type)
+0
-11
views/_design/mapper/views/byparentandtype/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 var parent = "None"
6 if (doc.parent) {
7 parent = doc.parent
8 }
9 emit([parent, doc.type], doc._id);
10 }
+0
-1
views/_design/services/views/byhost/desc.txt less more
0 trae todos los servicios que tienen padre y usa como key el ID del host padre
+0
-17
views/_design/services/views/byhost/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null') {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, {"name": doc.name,
8 "description": doc.description,
9 "protocol": doc.protocol,
10 "ports": doc.ports,
11 "status": doc.status,
12 "owned": doc.owned,
13 "hid": hid});
14 }
15 }
16 }
+0
-1
views/_design/services/views/byname/desc.txt less more
0 trae todos los servicios que tienen padre y usa como key el nombre del servicio
+0
-17
views/_design/services/views/byname/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null' & (doc.status =='open' | doc.status =='running')) {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(doc.name, {"name": doc.name,
8 "description": doc.description,
9 "protocol": doc.protocol,
10 "ports": doc.ports,
11 "status": doc.status,
12 "owned": doc.owned,
13 "hid": hid});
14 }
15 }
16 }
+0
-1
views/_design/utils/views/docs/desc.txt less more
0 retrieve all docs except design docs
+0
-7
views/_design/utils/views/docs/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc){
5 emit(doc._id, doc);
6 }
+0
-1
views/_design/vulns/views/all/desc.txt less more
0 gets all vulns from workspace, regardless of their type (regular/web).
+0
-22
views/_design/vulns/views/all/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "Vulnerability" || doc.type == "VulnerabilityWeb"){
5 var obj = {
6 "rev": doc._rev,
7 "desc": doc.desc,
8 "meta": doc.metadata,
9 "date": doc.metadata.create_time,
10 "name": doc.name,
11 "oid": doc.obj_id,
12 "owned": doc.owned,
13 "owner": doc.owner,
14 "parent": doc.parent,
15 "refs": doc.refs,
16 "severity": doc.severity,
17 "status": doc.type
18 };
19 emit(doc._id, obj);
20 }
21 }
+0
-1
views/_design/vulns/views/vulns/desc.txt less more
0 gets all vulnerabilities from workspace, except web ones.
+0
-23
views/_design/vulns/views/vulns/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "Vulnerability"){
5 var obj = {
6 "rev": doc._rev,
7 "data": doc.data,
8 "date": doc.metadata.create_time,
9 "desc": doc.desc,
10 "meta": doc.metadata,
11 "name": doc.name,
12 "oid": doc.obj_id,
13 "owned": doc.owned,
14 "owner": doc.owner,
15 "parent": doc.parent,
16 "refs": doc.refs,
17 "severity": doc.severity,
18 "type": doc.type
19 };
20 emit(doc._id, obj);
21 }
22 }
+0
-1
views/_design/vulns/views/web/desc.txt less more
0 gets all web vulns from workspace.
+0
-32
views/_design/vulns/views/web/map.js less more
0 // Faraday Penetration Test IDE - Community Version
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "VulnerabilityWeb"){
5 var obj = {
6 "rev": doc._rev,
7 "data": doc.data,
8 "date": doc.metadata.create_time,
9 "desc": doc.desc,
10 "meta": doc.metadata,
11 "name": doc.name,
12 "oid": doc.obj_id,
13 "owned": doc.owned,
14 "owner": doc.owner,
15 "parent": doc.parent,
16 "refs": doc.refs,
17 "severity": doc.severity,
18 "type": doc.type,
19 /*** specific fields of web vulns ***/
20 "method": doc.method,
21 "params": doc.params,
22 "path": doc.path,
23 "pname": doc.pname,
24 "query": doc.query,
25 "request": doc.request,
26 "response": doc.response,
27 "website": doc.website
28 };
29 emit(doc._id, obj);
30 }
31 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 function(doc) {
15
26 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 function(keys, values, rereduce) {
15
26 }
0 /* Faraday Penetration Test IDE - Community Version */
0 /* Faraday Penetration Test IDE */
11 /* Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) */
22 /* See the file 'doc/LICENSE' for the license information */
33 /*reset*/
3838 a {
3939 text-decoration:none;
4040 outline-style:none;
41 color: #DF3936!important;
41 color: #DF3936;
4242 }
4343 a:hover{cursor: pointer;}
4444 p {margin-bottom: 1em;}
123123 aside nav.index{padding-top:55px;}
124124 aside nav a {
125125 display: block;
126 width: 56px;
127 height: 30px;
128 padding: 20px 10px;
129 margin-bottom: 1px;
126 padding: 12px 0;
130127 color: #fff;
131128 text-align: center;
132129 transition: all .3s ease;
134131 -moz-transition: all .3s ease;
135132 -webkit-transition: all .3s ease;
136133 }
134 aside nav a:hover {background-color: #d13434;}
135 aside nav a.active {background-color: #e1372f;}
136
137137 .left-nav {
138138 position:fixed;
139139 top:50px;
140 right:0;
141 bottom:0;
142140 left:0;
141 width: 61px;
142 z-index: 1;
143143 }
144144 .right-main {
145145 position: absolute;
146146 top: 0;
147147 right: 0;
148148 bottom: 0;
149 left: 81px;
149 left: 64px;
150150 }
151151 .seccion {
152152 padding: 0px;
169169 height: 20%;
170170 }
171171 .seccion article {
172 background-color: #fff;
173172 min-height: 85px;
174173 font-size: 13px;
175174 text-align: left;
212211
213212 /* ==== COLORES generales ==== */
214213 /* Fondos */
215 .fondo-rojo, .fondo-high {background-color: #DF3936 !important;}
214 .fondo-rojo, .fondo-high, .fondo-error {background-color: #DF3936 !important;}
216215 .fondo-negro {background-color: #000 !important;}
217 .fondo-gris1, .fondo-critical {background-color: #8B00FF !important;}
218 .fondo-gris1, .fondo-unclassified {background-color: #858585 !important;}
216 .fondo-gris1, .fondo-critical {background-color: #932ebe !important;}
217 .fondo-gris1, .fondo-unclassified {background-color: #999 !important;}
219218 .fondo-blanco {background-color: #fff !important;}
220 .fondo-info {background-color: #428bca !important;}
219 .fondo-info {background-color: #2e97bd !important;}
221220 .fondo-naranja, .fondo-med {background-color: #DFBF35 !important;}
222 .fondo-amarillo, .fondo-low {background-color: #A1CE31 !important;}
223 .fondo-violeta {background-color: #8D2BB4 !important;}
221 .fondo-amarillo, .fondo-low, .fondo-created{background-color: #A1CE31 !important;}
222 .fondo-violeta {background-color: #932ebe !important;}
224223 /* Textos*/
225224 .texto-rojo {color: #DF3936;}
226225 .texto-negro {color: #000;}
227226 .texto-gris1 {color: #2D2F31;}
228227 .texto-blanco {color: #fff;}
229228
229 /* Home Menu grande */
230 .home-list {
231 margin-top: 20px;
232 }
233 .home-list .item {
234 background: #fff;
235 border: 1px solid #d4d5d6;
236 border-radius: 2px;
237 padding: 20px;
238 margin: 0px 15px 15px 0;
239 width: 190px;
240 height: 170px;
241 text-align: center;
242 display: inline-block;
243 float: left;
244 transition: all .3s ease;
245 -ms-transition: all .3s ease;
246 -moz-transition: all .3s ease;
247 -webkit-transition: all .3s ease;
248 }
249 .home-list .item:hover {
250 background-image: linear-gradient(to bottom,#cc3333 0,#df3936 100%);
251 background-image: -webkit-linear-gradient(top,#cc3333 0,#df3936 100%);
252 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc3333', endColorstr='#df3936', GradientType=0);
253 filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
254 background-repeat: repeat-x;
255 box-shadow: 0 0 10px rgba(0,0,0,0.3);
256 border-color: #df3936;
257 }
258 .home-list .item:hover * {
259 color: #fff;
260 text-shadow: 0 -1px 0 #bf3030;
261 }
262 .home-list .item img {
263 width: 55px;
264 max-width: 70px;
265 max-height: 53px;
266 margin-bottom: 6px;
267 /* display: block; */
268 }
269 .home-list .item span {
270 display: block;
271 height: 35px;
272 color: #df3936;
273 font-size: 19px !important;
274 font-weight: bold !important;
275 text-transform: uppercase;
276 letter-spacing: -.025em;
277 line-height: 17px !important;
278 margin-bottom: 10px;
279 }
280 .home-list .item small {
281 display: block;
282 height: 48px;
283 color: #b2b2b2;
284 font-size: 9px;
285 line-height: 1.25;
286 }
287
288 /* Home Menu grande > Community */
289 .home-list.community .item:nth-child(4) {clear:left;}
290 /* Home Menu grande > Professional */
291 .home-list.professional .item:nth-child(4) {clear:left;}
292 /* Home Menu grande > Corporate */
293 .home-list.corporate .item:nth-child(5) {clear:left;}
294
295
296 .item:nth-child(0) {-webkit-animation-delay: 0s;}
297 .item:nth-child(1) {-webkit-animation-delay: 0.1s;}
298 .item:nth-child(2) {-webkit-animation-delay: 0.2s;}
299 .item:nth-child(3) {-webkit-animation-delay: 0.3s;}
300 .item:nth-child(4) {-webkit-animation-delay: 0.4s;}
301 .item:nth-child(5) {-webkit-animation-delay: 0.5s;}
302 .item:nth-child(6) {-webkit-animation-delay: 0.6s;}
303 .item:nth-child(7) {-webkit-animation-delay: 0.7s;}
304
230305 /* Datos con nro grande, titulo y texto */
231306 .dato1 {
232307 color: #858585;
244319 .dato2 .nro {
245320 font-size: 300%;
246321 font-weight: 300;
322 letter-spacing: -.1em;
247323 }
248324 .dato2 .txt {
249325 font-size: 11px;
250 font-weight: 700;
251 }
252
326 text-transform: uppercase;
327 }
328 .dato2 span{
329 cursor: pointer;
330 }
253331
254332 /* TABLES - Table sorter for status report*/
333 ul.label-list {
334 list-style-type:none;
335 white-space:nowrap;
336 }
337 ul.label-list li {
338 display: inline;
339 }
340
341 .label-list span.label {
342 font-size: 12px !important;
343 }
344 table thead th a {
345 color: #bbb;
346 font-weight: normal;
347 }
348 table thead th a:hover {
349 color: #ddd;
350 text-decoration: underline;
351 }
352
255353 table.tablesorter {
256354 font-size: 12px;
257355 width: 100%;
262360 border: 1px solid!important;
263361 }
264362 .tablesorter tbody {
265 height: 95px;
363 max-height: 205px;
266364 overflow-y: auto;
267365 }
268366 .main thead tr{position: absolute;top:38px;}
298396 visibility: hidden;
299397 clear: both;
300398 }
301 .tablesorter tbody td,.tablesorter thead th {
302 width: 33.33%;
303 float: left;
304 }
305399
306400 table.tablesorter thead tr .headerSortUp {
307401 background-image: url(images/asc.gif);
310404 background-image: url(images/desc.gif);
311405 }
312406
313
407 div.modal-body .col-md-6.vuln_table{width: 63%}
408 div.modal-footer button.btn{bottom: 1%;right: 1%;}
409 div.modal-footer button.btn.btn-success{right: 10%}
410 div.modal-footer button.btn-footer{position: absolute;}
411 .modal-content table.csv-export.status-report{
412 width: 60%;
413 }
414
415 /* Table Status Report */
314416 table.status-report {
315 background-color: #CDCDCD;
316 margin:0px 0pt 15px;
417 /* background-color: #CDCDCD; */
418 margin:0 0 15px;
317419 font-size: 12px;
318420 width: 100%;
319 text-align: center;
320 }
321
322
323
324 table.status-report thead tr th, table.status-report tfoot tr th {
325 background-color: #3F464C;
326 color: #fff;
327 border: 1px solid #FFF;
421 }
422 table.status-report thead th {
423 white-space: nowrap;
424 }
425 table.status-report thead th a {
426 color: #3a3a3a;
427 text-shadow: 0 1px 0 #fff;
428 }
429 table.status-report thead tr th, table.status-report tfoot tr th {
430 background-image: linear-gradient(to bottom,#E8EFF0 0,#DDDDDD 100%);
431 background-image: -webkit-linear-gradient(top,#E8EFF0 0,#DDDDDD 100%);
432 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#E8EFF0', endColorstr='#DDDDDD', GradientType=0);
433 filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
434 background-repeat: repeat-x;
435 border: none;
328436 font-size: 14px;
329 padding: 5px;
437 padding: 10px 5px;
438 letter-spacing: -.05em;
439 font-weight: normal;
440 text-transform: uppercase;
330441 }
331442
332443 table.status-report thead tr .header {
344455 table.status-report tbody tr.odd td {
345456 background-color:#F0F0F6;
346457 }
347 table.status-report th:last-child{text-align: center}
348458
349459 table.status-report thead tr th:first-child,
350460 table.status-report tbody tr td:first-child {
351461 padding-left: 5px;
352462 }
353 table.csv-export tbody tr:nth-child(even) {
463 table.status-report span.label {
464 text-transform:uppercase;
465 font-weight:normal
466 }
467 table.table tbody tr:nth-child(even) {
354468 background-color: #f1f1f1;
355469 }
356 table.csv-export tbody tr:nth-child(odd) {
357 background-color: #ffffff;
358 }
359 table.csv-export tbody tr:hover{
470 table.table tbody tr:nth-child(odd) {
471 background-color: #f9f9f9;
472 }
473 table.table tbody tr:hover{
360474 background-color: #ecebea;
361475 }
362476 .multi-selected {
363 background: #f2dede !important;
477 background-color: #f2dede !important;
364478 }
365479
366480 #list .tablesorter thead th {
367 width: 25%;
481 width: 45%;
482 border:1px solid;
483 }
484 #list tbody{display: block}
485 #list .tablesorter tr {display: block;}
486 #list .tablesorter tbody td {width: 51.6%}
487 #list .tablesorter tbody td:nth-child(2){width: 51%;word-break: break-all;}
488 #list .tablesorter thead th:last-child{width: 19%}
489 #compound tbody{display: block;max-height: 370px}
490 #compound .tablesorter tr {display: table-row;}
491 #compound .tablesorter tbody td {width: 48%}
492 #compound .tablesorter tbody td span,#compound .tablesorter tbody td img{margin-right: 25px}
493 #compound .tablesorter thead th:first-child{width: 54%}
494 #compound .tablesorter thead th {
495 width: 27%;
368496 float: left;
369497 border:1px solid;
370498 }
371 #list .tablesorter tbody td {width: 23.6%}
372 #list .tablesorter tbody td:nth-child(2){width: 29%;word-wrap: break-word;}
373 #compound .tablesorter tbody{height:284px;}
499 #compound .tablesorter thead th:last-child{width: 19%}
500 #compound .col-lg-6 article.panel{
501 height: 93px;
502 padding-bottom: 428px;
503 background: transparent;
504 border: 0px solid;
505 }
506 #compound article.panel-default table{margin-bottom: 0px}
507 #compound article.panel-default input{
508 width: 90px;
509 float: right;
510 }
511 #compound article.panel-default input.btn.btn-danger{width: 43px}
374512
375513 .table-striped tbody tr:nth-child(odd){background: #f9f9f9;}
376514 .table-striped tbody tr:nth-child(even){background: #FFF;}
515
516 /* Workspaces Table */
517 table.workspaces-list tbody tr:nth-child(odd) span.label {background: #e1372f !important}
518 table.workspaces-list tbody tr:nth-child(even) span.label {background: #4c4c4c !important}
519
520 /* Users Table */
521 table.users-list tbody tr span.label {
522 background: #4c4c4c !important;
523 }
524
377525
378526 /* modal window */ /* collapse */
379527 table.status-report tbody td:nth-child(5), .modal-content td{
395543 position: relative;
396544 }
397545 .node {
398 border: solid 1px white;
399 font: 10px sans-serif;
400 line-height: 12px;
401 overflow: hidden;
402 position: absolute;
403 text-indent: 2px;
546 border: solid 1px white;
547 font: 12px Ubuntu,sans-serif;
548 line-height: 12px;
549 overflow: hidden;
550 position: absolute;
551 font-weight: bold;
552 color: #FFF;
553 text-indent: 2px;
404554 }
405555
406556 .bar {
421571 }
422572 #chart path {
423573 stroke: #fff;
574 }
575 text.host-name{font-size: 13px;font-weight:bold;}
576 /* Line Chart */
577 .axis path,
578 .axis line {
579 fill: none;
580 stroke: #000;
581 shape-rendering: crispEdges;
582 }
583
584 .x.axis path {
585 display: none;
586 }
587
588 .line {
589 fill: none;
590 stroke: steelblue;
591 stroke-width: 4px;
592 opacity: 0.5;
593 }
594 .line-hover {
595 stroke: #e769ab ;
596 stroke-width:4px;
597 opacity: 0.9;
424598 }
425599 /* End of D3*/
426600
453627 color: #000000 !important;
454628 }
455629 }
630 /* Workspaces list - Open*/
631 div.button-control.col-md-6.col-sm-6.col-xs-12 {display: block; float: right}
456632 #sec {
457633 float: right;
458634 margin-top: -34px;
461637 #byservices .col-lg-3, #summarized .col-lg-3{width: 29%;margin:0px -2% 0px 0%;}
462638 section .col-lg-2{margin: 0px -2% 0px 2px;padding-right: 1.9%;}
463639 .col-lg-6 .panel{margin-bottom: 10px}
464 #list .col-lg-6, #vulns .col-lg-6{width: 55%;float: right;}
640 #list .col-lg-6, #vulns .col-lg-6{width: 55%;float: right;margin-bottom: 5px}
465641 #compound .col-lg-6{width: 45%;margin-top: -2%;}
466642
467643 .panel{margin-bottom: 1%!important}
644 article.panel > span{
645 position: absolute;
646 width: 100%;
647 text-align: center;
648 font-weight: bold;
649 z-index: 1000;
650 }
651 article.panel > span > div{
652 display: block;
653 float: left;
654 text-align: center;
655 width: 50%;
656 border-radius: 10px;
657 color: #FFF;
658 }
468659 .box{
469660 display: flex;
470661 flex-direction: row;
472663 justify-content: center;
473664 align-items: center;
474665 }
666 #merge, #delete, #new, #tags, left{margin:5px;float:right}
667 .left_auths{margin:5px;float:right;margin-top: -52px;}
668 .left_auth{margin:5px;float:right;margin-top: -40px;}
669
670 div.box div.columna:nth-child(even){background-color: #DF3936; color: #000!important;}
671 div.box div.columna:nth-child(odd){background-color: #000; color: #DF3936!important;}
475672 #merge, #delete, #new{margin:5px;float:right;}
476673 .input-sm{float: left;margin-bottom: 20px;}
477674 /* Media */
478675 @media screen and (min-width: 1380px){
479 #list .tablesorter thead th {width: 25%}
480676 .treemap{margin-left:13%;}
481677 .seccion.treemap{margin-left: 20%}
482678 #byservices .col-lg-3, #summarized .col-lg-3{width: 28%;margin: 0px -2% 0px 1%;}
679 #compound .tablesorter tbody td span, #compound .tablesorter tbody td img{margin-right: 50px}
680 #list .tablesorter tbody td:nth-child(2){width: 34%}
483681 }
484682 @media screen and (max-width:1000px) {
485683 #no-overflow{overflow: auto!important }
510708 /* New Modal*/
511709 div.panel-default .panel-body label{font-size: 15px}
512710 i.pull-right.glyphicon.ng-scope.glyphicon-plus-sign{color:green;}
513
711 i.fa.fa-copy.copy-icon.fa-lg{margin-top: 10px;cursor: pointer;}
514712 div.panel-collapse .panel-body{padding:0px;}
515713 div.panel.panel-default div.panel-heading{padding: 0px}
516714 div.panel-body table{width: 100%}
519717 a.ng-binding.ng-scope{padding: 10px;}
520718 div.panel-heading a i.glyphicon{margin: -25px 10px;}
521719 div.modal-body .alert-danger.target_not_selected{font-size: 15px}
720 /* Pagination Modal New */
721 .showPagination ul.pagination{font-size: 15px;margin:auto;padding-left: 2%}
722 div.showPagination .col-md-2, div.showPagination .btn.btn-default{float:right;}
723 div.showPagination form#goToPageStatus{margin-top:-40px;}
724 input.form-control.vuln_per_page{width: 10%;margin: auto}
725 /* End */
726 div.col-md-12.reference{margin-top: 5px;}
727 input#vuln-refs{border-radius: 5px 0 0 5px}
728 i.fa.fa-plus-circle{color: green;}
729 i.fa.fa-minus-circle{color: red;cursor: pointer;}
730 span.input-group-addon.add-reference{
731 border-radius: 4px;
732 border-left: 1px solid #ccc;
733 width: 20px;
734 cursor: pointer;
735 }
736 span#cakeText{width: 95%}
737 span#treemapTextModel{font-size: 14px}
738 .normal-size {
739 font-size: 14px !important;
740 }
741 div#treemap_container{margin: 5% auto 0}
742 div#compound div.showPagination{margin-bottom: 30px}
743 div#compound .showPagination input.form-control{width:110px;}
744 div#compound .showPagination div.form-group{margin-top: 10px;}
745 div#compound article.panel-default input{width: 90px;float: right}
746 div#compound .showPagination input#vuln-per-page{width: 75px!important;margin-right: 15%}
747 aside .alert.alert-danger.alert-dismissible{
748 position: fixed;
749 top: 45%;
750 left: 30%;
751 font-size: 15px;
752 z-index: 1000;
753 }
754
755 .label-unclassified {
756 color: #FFFFFF;
757 background-color: #444147;
758 border-color: #444147;
759 }
760
761 .label-unclassified:hover,
762 .label-unclassified:focus,
763 .label-unclassified:active,
764 .label-unclassified.active,
765 .open .dropdown-toggle.label-unclassified {
766 color: #FFFFFF;
767 background-color: #111012;
768 border-color: #444147;
769 }
770
771 .label-unclassified:active,
772 .label-unclassified.active,
773 .open .dropdown-toggle.label-unclassified {
774 background-image: none;
775 }
776
777 .label-unclassified.disabled,
778 .label-unclassified[disabled],
779 fieldset[disabled] .label-unclassified,
780 .label-unclassified.disabled:hover,
781 .label-unclassified[disabled]:hover,
782 fieldset[disabled] .label-unclassified:hover,
783 .label-unclassified.disabled:focus,
784 .label-unclassified[disabled]:focus,
785 fieldset[disabled] .label-unclassified:focus,
786 .label-unclassified.disabled:active,
787 .label-unclassified[disabled]:active,
788 fieldset[disabled] .label-unclassified:active,
789 .label-unclassified.disabled.active,
790 .label-unclassified[disabled].active,
791 fieldset[disabled] .label-unclassified.active {
792 background-color: #444147;
793 border-color: #444147;
794 }
795
796 .label-unclassified .badge {
797 color: #444147;
798 background-color: #FFFFFF;
799 }
800 .label-high {
801 color: #ffffff;
802 background-color: #DF3936;
803 border-color: #DF3936;
804 }
805
806 .label-high:hover,
807 .label-high:focus,
808 .label-high:active,
809 .label-high.active,
810 .open .dropdown-toggle.label-high {
811 color: #ffffff;
812 background-color: #992826;
813 border-color: #DF3936;
814 }
815
816 .label-high:active,
817 .label-high.active,
818 .open .dropdown-toggle.label-high {
819 background-image: none;
820 }
821
822 .label-high.disabled,
823 .label-high[disabled],
824 fieldset[disabled] .label-high,
825 .label-high.disabled:hover,
826 .label-high[disabled]:hover,
827 fieldset[disabled] .label-high:hover,
828 .label-high.disabled:focus,
829 .label-high[disabled]:focus,
830 fieldset[disabled] .label-high:focus,
831 .label-high.disabled:active,
832 .label-high[disabled]:active,
833 fieldset[disabled] .label-high:active,
834 .label-high.disabled.active,
835 .label-high[disabled].active,
836 fieldset[disabled] .label-high.active {
837 background-color: #DF3936;
838 border-color: #DF3936;
839 }
840
841 .label-high .badge {
842 color: #DF3936;
843 background-color: #ffffff;
844 }
+0
-75
views/reports/_attachments/faraday.html less more
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3 <!DOCTYPE html>
4 <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
5 <!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
6 <!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
7 <!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
8 <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
9 <head>
10 <meta charset="utf-8"/>
11 <!--[if IE]><![endif]-->
12 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
13 <title>Status Report | Faraday</title>
14 <meta name="description" content=""/>
15 <meta name="keywords" content=""/>
16 <meta name="author" content=""/>
17
18 <!-- CSS -->
19 <link rel="stylesheet" type="text/css" href="normalize.css" />
20 <link rel="stylesheet" type="text/css" href="estilos.css" />
21 <link rel="stylesheet" type="text/css" href="script/jquery.qtip.css" />
22 <link rel="stylesheet" href="script/bootstrap.min.css">
23 <link rel="stylesheet" href="script/bootstrap-theme.min.css">
24 <link rel="stylesheet" type="text/css" href="styles/font-awesome.css" />
25
26 <!-- Icons -->
27 <link href="favicon.ico" rel="shortcut icon">
28 <link href="favicon.ico" type="image/vnd.microsoft.icon" rel="icon" />
29 <link href="images/site_preview.jpg" rel="image_src" />
30
31 <!-- Scripts -->
32 <script type="text/javascript" src="/_utils/script/jquery.js"></script>
33 <script type="text/javascript" src="/_utils/script/jquery.couch.js"></script>
34 <script type="text/javascript" src="script/bootstrap.min.js"></script>
35 <script type="text/javascript" src="script/angular.js"></script>
36 <script type="text/javascript" src="script/angular-route.js"></script>
37 <script type="text/javascript" src="script/angular-selection-model.js"></script>
38 <script type="text/javascript" src="script/ui-bootstrap-tpls-0.11.2.min.js"></script>
39 <script type="text/javascript" src="script/jquery.qtip.js"></script>
40 <script type="text/javascript" src="script/cryptojs-sha1.js"></script>
41 </head>
42
43 <body ng-app="faradayApp">
44 <div id="cont">
45 <div class="wrapper">
46 <header class="head">
47 <a href="#" class="ws-dashboard"><img class="logo" src="images/logo-faraday.png" alt="Faraday home | WS Dashboard"/></a>
48 </header>
49
50 <div ng-view></div>
51 </div><!--!/#wrapper -->
52 </div><!--!/#container -->
53
54 <script type="text/javascript" src="scripts/app.js"></script>
55 <script type="text/javascript" src="scripts/fileExporter/directives/download.js"></script>
56 <script type="text/javascript" src="scripts/fileExporter/services/blob.js"></script>
57 <script type="text/javascript" src="scripts/fileExporter/services/click.js"></script>
58 <script type="text/javascript" src="scripts/hosts/services/hosts.js"></script>
59 <script type="text/javascript" src="scripts/modal/controllers/modalDelete.js"></script>
60 <script type="text/javascript" src="scripts/modal/controllers/modalEdit.js"></script>
61 <script type="text/javascript" src="scripts/modal/controllers/modalNew.js"></script>
62 <script type="text/javascript" src="scripts/modal/controllers/modalKO.js"></script>
63 <script type="text/javascript" src="scripts/notes/services/notes.js"></script>
64 <script type="text/javascript" src="scripts/statusReport/controllers/statusReport.js"></script>
65 <script type="text/javascript" src="scripts/statusReport/directives/textCollapse.js"></script>
66 <script type="text/javascript" src="scripts/statusReport/services/commons.js"></script>
67 <script type="text/javascript" src="scripts/statusReport/services/statusReport.js"></script>
68 <script type="text/javascript" src="scripts/statusReport/services/target.js"></script>
69 <script type="text/javascript" src="scripts/vulns/services/vulns.js"></script>
70 <script type="text/javascript" src="scripts/vulnsWeb/services/vulnsWeb.js"></script>
71 <script type="text/javascript" src="scripts/workspaces/controllers/workspaces.js"></script>
72 <script type="text/javascript" src="scripts/workspaces/services/workspaces.js"></script>
73 </body>
74 </html>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="240.047px" height="330px" viewBox="0 0 240.047 330" style="enable-background:new 0 0 240.047 330;" xml:space="preserve"
5 >
6 <g id="Faraday">
7 <g id="Piel">
8 <rect x="150.03" y="75" style="fill:#F9EBE2;" width="15" height="15"/>
9 <rect x="165.034" y="75" style="fill:#F9EBE2;" width="15" height="15"/>
10 <rect x="120.024" y="90" style="fill:#F9EBE2;" width="15" height="15"/>
11 <rect x="135.027" y="90" style="fill:#F9EBE2;" width="15" height="15"/>
12 <rect x="150.03" y="90" style="fill:#F9EBE2;" width="15" height="15"/>
13 <rect x="165.034" y="90" style="fill:#F9EBE2;" width="15" height="15"/>
14 <rect x="180.037" y="90" style="fill:#F9EBE2;" width="15" height="15"/>
15 <rect x="60.01" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
16 <rect x="75.014" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
17 <rect x="90.017" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
18 <rect x="105.02" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
19 <rect x="120.024" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
20 <rect x="135.027" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
21 <rect x="150.03" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
22 <rect x="165.034" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
23 <rect x="180.037" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
24 <rect x="195.041" y="105" style="fill:#F9EBE2;" width="15" height="15"/>
25 <rect x="45.007" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
26 <rect x="60.01" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
27 <rect x="105.02" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
28 <rect x="120.024" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
29 <rect x="135.027" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
30 <rect x="180.037" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
31 <rect x="195.041" y="120" style="fill:#F9EBE2;" width="15" height="15"/>
32 <rect x="45.007" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
33 <rect x="75.014" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
34 <rect x="90.017" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
35 <rect x="105.02" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
36 <rect x="120.024" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
37 <rect x="135.027" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
38 <rect x="150.03" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
39 <rect x="165.034" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
40 <rect x="195.041" y="135" style="fill:#F9EBE2;" width="15" height="15"/>
41 <rect x="15" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
42 <rect x="45.007" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
43 <rect x="60.01" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
44 <rect x="75.014" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
45 <rect x="105.02" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
46 <rect x="120.024" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
47 <rect x="135.027" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
48 <rect x="165.034" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
49 <rect x="180.037" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
50 <rect x="195.041" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
51 <rect x="225.047" y="150" style="fill:#F9EBE2;" width="15" height="15"/>
52 <rect x="15" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
53 <rect x="30.003" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
54 <rect x="45.007" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
55 <rect x="60.01" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
56 <rect x="75.014" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
57 <rect x="90.017" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
58 <rect x="105.02" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
59 <rect x="120.024" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
60 <rect x="135.027" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
61 <rect x="150.03" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
62 <rect x="165.034" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
63 <rect x="180.037" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
64 <rect x="195.041" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
65 <rect x="210.044" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
66 <rect x="225.047" y="165" style="fill:#F9EBE2;" width="15" height="15"/>
67 <rect x="30.003" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
68 <rect x="45.007" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
69 <rect x="60.01" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
70 <rect x="75.014" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
71 <rect x="90.017" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
72 <rect x="105.02" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
73 <rect x="120.024" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
74 <rect x="135.027" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
75 <rect x="150.03" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
76 <rect x="165.034" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
77 <rect x="180.037" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
78 <rect x="195.041" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
79 <rect x="210.044" y="180" style="fill:#F9EBE2;" width="15" height="15"/>
80 <rect x="45.007" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
81 <rect x="60.01" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
82 <rect x="75.014" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
83 <rect x="90.017" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
84 <rect x="105.02" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
85 <rect x="120.024" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
86 <rect x="135.027" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
87 <rect x="150.03" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
88 <rect x="165.034" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
89 <rect x="180.037" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
90 <rect x="195.041" y="195" style="fill:#F9EBE2;" width="15" height="15"/>
91 <rect x="45.007" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
92 <rect x="60.01" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
93 <rect x="75.014" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
94 <rect x="90.017" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
95 <rect x="105.02" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
96 <rect x="120.024" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
97 <rect x="135.027" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
98 <rect x="150.03" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
99 <rect x="165.034" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
100 <rect x="180.037" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
101 <rect x="195.041" y="210" style="fill:#F9EBE2;" width="15" height="15"/>
102 <rect x="45.007" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
103 <rect x="60.01" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
104 <rect x="75.014" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
105 <rect x="90.017" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
106 <rect x="150.03" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
107 <rect x="165.034" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
108 <rect x="180.037" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
109 <rect x="195.041" y="225" style="fill:#F9EBE2;" width="15" height="15"/>
110 <rect x="60.01" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
111 <rect x="75.014" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
112 <rect x="105.02" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
113 <rect x="120.024" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
114 <rect x="135.027" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
115 <rect x="165.034" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
116 <rect x="180.037" y="240" style="fill:#F9EBE2;" width="15" height="15"/>
117 <rect x="75.014" y="255" style="fill:#F9EBE2;" width="15" height="15"/>
118 <rect x="105.02" y="255" style="fill:#F9EBE2;" width="15" height="15"/>
119 <rect x="120.024" y="255" style="fill:#F9EBE2;" width="15" height="15"/>
120 <rect x="135.027" y="255" style="fill:#F9EBE2;" width="15" height="15"/>
121 <rect x="165.034" y="255" style="fill:#F9EBE2;" width="15" height="15"/>
122 <rect x="105.02" y="270" style="fill:#F9EBE2;" width="15" height="15"/>
123 <rect x="135.027" y="270" style="fill:#F9EBE2;" width="15" height="15"/>
124 </g>
125 <g id="Ceja_izq">
126 <rect x="75.014" y="120" width="15" height="15"/>
127 <rect x="90.017" y="120" width="15" height="15"/>
128 <rect x="60.01" y="135" width="15" height="15"/>
129 </g>
130 <g id="Ceja_der">
131 <rect x="150.03" y="120" width="15" height="15"/>
132 <rect x="165.034" y="120" width="15" height="15"/>
133 <rect x="180.037" y="135" width="15" height="15"/>
134 </g>
135 <rect id="Ojo_izq" x="90.017" y="150" width="15" height="15"/>
136 <rect id="Ojo_der" x="150.03" y="150" width="15" height="15"/>
137 <g id="Pelo">
138 <rect x="75.014" y="0" width="15" height="15"/>
139 <rect x="90.017" y="0" width="15" height="15"/>
140 <rect x="105.02" y="0" width="15" height="15"/>
141 <rect x="120.024" y="0" width="15" height="15"/>
142 <rect x="135.027" y="0" width="15" height="15"/>
143 <rect x="150.03" y="0" width="15" height="15"/>
144 <rect x="165.034" y="0" width="15" height="15"/>
145 <rect x="60.01" y="15" width="15" height="15"/>
146 <rect x="75.014" y="15" width="15" height="15"/>
147 <rect x="90.017" y="15" width="15" height="15"/>
148 <rect x="105.02" y="15" width="15" height="15"/>
149 <rect x="120.024" y="15" width="15" height="15"/>
150 <rect x="135.027" y="15" width="15" height="15"/>
151 <rect x="150.03" y="15" width="15" height="15"/>
152 <rect x="165.034" y="15" width="15" height="15"/>
153 <rect x="180.037" y="15" width="15" height="15"/>
154 <rect x="195.041" y="15" width="15" height="15"/>
155 <rect x="45.007" y="30" width="15" height="15"/>
156 <rect x="60.01" y="30" width="15" height="15"/>
157 <rect x="75.014" y="30" width="15" height="15"/>
158 <rect x="90.017" y="30" width="15" height="15"/>
159 <rect x="105.02" y="30" width="15" height="15"/>
160 <rect x="120.024" y="30" width="15" height="15"/>
161 <rect x="135.027" y="30" width="15" height="15"/>
162 <rect x="150.03" y="30" width="15" height="15"/>
163 <rect x="165.034" y="30" width="15" height="15"/>
164 <rect x="180.037" y="30" width="15" height="15"/>
165 <rect x="195.041" y="30" width="15" height="15"/>
166 <rect x="210.044" y="30" width="15" height="15"/>
167 <rect x="30.003" y="45" width="15" height="15"/>
168 <rect x="45.007" y="45" width="15" height="15"/>
169 <rect x="60.01" y="45" width="15" height="15"/>
170 <rect x="75.014" y="45" width="15" height="15"/>
171 <rect x="90.017" y="45" width="15" height="15"/>
172 <rect x="105.02" y="45" width="15" height="15"/>
173 <rect x="120.024" y="45" width="15" height="15"/>
174 <rect x="135.027" y="45" width="15" height="15"/>
175 <rect x="150.03" y="45" width="15" height="15"/>
176 <rect x="165.034" y="45" width="15" height="15"/>
177 <rect x="195.041" y="45" width="15" height="15"/>
178 <rect x="210.044" y="45" width="15" height="15"/>
179 <rect x="15" y="60" width="15" height="15"/>
180 <rect x="30.003" y="60" width="15" height="15"/>
181 <rect x="45.007" y="60" width="15" height="15"/>
182 <rect x="60.01" y="60" width="15" height="15"/>
183 <rect x="75.014" y="60" width="15" height="15"/>
184 <rect x="90.017" y="60" width="15" height="15"/>
185 <rect x="105.02" y="60" width="15" height="15"/>
186 <rect x="120.024" y="60" width="15" height="15"/>
187 <rect x="135.027" y="60" width="15" height="15"/>
188 <rect x="150.03" y="60" width="15" height="15"/>
189 <rect x="165.034" y="60" width="15" height="15"/>
190 <rect x="180.037" y="60" width="15" height="15"/>
191 <rect x="195.041" y="60" width="15" height="15"/>
192 <rect x="210.044" y="60" width="15" height="15"/>
193 <rect x="225.047" y="60" width="15" height="15"/>
194 <rect x="15" y="75" width="15" height="15"/>
195 <rect x="30.003" y="75" width="15" height="15"/>
196 <rect x="45.007" y="75" width="15" height="15"/>
197 <rect x="60.01" y="75" width="15" height="15"/>
198 <rect x="75.014" y="75" width="15" height="15"/>
199 <rect x="90.017" y="75" width="15" height="15"/>
200 <rect x="105.02" y="75" width="15" height="15"/>
201 <rect x="120.024" y="75" width="15" height="15"/>
202 <rect x="135.027" y="75" width="15" height="15"/>
203 <rect x="180.037" y="75" width="15" height="15"/>
204 <rect x="195.041" y="75" width="15" height="15"/>
205 <rect x="180.037" y="45" width="15" height="15"/>
206 <rect x="210.044" y="75" width="15" height="15"/>
207 <rect x="225.047" y="75" width="15" height="15"/>
208 <rect x="15" y="90" width="15" height="15"/>
209 <rect x="30.003" y="90" width="15" height="15"/>
210 <rect x="45.007" y="90" width="15" height="15"/>
211 <rect x="60.01" y="90" width="15" height="15"/>
212 <rect x="75.014" y="90" width="15" height="15"/>
213 <rect x="90.017" y="90" width="15" height="15"/>
214 <rect x="105.02" y="90" width="15" height="15"/>
215 <rect x="195.041" y="90" width="15" height="15"/>
216 <rect x="210.044" y="90" width="15" height="15"/>
217 <rect x="225.047" y="90" width="15" height="15"/>
218 <rect x="15" y="105" width="15" height="15"/>
219 <rect x="0" y="105" width="15" height="15"/>
220 <rect x="30.003" y="105" width="15" height="15"/>
221 <rect x="45.007" y="105" width="15" height="15"/>
222 <rect x="210.044" y="105" width="15" height="15"/>
223 <rect x="225.047" y="105" width="15" height="15"/>
224 <rect x="15" y="120" width="15" height="15"/>
225 <rect x="30.003" y="120" width="15" height="15"/>
226 <rect x="210.044" y="120" width="15" height="15"/>
227 <rect x="225.047" y="120" width="15" height="15"/>
228 <rect x="15" y="135" width="15" height="15"/>
229 <rect x="30.003" y="135" width="15" height="15"/>
230 <rect x="210.044" y="135" width="15" height="15"/>
231 <rect x="225.047" y="135" width="15" height="15"/>
232 <rect x="30.003" y="150" width="15" height="15"/>
233 <rect x="210.044" y="150" width="15" height="15"/>
234 </g>
235 <g id="Barba">
236 <rect x="15" y="180" width="15" height="15"/>
237 <rect x="225.047" y="180" width="15" height="15"/>
238 <rect x="15" y="195" width="15" height="15"/>
239 <rect x="30.003" y="195" width="15" height="15"/>
240 <rect x="210.044" y="195" width="15" height="15"/>
241 <rect x="225.047" y="195" width="15" height="15"/>
242 <rect x="30.003" y="210" width="15" height="15"/>
243 <rect x="210.044" y="210" width="15" height="15"/>
244 <rect x="30.003" y="225" width="15" height="15"/>
245 <rect x="105.02" y="225" width="15" height="15"/>
246 <rect x="120.024" y="225" width="15" height="15"/>
247 <rect x="135.027" y="225" width="15" height="15"/>
248 <rect x="210.044" y="225" width="15" height="15"/>
249 <rect x="30.003" y="240" width="15" height="15"/>
250 <rect x="45.007" y="240" width="15" height="15"/>
251 <rect x="90.017" y="240" width="15" height="15"/>
252 <rect x="150.03" y="240" width="15" height="15"/>
253 <rect x="195.041" y="240" width="15" height="15"/>
254 <rect x="210.044" y="240" width="15" height="15"/>
255 <rect x="15" y="255" width="15" height="15"/>
256 <rect x="45.007" y="255" width="15" height="15"/>
257 <rect x="60.01" y="255" width="15" height="15"/>
258 <rect x="90.017" y="255" width="15" height="15"/>
259 <rect x="150.03" y="255" width="15" height="15"/>
260 <rect x="180.037" y="255" width="15" height="15"/>
261 <rect x="195.041" y="255" width="15" height="15"/>
262 <rect x="225.047" y="255" width="15" height="15"/>
263 <rect x="45.007" y="270" width="15" height="15"/>
264 <rect x="60.01" y="270" width="15" height="15"/>
265 <rect x="75.014" y="270" width="15" height="15"/>
266 <rect x="90.017" y="270" width="15" height="15"/>
267 <rect x="120.024" y="270" width="15" height="15"/>
268 <rect x="150.03" y="270" width="15" height="15"/>
269 <rect x="165.034" y="270" width="15" height="15"/>
270 <rect x="180.037" y="270" width="15" height="15"/>
271 <rect x="195.041" y="270" width="15" height="15"/>
272 <rect x="30.003" y="285" width="15" height="15"/>
273 <rect x="45.007" y="285" width="15" height="15"/>
274 <rect x="75.014" y="285" width="15" height="15"/>
275 <rect x="90.017" y="285" width="15" height="15"/>
276 <rect x="105.02" y="285" width="15" height="15"/>
277 <rect x="120.024" y="285" width="15" height="15"/>
278 <rect x="135.027" y="285" width="15" height="15"/>
279 <rect x="150.03" y="285" width="15" height="15"/>
280 <rect x="165.034" y="285" width="15" height="15"/>
281 <rect x="195.041" y="285" width="15" height="15"/>
282 <rect x="210.044" y="285" width="15" height="15"/>
283 <rect x="90.017" y="300" width="15" height="15"/>
284 <rect x="105.02" y="300" width="15" height="15"/>
285 <rect x="120.024" y="300" width="15" height="15"/>
286 <rect x="135.027" y="300" width="15" height="15"/>
287 <rect x="150.03" y="300" width="15" height="15"/>
288 <rect x="105.02" y="315" width="15" height="15"/>
289 <rect x="120.024" y="315" width="15" height="15"/>
290 <rect x="135.027" y="315" width="15" height="15"/>
291 </g>
292 </g>
293 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="32px" height="32px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
5 <g id="xdEhD1.tif">
6 <g>
7 <g>
8 <path style="fill:#FFFFFF;" d="M15.983,32c-4.281-0.008-8.3-1.676-11.317-4.7C1.649,24.278-0.008,20.259,0,15.983
9 C0.018,7.17,7.187,0,15.984,0C24.846,0.018,32.016,7.203,32,16.018C31.984,24.83,24.812,32,16.01,32H15.983z M15.975,2.929
10 c-7.169,0-13.021,5.856-13.045,13.053c-0.012,3.462,1.346,6.736,3.824,9.22c2.477,2.483,5.754,3.857,9.229,3.868
11 c7.211,0.001,13.063-5.855,13.087-13.053c0.012-3.461-1.346-6.735-3.824-9.219c-2.477-2.484-5.754-3.857-9.229-3.869H15.975z"/>
12 </g>
13 <path style="fill:#FFFFFF;" d="M26.658,9.98c-0.672,0.505-1.347,1.013-2.022,1.52c-2.013,1.512-4.025,3.026-6.043,4.533
14 c-0.205,0.153-0.338,0.319-0.41,0.574c-0.286,1.02-1.2,1.703-2.207,1.678c-1.056-0.026-1.942-0.714-2.187-1.751
15 c-0.194-0.817,0.008-1.56,0.611-2.153c0.602-0.592,1.341-0.784,2.159-0.577c0.236,0.059,0.425,0.043,0.642-0.05
16 c3.029-1.3,6.06-2.593,9.091-3.889C26.439,9.802,26.591,9.697,26.658,9.98z"/>
17 <path style="fill:#FFFFFF;" d="M17.027,5.895c-0.02,0.271-0.017,0.552-0.068,0.823c-0.082,0.435-0.521,0.778-0.942,0.776
18 c-0.481-0.002-0.925-0.333-0.969-0.808c-0.049-0.529-0.058-1.068-0.015-1.596c0.042-0.504,0.495-0.862,0.965-0.852
19 c0.502,0.01,0.884,0.336,0.966,0.852C17.007,5.352,17.007,5.621,17.027,5.895z"/>
20 <path style="fill:#FFFFFF;" d="M5.876,14.976c0.265,0.017,0.535,0.013,0.797,0.057c0.475,0.079,0.835,0.52,0.821,0.967
21 c-0.016,0.491-0.337,0.907-0.823,0.955c-0.507,0.05-1.025,0.061-1.533,0.021c-0.528-0.041-0.899-0.479-0.899-0.96
22 c-0.001-0.508,0.334-0.899,0.87-0.984C5.359,14.992,5.617,14.993,5.876,14.976z"/>
23 <path style="fill:#FFFFFF;" d="M26.124,17.024c-0.265-0.017-0.535-0.013-0.796-0.057c-0.475-0.079-0.835-0.52-0.821-0.967
24 c0.016-0.491,0.337-0.907,0.824-0.955c0.507-0.05,1.025-0.061,1.533-0.021c0.528,0.041,0.899,0.479,0.899,0.96
25 c0.001,0.508-0.334,0.898-0.87,0.984C26.641,17.008,26.383,17.007,26.124,17.024z"/>
26 <path style="fill:#FFFFFF;" d="M22.368,6.734c-0.006,0.029-0.007,0.155-0.06,0.253c-0.258,0.478-0.5,0.969-0.806,1.416
27 c-0.256,0.374-0.829,0.456-1.215,0.246c-0.427-0.233-0.66-0.755-0.455-1.203c0.225-0.493,0.504-0.967,0.809-1.415
28 c0.23-0.338,0.701-0.419,1.104-0.273C22.106,5.889,22.354,6.243,22.368,6.734z"/>
29 <path style="fill:#FFFFFF;" d="M7.705,12.242c-0.015-0.003-0.073-0.001-0.118-0.025c-0.533-0.29-1.088-0.548-1.586-0.888
30 c-0.355-0.242-0.402-0.838-0.19-1.2c0.241-0.41,0.721-0.63,1.153-0.437c0.504,0.225,0.989,0.504,1.448,0.812
31 c0.339,0.228,0.424,0.704,0.282,1.099C8.56,11.977,8.178,12.233,7.705,12.242z"/>
32 <path style="fill:#FFFFFF;" d="M25.261,22.368c-0.03-0.007-0.156-0.008-0.254-0.061c-0.478-0.259-0.969-0.501-1.415-0.807
33 c-0.372-0.255-0.45-0.835-0.239-1.216c0.237-0.427,0.755-0.653,1.206-0.448c0.483,0.22,0.948,0.493,1.389,0.79
34 c0.354,0.238,0.445,0.711,0.292,1.126C26.108,22.109,25.751,22.355,25.261,22.368z"/>
35 <path style="fill:#FFFFFF;" d="M11.227,8.748c-0.409,0.006-0.682-0.218-0.882-0.543c-0.202-0.327-0.396-0.66-0.576-0.999
36 c-0.267-0.503-0.132-1.081,0.303-1.362c0.436-0.282,1.031-0.183,1.358,0.284c0.28,0.4,0.539,0.827,0.732,1.274
37 C12.449,8.066,11.94,8.766,11.227,8.748z"/>
38 <path style="fill:#FFFFFF;" d="M6.84,22.364c-0.583,0.003-0.923-0.227-1.076-0.617c-0.15-0.385-0.079-0.841,0.249-1.074
39 c0.442-0.313,0.909-0.6,1.396-0.837c0.431-0.21,0.967-0.001,1.205,0.392c0.252,0.416,0.185,0.972-0.216,1.269
40 C7.88,21.882,7.341,22.25,6.84,22.364z"/>
41 </g>
42 </g>
43 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="48px" height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
5 <g id="xdEhD1.tif">
6 <g>
7 <g>
8 <path style="fill:#B3B4B5;" d="M23.974,48c-6.421-0.011-12.45-2.514-16.975-7.049C2.474,36.416-0.012,30.388,0,23.975
9 C0.026,10.755,10.781,0,23.976,0C37.269,0.026,48.024,10.804,48,24.026C47.976,37.245,37.218,48,24.016,48H23.974z M23.963,4.394
10 c-10.753,0-19.531,8.783-19.568,19.58c-0.018,5.193,2.019,10.104,5.736,13.83c3.716,3.724,8.632,5.785,13.843,5.803
11 c10.816,0.001,19.594-8.782,19.63-19.58c0.018-5.192-2.019-10.103-5.736-13.828c-3.716-3.726-8.632-5.786-13.843-5.804H23.963z"
12 />
13 </g>
14 <path style="fill:#B3B4B5;" d="M39.988,14.97c-1.008,0.758-2.02,1.519-3.033,2.28c-3.02,2.268-6.038,4.539-9.064,6.799
15 c-0.307,0.229-0.507,0.478-0.615,0.862c-0.429,1.53-1.8,2.554-3.31,2.517c-1.584-0.039-2.912-1.071-3.281-2.627
16 c-0.291-1.226,0.012-2.34,0.917-3.23c0.903-0.888,2.012-1.175,3.238-0.866c0.354,0.089,0.637,0.064,0.962-0.075
17 c4.543-1.95,9.091-3.889,13.637-5.833C39.658,14.703,39.887,14.546,39.988,14.97z"/>
18 <path style="fill:#B3B4B5;" d="M25.541,8.843c-0.031,0.406-0.025,0.828-0.101,1.235c-0.123,0.652-0.781,1.168-1.413,1.164
19 c-0.722-0.004-1.387-0.5-1.453-1.212c-0.074-0.793-0.088-1.601-0.022-2.394c0.063-0.756,0.743-1.293,1.447-1.278
20 c0.752,0.015,1.325,0.503,1.449,1.278C25.51,8.029,25.511,8.432,25.541,8.843z"/>
21 <path style="fill:#B3B4B5;" d="M8.814,22.464c0.398,0.026,0.802,0.02,1.195,0.085c0.712,0.119,1.253,0.78,1.232,1.45
22 c-0.023,0.736-0.506,1.361-1.235,1.433c-0.761,0.075-1.538,0.091-2.3,0.032c-0.792-0.061-1.348-0.718-1.349-1.44
23 c-0.001-0.762,0.5-1.348,1.305-1.477C8.039,22.488,8.426,22.49,8.814,22.464z"/>
24 <path style="fill:#B3B4B5;" d="M39.186,25.536c-0.397-0.026-0.802-0.02-1.195-0.085c-0.712-0.119-1.253-0.78-1.232-1.45
25 c0.024-0.736,0.506-1.36,1.235-1.433c0.761-0.075,1.538-0.091,2.3-0.032c0.792,0.061,1.348,0.718,1.349,1.44
26 c0.001,0.762-0.501,1.348-1.305,1.476C39.962,25.513,39.574,25.51,39.186,25.536z"/>
27 <path style="fill:#B3B4B5;" d="M33.551,10.101c-0.009,0.043-0.01,0.232-0.09,0.38c-0.387,0.718-0.75,1.454-1.208,2.125
28 c-0.384,0.562-1.244,0.684-1.822,0.368c-0.641-0.349-0.99-1.133-0.682-1.805c0.338-0.739,0.755-1.45,1.213-2.123
29 c0.345-0.507,1.052-0.629,1.655-0.41C33.159,8.833,33.531,9.365,33.551,10.101z"/>
30 <path style="fill:#B3B4B5;" d="M11.557,18.362c-0.023-0.004-0.11-0.001-0.176-0.038c-0.799-0.435-1.631-0.822-2.379-1.332
31 c-0.532-0.363-0.603-1.257-0.285-1.8c0.361-0.615,1.081-0.945,1.729-0.655c0.756,0.338,1.484,0.756,2.172,1.218
32 c0.509,0.341,0.636,1.056,0.423,1.649C12.84,17.966,12.267,18.35,11.557,18.362z"/>
33 <path style="fill:#B3B4B5;" d="M37.892,33.551c-0.045-0.01-0.234-0.012-0.381-0.092c-0.717-0.388-1.453-0.752-2.123-1.211
34 c-0.558-0.383-0.676-1.252-0.358-1.825c0.355-0.64,1.132-0.98,1.809-0.672c0.725,0.33,1.422,0.739,2.084,1.184
35 c0.532,0.357,0.668,1.066,0.438,1.689C39.161,33.164,38.627,33.533,37.892,33.551z"/>
36 <path style="fill:#B3B4B5;" d="M16.841,13.121c-0.613,0.008-1.023-0.326-1.324-0.814c-0.302-0.491-0.594-0.989-0.864-1.498
37 c-0.4-0.754-0.197-1.621,0.454-2.044c0.654-0.424,1.546-0.274,2.037,0.427c0.421,0.6,0.808,1.241,1.098,1.911
38 C18.674,12.098,17.909,13.149,16.841,13.121z"/>
39 <path style="fill:#B3B4B5;" d="M10.26,33.546c-0.874,0.004-1.385-0.34-1.613-0.925c-0.225-0.577-0.119-1.262,0.373-1.61
40 c0.663-0.469,1.364-0.9,2.093-1.256c0.646-0.315,1.45-0.002,1.807,0.588c0.377,0.624,0.278,1.458-0.324,1.904
41 C11.819,32.822,11.012,33.375,10.26,33.546z"/>
42 </g>
43 </g>
44 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="32px" height="32px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
5 <g id="g8H84R.tif_2_">
6 <g>
7 <g>
8 <path style="fill:#FFFFFF;" d="M5.219,31.673c-0.043-0.02-0.083-0.048-0.128-0.059c-1.449-0.349-2.315-1.431-2.316-2.92
9 c-0.003-6.573-0.001-7.688,0-14.261c0-2.227-0.012-4.454,0.006-6.681c0.012-1.556,1.263-2.793,2.819-2.822
10 c0.682-0.013,1.365-0.003,2.047-0.004c0.346,0,0.693,0,1.059,0c0.032-0.145,0.058-0.281,0.092-0.415
11 c0.192-0.755,0.83-1.276,1.607-1.307c0.263-0.01,0.527-0.007,0.79-0.002c0.69,0.014,1.185-0.291,1.522-0.889
12 c0.199-0.354,0.398-0.712,0.645-1.032c0.393-0.51,0.974-0.745,1.562-0.955c0.719,0,1.438,0,2.157,0
13 c0.108,0.044,0.215,0.092,0.324,0.13c0.667,0.236,1.201,0.634,1.547,1.264c0.132,0.241,0.263,0.484,0.408,0.717
14 c0.3,0.48,0.734,0.741,1.304,0.761c0.203,0.007,0.407,0.002,0.611,0.002c1.204,0.001,1.809,0.509,2.017,1.725
15 c1.021,0,2.049-0.011,3.076,0.003c1.018,0.014,1.818,0.458,2.388,1.3c0.316,0.467,0.472,0.991,0.472,1.556
16 c0.001,8.825,0.003,12.19-0.001,21.014c-0.001,1.342-0.908,2.473-2.207,2.796c-0.08,0.02-0.156,0.051-0.234,0.076
17 C19.596,31.673,12.408,31.673,5.219,31.673z M8.74,6.078c-1.025,0-1.995-0.002-2.964,0c-1.124,0.002-1.85,0.719-1.85,1.836
18 c-0.001,8.709-0.001,11.959,0.001,20.668c0,1.273,0.68,1.941,1.96,1.941c6.756,0,13.513,0,20.269,0
19 c1.238,0,1.924-0.694,1.924-1.945c0-4.72,0-3.981,0-8.7c0-4.001,0.002-8.002-0.001-12.003c-0.001-1.055-0.733-1.787-1.781-1.796
20 c-0.359-0.003-0.719-0.002-1.078-0.002c-0.643,0-1.285,0-1.957,0c0,0.209,0.002,0.374,0,0.54
21 c-0.014,1.008-0.744,1.747-1.747,1.759c-0.551,0.007-1.102,0.002-1.653,0.002c-3.103,0-6.205,0.002-9.308-0.002
22 C9.477,8.375,8.751,7.648,8.74,6.575C8.739,6.422,8.74,6.269,8.74,6.078z M15.98,7.228c1.808,0,3.617,0.001,5.425-0.001
23 c0.495-0.001,0.703-0.206,0.706-0.692c0.004-0.503,0.005-1.006,0-1.509c-0.005-0.463-0.217-0.664-0.689-0.674
24 c-0.394-0.008-0.797,0.024-1.181-0.043c-1.025-0.18-1.704-0.819-2.133-1.742c-0.364-0.784-0.968-1.059-1.831-1.114
25 c-1.26-0.081-2.109,0.31-2.622,1.507c-0.318,0.742-0.993,1.165-1.781,1.319c-0.429,0.084-0.88,0.058-1.321,0.073
26 c-0.444,0.015-0.656,0.22-0.66,0.666C9.889,5.497,9.89,5.976,9.892,6.455c0.003,0.591,0.186,0.773,0.771,0.773
27 C12.435,7.227,14.208,7.228,15.98,7.228z"/>
28 <path style="fill:#FFFFFF;" d="M26.837,32L5.081,31.969l0.048-0.342l-0.13,0.3c-1.59-0.381-2.549-1.592-2.55-3.232L2.447,19.41
29 l0.001-4.976L2.446,12.46c-0.002-1.57-0.005-3.14,0.008-4.71c0.014-1.732,1.393-3.114,3.14-3.146
30 C5.872,4.599,6.151,4.598,6.43,4.598L8.442,4.6c0.012-0.057,0.026-0.114,0.04-0.17c0.227-0.893,0.995-1.516,1.91-1.552
31 c0.268-0.011,0.539-0.008,0.81-0.002c0.569-0.006,0.953-0.229,1.23-0.722c0.213-0.379,0.416-0.741,0.671-1.072
32 c0.444-0.576,1.088-0.841,1.71-1.063L14.923,0l2.279,0.024l0.105,0.043c0.068,0.028,0.136,0.057,0.206,0.082
33 c0.781,0.276,1.36,0.753,1.724,1.415l0.055,0.101c0.11,0.202,0.221,0.405,0.344,0.6c0.245,0.393,0.585,0.592,1.038,0.609
34 c0.082,0.003,0.165,0.004,0.247,0.004l0.353-0.002c1.269,0.001,2.001,0.551,2.283,1.725l1.616-0.004
35 c0.399,0,0.798,0.002,1.198,0.007c1.122,0.016,2.015,0.501,2.654,1.443c0.35,0.517,0.528,1.102,0.529,1.739l0.001,5.042
36 c0.001,5.481,0.001,9.044-0.003,15.972c0,1.473-1.01,2.753-2.455,3.113c-0.043,0.011-0.085,0.026-0.128,0.041L26.837,32z
37 M5.298,31.347l21.454-0.008c0.062-0.022,0.124-0.043,0.188-0.059c1.172-0.291,1.959-1.288,1.959-2.479
38 c0.003-6.928,0.003-10.491,0.003-15.972l-0.001-5.042c-0.001-0.504-0.141-0.966-0.416-1.373
39 c-0.519-0.766-1.214-1.144-2.122-1.157C25.966,5.251,25.57,5.25,25.173,5.25l-2.158,0.004l-0.047-0.272
40 c-0.18-1.059-0.64-1.453-1.695-1.454L20.922,3.53c-0.09,0-0.18-0.001-0.27-0.004c-0.669-0.024-1.211-0.34-1.57-0.915
41 c-0.128-0.205-0.246-0.418-0.362-0.632l-0.055-0.1c-0.288-0.526-0.736-0.89-1.369-1.114c-0.081-0.029-0.161-0.062-0.24-0.095
42 l-0.04-0.017H14.98c-0.533,0.192-1.034,0.406-1.36,0.828c-0.225,0.293-0.417,0.634-0.603,0.964
43 c-0.41,0.73-1.002,1.085-1.776,1.085c-0.358-0.006-0.567-0.009-0.823,0.001C9.784,3.556,9.273,3.973,9.115,4.592
44 c-0.022,0.086-0.04,0.173-0.059,0.263L8.968,5.254L6.43,5.251c-0.275,0-0.549,0.002-0.824,0.007
45 C4.215,5.283,3.118,6.38,3.107,7.755c-0.012,1.568-0.01,3.136-0.008,4.704l0.002,1.975L3.1,19.411l0.001,9.284
46 c0.001,1.338,0.754,2.286,2.066,2.602C5.22,31.31,5.263,31.329,5.298,31.347z M16.021,30.85L5.886,30.849
47 c-1.453,0-2.286-0.827-2.286-2.268L3.599,7.914c0-1.291,0.874-2.16,2.176-2.163L6.87,5.75l2.196,0.001v0.82
48 C9.076,7.468,9.66,8.049,10.554,8.05l6.981,0.002l2.327,0l0.954,0.002c0.232,0,0.463-0.001,0.695-0.004
49 c0.828-0.01,1.414-0.601,1.425-1.437l0.001-0.349l-0.001-0.513l3.364,0.002c1.238,0.011,2.104,0.883,2.105,2.122l0.001,20.704
50 c-0.001,1.422-0.842,2.271-2.251,2.271L16.021,30.85z M6.87,6.403L5.776,6.404c-0.94,0.002-1.524,0.58-1.524,1.51l0.001,20.667
51 c0,1.087,0.534,1.615,1.633,1.615l10.135,0.001l10.134-0.001c1.059,0,1.597-0.545,1.598-1.618L27.751,7.875
52 c-0.001-0.871-0.587-1.462-1.457-1.47l-0.568-0.002l-0.507,0l-1.629,0c0,0.075,0,0.147-0.001,0.219
53 c-0.016,1.19-0.886,2.066-2.07,2.08c-0.234,0.003-0.469,0.004-0.703,0.004l-0.954-0.002l-4.654,0l-4.654-0.002
54 c-1.247-0.002-2.127-0.875-2.14-2.125l0-0.174L6.87,6.403z M18.877,7.555l-8.214,0c-0.766,0-1.094-0.328-1.097-1.098
55 c-0.002-0.48-0.004-0.96,0.001-1.441c0.006-0.617,0.352-0.969,0.975-0.99c0.123-0.004,0.246-0.005,0.37-0.006
56 c0.317-0.003,0.617-0.005,0.9-0.061c0.528-0.104,1.225-0.383,1.544-1.127c0.542-1.267,1.476-1.798,2.943-1.704
57 c0.72,0.046,1.61,0.236,2.105,1.303c0.417,0.898,1.036,1.408,1.893,1.558c0.195,0.034,0.399,0.039,0.589,0.039l0.383-0.003
58 l0.161,0.002c0.825,0.018,1.004,0.552,1.009,0.997c0.005,0.505,0.004,1.01,0.001,1.514c-0.005,0.665-0.362,1.016-1.033,1.017
59 L18.877,7.555z M12.435,6.901L21.404,6.9c0.314,0,0.378-0.062,0.381-0.368c0.003-0.501,0.004-1.002-0.001-1.503
60 c-0.003-0.266-0.052-0.344-0.37-0.351l-0.147-0.002l-0.383,0.003c-0.209,0-0.456-0.006-0.702-0.049
61 c-1.068-0.187-1.866-0.835-2.372-1.926c-0.284-0.613-0.721-0.872-1.555-0.926c-1.17-0.077-1.869,0.3-2.301,1.31
62 c-0.336,0.785-1.053,1.322-2.018,1.511c-0.342,0.067-0.687,0.07-1.02,0.073c-0.118,0.001-0.236,0.002-0.353,0.006
63 c-0.275,0.009-0.342,0.077-0.345,0.343c-0.004,0.477-0.003,0.955-0.001,1.432c0.002,0.41,0.039,0.448,0.444,0.448H12.435z"/>
64 </g>
65 <g>
66 <path style="fill:#FFFFFF;" d="M19.179,12.979c-1.592,0-3.184,0.008-4.775-0.01c-0.193-0.002-0.451-0.087-0.559-0.226
67 c-0.106-0.135-0.144-0.445-0.057-0.578c0.107-0.166,0.37-0.316,0.57-0.322c1.1-0.031,2.202-0.016,3.303-0.016
68 c2.082,0,4.165,0,6.247,0.001c0.413,0,0.647,0.156,0.71,0.461c0.078,0.38-0.208,0.686-0.663,0.687
69 C22.362,12.981,20.771,12.978,19.179,12.979z"/>
70 </g>
71 <g>
72 <path style="fill:#FFFFFF;" d="M19.166,17.579c-1.592,0-3.183-0.003-4.775,0.002c-0.323,0.001-0.567-0.106-0.667-0.426
73 c-0.121-0.386,0.178-0.723,0.647-0.725c1.52-0.005,3.04-0.003,4.56-0.003c1.675,0,3.351,0.003,5.026-0.001
74 c0.291-0.001,0.559,0.084,0.615,0.377c0.037,0.191-0.029,0.454-0.148,0.607c-0.093,0.119-0.339,0.16-0.518,0.161
75 C22.326,17.584,20.746,17.579,19.166,17.579z"/>
76 </g>
77 <g>
78 <path style="fill:#FFFFFF;" d="M19.129,22.181c-1.58,0-3.16-0.003-4.74,0.002c-0.341,0.001-0.588-0.122-0.675-0.463
79 c-0.096-0.375,0.204-0.689,0.656-0.69c1.424-0.003,2.849-0.001,4.273-0.001c1.771,0,3.543,0.003,5.314-0.001
80 c0.311-0.001,0.578,0.103,0.627,0.411c0.03,0.19-0.063,0.443-0.187,0.597c-0.088,0.109-0.323,0.137-0.492,0.138
81 c-1.592,0.01-3.184,0.006-4.775,0.006C19.129,22.18,19.129,22.181,19.129,22.181z"/>
82 </g>
83 <g>
84 <path style="fill:#FFFFFF;" d="M9.075,12.783c0.663-0.67,1.253-1.264,1.839-1.861c0.223-0.228,0.472-0.331,0.771-0.164
85 c0.329,0.183,0.402,0.602,0.123,0.89c-0.758,0.781-1.53,1.549-2.308,2.311c-0.25,0.245-0.547,0.241-0.804-0.002
86 c-0.399-0.378-0.789-0.768-1.165-1.169c-0.224-0.239-0.207-0.559,0-0.779c0.217-0.23,0.555-0.256,0.804-0.023
87 C8.587,12.222,8.806,12.491,9.075,12.783z"/>
88 </g>
89 <g>
90 <path style="fill:#FFFFFF;" d="M9.087,17.377c0.617-0.625,1.171-1.187,1.725-1.749c0.067-0.068,0.132-0.14,0.206-0.2
91 c0.255-0.206,0.56-0.199,0.78,0.014c0.219,0.211,0.26,0.547,0.037,0.776c-0.775,0.798-1.562,1.585-2.358,2.362
92 c-0.226,0.221-0.516,0.218-0.748,0.003c-0.412-0.382-0.809-0.781-1.194-1.191c-0.235-0.25-0.21-0.586,0.02-0.804
93 c0.228-0.217,0.552-0.222,0.806,0.019C8.603,16.836,8.82,17.091,9.087,17.377z"/>
94 </g>
95 <g>
96 <path style="fill:#FFFFFF;" d="M9.073,21.965c0.646-0.647,1.227-1.247,1.834-1.821c0.142-0.134,0.38-0.259,0.555-0.237
97 c0.172,0.021,0.41,0.208,0.456,0.369c0.05,0.177-0.023,0.465-0.151,0.605c-0.532,0.582-1.106,1.127-1.664,1.685
98 c-0.195,0.195-0.382,0.397-0.585,0.582c-0.275,0.251-0.564,0.257-0.832,0.003c-0.39-0.371-0.772-0.751-1.142-1.142
99 c-0.237-0.25-0.224-0.581-0.002-0.806c0.222-0.225,0.555-0.241,0.805-0.006C8.592,21.424,8.808,21.682,9.073,21.965z"/>
100 </g>
101 <g>
102 <path style="fill:#FFFFFF;" d="M16.864,4.115c-0.029,0.472-0.452,0.844-0.922,0.811c-0.473-0.034-0.837-0.457-0.8-0.931
103 c0.036-0.46,0.438-0.812,0.902-0.792C16.516,3.224,16.893,3.643,16.864,4.115z"/>
104 </g>
105 </g>
106 </g>
107 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="48px" height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
5 <g id="g8H84R.tif_2_">
6 <g>
7 <g>
8 <path style="fill:#B3B4B5;" d="M8.502,46.53c-0.061-0.029-0.12-0.069-0.184-0.084c-2.083-0.502-3.328-2.057-3.329-4.197
9 c-0.004-9.449-0.001-11.052,0-20.501c0-3.202-0.017-6.403,0.009-9.604C5.014,9.907,6.813,8.128,9.05,8.087
10 c0.98-0.018,1.962-0.005,2.943-0.005c0.498,0,0.996,0,1.523,0c0.046-0.209,0.083-0.404,0.133-0.597
11 c0.277-1.085,1.194-1.834,2.31-1.879c0.379-0.015,0.757-0.011,1.136-0.003c0.992,0.02,1.704-0.418,2.187-1.277
12 c0.286-0.508,0.572-1.024,0.927-1.484c0.565-0.734,1.4-1.071,2.245-1.373c1.033,0,2.067,0,3.1,0
13 c0.155,0.063,0.309,0.131,0.466,0.188c0.959,0.34,1.726,0.911,2.223,1.817c0.191,0.347,0.378,0.696,0.586,1.031
14 c0.43,0.69,1.055,1.066,1.875,1.094c0.292,0.011,0.586,0.003,0.878,0.004c1.731,0.001,2.601,0.732,2.9,2.48
15 c1.468,0,2.945-0.015,4.422,0.005c1.463,0.02,2.613,0.658,3.433,1.869c0.455,0.672,0.679,1.424,0.679,2.238
16 c0.001,12.685,0.004,17.523-0.002,30.209c-0.001,1.929-1.305,3.554-3.173,4.019c-0.114,0.029-0.224,0.073-0.337,0.109
17 C29.169,46.53,18.836,46.53,8.502,46.53z M13.564,9.736c-1.473,0-2.867-0.002-4.261,0.001c-1.616,0.003-2.659,1.034-2.659,2.639
18 c-0.002,12.52-0.002,17.191,0.001,29.71c0,1.829,0.977,2.791,2.817,2.791c9.712,0,19.424,0,29.136,0
19 c1.779,0,2.766-0.998,2.766-2.795c0-6.785,0-5.722,0-12.507c0-5.752,0.002-11.503-0.002-17.255
20 c-0.001-1.517-1.053-2.569-2.56-2.582c-0.517-0.004-1.033-0.003-1.55-0.003c-0.924,0-1.848,0-2.813,0c0,0.3,0.003,0.539,0,0.776
21 c-0.02,1.45-1.069,2.511-2.511,2.529c-0.792,0.01-1.584,0.003-2.377,0.003c-4.46,0-8.92,0.003-13.38-0.003
22 c-1.549-0.002-2.591-1.047-2.608-2.59C13.562,10.232,13.564,10.011,13.564,9.736z M23.971,11.389
23 c2.599,0,5.199,0.002,7.798-0.001c0.712-0.001,1.01-0.296,1.016-0.995c0.006-0.723,0.007-1.446-0.001-2.169
24 c-0.007-0.666-0.312-0.955-0.991-0.969c-0.567-0.012-1.145,0.034-1.698-0.062c-1.474-0.259-2.45-1.177-3.066-2.504
25 c-0.523-1.128-1.392-1.522-2.632-1.602c-1.81-0.117-3.032,0.446-3.768,2.167c-0.456,1.067-1.427,1.674-2.561,1.897
26 c-0.616,0.121-1.265,0.083-1.899,0.104c-0.639,0.022-0.943,0.315-0.949,0.958c-0.006,0.688-0.004,1.377-0.001,2.066
27 c0.004,0.849,0.267,1.111,1.108,1.111C18.876,11.389,21.423,11.389,23.971,11.389z"/>
28 <path style="fill:#B3B4B5;" d="M39.579,47L8.303,46.956l0.068-0.492l-0.187,0.431c-2.286-0.548-3.665-2.289-3.666-4.646
29 L4.518,28.902l0.001-7.154l-0.003-2.837c-0.003-2.257-0.007-4.514,0.011-6.771c0.02-2.49,2.003-4.476,4.514-4.522
30 c0.401-0.008,0.801-0.01,1.202-0.01l2.893,0.004c0.018-0.082,0.036-0.163,0.058-0.243c0.327-1.283,1.431-2.179,2.747-2.231
31 c0.385-0.016,0.775-0.011,1.163-0.003c0.818-0.01,1.37-0.33,1.768-1.038c0.307-0.545,0.599-1.066,0.964-1.541
32 c0.638-0.828,1.564-1.208,2.459-1.529L22.452,1l3.277,0.035l0.15,0.062c0.098,0.041,0.196,0.082,0.296,0.118
33 c1.122,0.398,1.955,1.082,2.478,2.034l0.08,0.145c0.158,0.29,0.318,0.582,0.495,0.862c0.352,0.565,0.84,0.852,1.492,0.875
34 c0.118,0.004,0.237,0.005,0.355,0.005l0.507-0.002c1.825,0.001,2.876,0.792,3.282,2.479l2.323-0.005
35 c0.574,0,1.148,0.002,1.723,0.011c1.614,0.022,2.897,0.72,3.816,2.075c0.503,0.744,0.759,1.585,0.76,2.5l0.001,7.249
36 c0.001,7.879,0.001,13.001-0.004,22.96c0,2.118-1.451,3.958-3.529,4.474c-0.062,0.015-0.123,0.037-0.183,0.058L39.579,47z
37 M8.616,46.061l30.841-0.011c0.089-0.032,0.179-0.062,0.27-0.085c1.684-0.419,2.817-1.851,2.817-3.563
38 c0.005-9.959,0.005-15.081,0.004-22.96l-0.001-7.248c-0.001-0.724-0.202-1.389-0.599-1.974c-0.747-1.1-1.744-1.644-3.051-1.663
39 c-0.57-0.008-1.14-0.011-1.71-0.011l-3.102,0.006l-0.067-0.391c-0.26-1.523-0.92-2.089-2.436-2.09l-0.507,0.002
40 c-0.129,0-0.259-0.001-0.388-0.006c-0.962-0.035-1.741-0.489-2.256-1.316c-0.184-0.295-0.353-0.602-0.52-0.908L27.83,3.7
41 c-0.413-0.755-1.058-1.279-1.968-1.601c-0.116-0.041-0.231-0.089-0.345-0.137L25.46,1.937h-2.926
42 c-0.767,0.276-1.487,0.583-1.955,1.19c-0.324,0.421-0.6,0.911-0.866,1.386c-0.589,1.048-1.44,1.559-2.553,1.559
43 c-0.515-0.009-0.815-0.012-1.184,0.001c-0.911,0.036-1.646,0.634-1.874,1.526c-0.032,0.124-0.057,0.248-0.085,0.379l-0.126,0.574
44 l-3.649-0.004c-0.395,0-0.79,0.002-1.184,0.01c-1.998,0.036-3.576,1.614-3.592,3.591c-0.018,2.254-0.014,4.508-0.011,6.762
45 l0.003,2.839l-0.001,7.155L5.458,42.25c0.001,1.923,1.083,3.287,2.97,3.74C8.504,46.008,8.566,46.036,8.616,46.061z
46 M24.03,45.347L9.461,45.346c-2.088,0-3.286-1.188-3.287-3.26V12.376c0-1.856,1.257-3.106,3.128-3.109l1.575-0.001h3.157v1.179
47 c0.013,1.29,0.853,2.125,2.138,2.126l10.035,0.003h3.345l1.371,0.002c0.333,0,0.666-0.001,0.999-0.006
48 c1.19-0.014,2.033-0.864,2.048-2.065l0.002-0.502L33.97,9.265l4.835,0.003c1.78,0.015,3.024,1.27,3.026,3.05l0.002,29.762
49 c-0.001,2.044-1.21,3.265-3.235,3.265L24.03,45.347z M10.876,10.205l-1.572,0.002c-1.351,0.003-2.191,0.835-2.191,2.171
50 l0.001,29.709c0,1.562,0.769,2.321,2.348,2.321l14.569,0.001l14.568-0.001c1.523,0,2.295-0.783,2.296-2.326l-0.002-29.761
51 c-0.002-1.253-0.843-2.103-2.095-2.113l-0.817-0.003h-0.729H34.91c0,0.108,0,0.212-0.002,0.314
52 c-0.023,1.712-1.274,2.97-2.975,2.991c-0.336,0.004-0.674,0.006-1.01,0.006l-1.371-0.002h-6.69l-6.691-0.003
53 c-1.793-0.002-3.057-1.258-3.076-3.055v-0.25L10.876,10.205z M28.135,11.86H16.328c-1.1,0-1.573-0.472-1.576-1.578
54 c-0.003-0.69-0.005-1.381,0.001-2.072c0.009-0.887,0.507-1.392,1.402-1.423c0.176-0.006,0.354-0.008,0.531-0.01
55 c0.456-0.004,0.887-0.008,1.294-0.087c0.76-0.149,1.761-0.551,2.219-1.621c0.779-1.822,2.122-2.584,4.23-2.45
56 c1.035,0.066,2.314,0.339,3.026,1.873c0.6,1.291,1.49,2.024,2.722,2.24c0.281,0.05,0.573,0.057,0.846,0.057l0.55-0.004
57 l0.231,0.002c1.186,0.026,1.443,0.793,1.45,1.434c0.008,0.725,0.006,1.452,0.001,2.177c-0.008,0.955-0.52,1.46-1.485,1.461
58 L28.135,11.86z M18.876,10.921l12.893-0.001c0.452,0,0.543-0.089,0.547-0.529c0.005-0.72,0.007-1.44-0.001-2.161
59 c-0.005-0.382-0.074-0.495-0.532-0.505l-0.211-0.002l-0.55,0.004c-0.301,0-0.655-0.009-1.008-0.07
60 c-1.534-0.269-2.682-1.201-3.411-2.77c-0.409-0.881-1.036-1.253-2.236-1.331c-1.681-0.11-2.686,0.432-3.307,1.882
61 c-0.483,1.129-1.513,1.9-2.901,2.173c-0.492,0.096-0.987,0.101-1.466,0.105c-0.169,0.001-0.338,0.003-0.507,0.009
62 c-0.395,0.013-0.492,0.11-0.495,0.494c-0.006,0.686-0.004,1.373-0.001,2.059c0.003,0.59,0.057,0.644,0.638,0.644L18.876,10.921
63 L18.876,10.921z"/>
64 </g>
65 <g>
66 <path style="fill:#B3B4B5;" d="M28.569,19.657c-2.288,0-4.576,0.011-6.865-0.014c-0.278-0.003-0.648-0.125-0.804-0.325
67 c-0.152-0.195-0.207-0.64-0.082-0.832c0.154-0.238,0.532-0.454,0.819-0.462c1.581-0.044,3.164-0.022,4.748-0.022
68 c2.994,0,5.987,0,8.981,0.002c0.593,0,0.931,0.224,1.021,0.663c0.112,0.546-0.299,0.985-0.954,0.987
69 C33.146,19.66,30.858,19.657,28.569,19.657z"/>
70 </g>
71 <g>
72 <path style="fill:#B3B4B5;" d="M28.551,26.27c-2.288,0-4.576-0.004-6.865,0.004c-0.465,0.002-0.815-0.152-0.959-0.612
73 c-0.174-0.555,0.256-1.04,0.93-1.042c2.185-0.007,4.37-0.004,6.555-0.004c2.408,0,4.817,0.004,7.226-0.001
74 c0.419-0.001,0.803,0.121,0.884,0.542c0.053,0.275-0.041,0.653-0.213,0.872c-0.133,0.171-0.488,0.23-0.745,0.232
75 C33.093,26.277,30.822,26.27,28.551,26.27z"/>
76 </g>
77 <g>
78 <path style="fill:#B3B4B5;" d="M28.497,32.886c-2.271,0-4.542-0.004-6.813,0.003c-0.49,0.002-0.845-0.175-0.97-0.666
79 c-0.137-0.54,0.293-0.991,0.942-0.992c2.047-0.005,4.095-0.002,6.142-0.002c2.546,0,5.093,0.005,7.639-0.001
80 c0.447-0.001,0.832,0.149,0.901,0.591c0.043,0.272-0.09,0.637-0.269,0.859c-0.127,0.157-0.464,0.196-0.707,0.198
81 C33.074,32.89,30.786,32.885,28.497,32.886C28.497,32.885,28.497,32.885,28.497,32.886z"/>
82 </g>
83 <g>
84 <path style="fill:#B3B4B5;" d="M14.046,19.376c0.953-0.963,1.801-1.817,2.644-2.675c0.321-0.327,0.678-0.476,1.109-0.236
85 c0.472,0.264,0.578,0.866,0.176,1.279c-1.09,1.123-2.199,2.227-3.318,3.322c-0.36,0.353-0.787,0.346-1.155-0.002
86 c-0.574-0.543-1.135-1.103-1.675-1.68c-0.322-0.343-0.298-0.803,0-1.119c0.311-0.331,0.797-0.368,1.156-0.033
87 C13.343,18.568,13.66,18.955,14.046,19.376z"/>
88 </g>
89 <g>
90 <path style="fill:#B3B4B5;" d="M14.062,25.979c0.886-0.899,1.683-1.707,2.48-2.514c0.097-0.098,0.19-0.2,0.296-0.287
91 c0.366-0.297,0.805-0.286,1.121,0.02c0.314,0.304,0.374,0.786,0.054,1.115c-1.114,1.148-2.245,2.278-3.39,3.395
92 c-0.325,0.318-0.742,0.313-1.074,0.005c-0.591-0.55-1.163-1.123-1.716-1.712c-0.337-0.359-0.302-0.842,0.029-1.156
93 c0.328-0.311,0.793-0.319,1.159,0.027C13.367,25.202,13.679,25.569,14.062,25.979z"/>
94 </g>
95 <g>
96 <path style="fill:#B3B4B5;" d="M14.043,32.575c0.929-0.93,1.764-1.793,2.636-2.618c0.203-0.193,0.546-0.372,0.798-0.341
97 c0.247,0.03,0.589,0.299,0.656,0.53c0.073,0.255-0.033,0.668-0.217,0.869c-0.765,0.837-1.589,1.62-2.392,2.423
98 c-0.28,0.28-0.549,0.57-0.841,0.837c-0.395,0.36-0.811,0.37-1.196,0.004c-0.561-0.533-1.11-1.08-1.641-1.642
99 c-0.34-0.36-0.322-0.836-0.003-1.159c0.319-0.324,0.797-0.347,1.158-0.01C13.351,31.797,13.662,32.167,14.043,32.575z"/>
100 </g>
101 <g>
102 <path style="fill:#B3B4B5;" d="M25.242,6.916c-0.041,0.679-0.65,1.214-1.326,1.166c-0.679-0.048-1.203-0.657-1.149-1.338
103 c0.052-0.661,0.63-1.168,1.297-1.139C24.741,5.635,25.283,6.237,25.242,6.916z"/>
104 </g>
105 </g>
106 </g>
107 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="32px" height="32px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
5 <path style="fill:#FFFFFF;" d="M30.506,8.121l0-0.011c-0.013-0.212-0.088-0.384-0.242-0.559c-1.787-2.031-3.521-4.02-4.982-5.698
6 c-0.208-0.239-0.468-0.351-0.819-0.351c-2.006,0.002-4.012,0.003-6.018,0.003l-4.245,0c-0.532,0-1.064,0-1.596,0
7 c-0.532,0-1.064,0-1.595,0c-0.919,0-2.133-0.001-3.37-0.005H7.631c-0.366,0-0.636,0.123-0.876,0.397
8 c-1.021,1.171-2.062,2.359-3.07,3.508c-0.658,0.75-1.316,1.5-1.973,2.252C1.64,7.739,1.589,7.83,1.539,7.919L1.494,7.997v16.257
9 c0.001,0.76,0.001,1.519,0,2.279v0.929c0.008,1.107,0.511,1.999,1.495,2.652c0.388,0.257,0.814,0.383,1.307,0.383
10 c4.5-0.005,8.228-0.007,11.734-0.007c4.188,0,7.991,0.003,11.626,0.01h0.006c0,0,0,0,0,0c0.751,0,1.387-0.263,1.942-0.803
11 c0.555-0.54,0.85-1.151,0.901-1.871l0-4.767c-0.005-4.042-0.003-8.106,0-11.597V8.121z M3.016,23.344h7.183
12 c0.003,0.045,0.005,0.088,0.005,0.131c0.001,0.32,0-0.069,0,0.251c0,0.287,0,0.575,0,0.862c0.001,0.721,0.307,1.443,0.838,1.979
13 c0.533,0.538,1.252,0.848,1.974,0.851c0.988,0.004,2.027,0.006,3.088,0.006c0.926,0,1.907-0.002,2.915-0.005
14 c0.749-0.002,1.459-0.304,2.001-0.848c0.54-0.544,0.84-1.257,0.845-2.009c0.003-0.475,0.002-0.229,0.001-0.721
15 c0-0.164,0-0.329-0.001-0.495h7.187l0.001,1.351c0.001,0.924,0.001,1.848,0,2.772c-0.002,1.026-0.546,1.569-1.574,1.569
16 c-7.61,0.001-15.22,0.001-22.83,0c-0.552,0-0.967-0.135-1.232-0.4c-0.267-0.267-0.402-0.687-0.401-1.246
17 c0.001-0.902,0.001-1.804,0-2.706L3.016,23.344z M21.866,9.492c0-0.168-0.001-0.337-0.001-0.507h7.179v5.638l-7.792,0.001
18 c-0.636,0-0.907,0.274-0.908,0.914c0,0.317,0,0.633,0,0.95c0,0.515,0.001,0.32-0.001,0.835c-0.004,0.947-0.443,1.389-1.382,1.391
19 c-1.944,0.003-3.888,0.003-5.831,0c-0.973-0.001-1.407-0.44-1.408-1.42c0-0.839,0-0.951,0.004-1.784
20 c0.002-0.294-0.071-0.51-0.221-0.661c-0.151-0.152-0.369-0.226-0.666-0.226l-1.056,0c-1.482,0-2.964,0-4.447,0l-2.304,0V8.986h7.171
21 c0,0.068,0,0.136,0,0.203c-0.001,0.273-0.001-0.155,0.001,0.122c0.001,0.123-0.001,0.249-0.004,0.371
22 c-0.006,0.308-0.012,0.627,0.035,0.939c0.217,1.449,1.409,2.464,2.897,2.468c1.087,0.003,2.175,0.002,3.262,0.001
23 c0.474,0,0.947-0.001,1.421-0.001h0.017c0.119,0,0.238,0,0.358,0.001c0.278,0.001,0.556,0.002,0.833-0.002
24 c1.554-0.024,2.828-1.305,2.839-2.857C21.867,9.75,21.866,9.99,21.866,9.492z M20.344,22.763c0,0.274,0,0.549,0.001,0.823
25 c0.001,0.539,0.002,0.386-0.003,0.934c-0.009,0.948-0.431,1.372-1.368,1.375c-0.998,0.004-2.027,0.005-3.06,0.005
26 c-0.931,0-1.892-0.001-2.857-0.004c-0.879-0.003-1.327-0.449-1.332-1.326c-0.004-0.754-0.004-0.863,0.002-1.868
27 c0.002-0.302-0.071-0.522-0.221-0.673c-0.149-0.149-0.363-0.222-0.655-0.222c-1.217-0.001-2.434-0.001-3.65-0.001l-4.163,0V16.17
28 h7.168l0,0.69c0,0.412-0.001,0.115,0.001,0.527c0.003,0.751,0.302,1.464,0.844,2.006c0.542,0.543,1.253,0.843,2.004,0.845
29 c1.982,0.005,3.964,0.004,5.946,0c1.574-0.003,2.859-1.288,2.865-2.865c0.002-0.475,0.001-0.239,0.001-0.72c0-0.163,0-0.326,0-0.491
30 h7.174v5.642l-4.285,0l-3.46,0C20.602,21.806,20.345,22.065,20.344,22.763z M24.359,7.443c-0.985,0-1.97,0-2.955,0
31 c-0.843,0-1.061,0.221-1.062,1.072c0,0.336,0,0.671,0,1.007c0,0.459,0.001,0.207,0,0.666c-0.002,0.925-0.448,1.374-1.364,1.374
32 l-1.164,0c-1.108,0-2.216,0-3.324,0l-1.4,0c-0.92,0-1.367-0.449-1.368-1.371c-0.001-0.748,0.001-0.833,0.004-1.868
33 c0.001-0.287-0.073-0.508-0.221-0.657c-0.146-0.147-0.363-0.222-0.644-0.222C9.745,7.444,8.629,7.444,7.513,7.444l-3.578,0
34 L4.49,6.809c0.673-0.77,1.327-1.519,1.981-2.267C6.574,4.425,6.675,4.307,6.777,4.19c0.29-0.335,0.59-0.681,0.896-1.008
35 c0.073-0.078,0.211-0.144,0.3-0.144c2.675-0.005,5.464-0.007,8.292-0.007c2.516,0,5.149,0.002,7.827,0.006
36 c0.09,0,0.214,0.048,0.26,0.1c1.105,1.249,2.221,2.526,3.301,3.761l0.478,0.547L24.359,7.443z"/>
37 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="48px" height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
5 <g id="AGg5ur_3_">
6 <g>
7 <path style="fill:#B3B4B5;" d="M41.927,44.5c-11.896,0-23.794,0-35.69,0c-0.046-0.027-0.088-0.062-0.137-0.079
8 c-1.924-0.696-2.993-2.189-2.994-4.19c-0.001-2.059,0.001-4.118-0.003-6.178c0-0.155-0.038-0.31-0.059-0.465
9 c0-0.107,0-0.214,0-0.321c0.021-0.143,0.059-0.287,0.059-0.43c0.004-3.045,0.004-6.09,0-9.136c0-0.129-0.038-0.256-0.059-0.385
10 c0-0.107,0-0.214,0-0.321c0.021-0.143,0.059-0.287,0.059-0.43c0.004-3.045,0.004-6.089,0-9.134c0-0.155-0.038-0.311-0.059-0.466
11 c0-0.08,0-0.161,0-0.241c0.106-0.165,0.19-0.349,0.32-0.494c2.434-2.727,4.878-5.444,7.303-8.179
12 c0.344-0.388,0.714-0.549,1.237-0.548c8.115,0.012,16.231,0.008,24.347,0.008c0.109,0,0.232-0.031,0.324,0.007
13 c0.267,0.11,0.593,0.188,0.772,0.385c2.548,2.823,5.076,5.663,7.609,8.5c0,9.709,0,19.418,0,29.127
14 c-0.336,0.556-0.628,1.143-1.019,1.658C43.437,43.847,42.686,44.193,41.927,44.5z M4.865,23.996c0,2.875,0,5.702,0,8.557
15 c0.19,0,0.353,0,0.514,0c3.711,0,7.421-0.001,11.132,0.001c0.723,0,1.04,0.33,1.036,1.037c-0.007,1.23-0.01,2.46-0.003,3.69
16 c0.008,1.378,0.774,2.135,2.187,2.139c2.878,0.009,5.756,0.009,8.636-0.001c1.5-0.005,2.229-0.729,2.243-2.203
17 c0.011-1.176,0.003-2.353,0.004-3.53c0.001-0.868,0.266-1.132,1.139-1.132c3.684,0,7.366,0,11.05,0c0.159,0,0.32,0,0.5,0
18 c0-2.87,0-5.698,0-8.551c-3.652,0-7.285,0-10.961,0c0,0.998,0.002,1.971,0,2.944c-0.005,2.163-1.771,3.899-3.975,3.902
19 c-2.865,0.004-5.73,0.004-8.595,0c-1.907-0.003-3.592-1.347-3.883-3.202c-0.129-0.824-0.056-1.679-0.07-2.52
20 c-0.006-0.369-0.001-0.739-0.001-1.128C12.139,23.996,8.517,23.996,4.865,23.996z M32.341,13.722c0,1.049,0.006,2.051-0.001,3.052
21 c-0.015,2.08-1.749,3.803-3.866,3.841c-0.627,0.012-1.255,0.004-1.882,0.004c-2.359-0.003-4.72,0.03-7.078-0.022
22 c-1.758-0.039-3.347-1.412-3.605-3.113c-0.135-0.891-0.07-1.811-0.09-2.719c-0.007-0.342-0.001-0.684-0.001-1.029
23 c-3.693,0-7.324,0-10.953,0c0,2.861,0,5.688,0,8.545c0.271,0,0.514,0,0.757,0c3.628-0.001,7.255-0.002,10.883-0.001
24 c0.724,0,1.046,0.329,1.042,1.032c-0.007,1.19-0.006,2.379-0.005,3.57c0.001,1.536,0.738,2.264,2.305,2.267
25 c2.824,0.004,5.646,0.004,8.47,0c1.541-0.002,2.291-0.734,2.297-2.236c0.005-1.19,0-2.379,0.001-3.57
26 c0.001-0.781,0.288-1.061,1.085-1.061c3.723-0.001,7.447-0.001,11.169-0.002c0.144,0,0.287,0,0.424,0c0-2.885,0-5.711,0-8.558
27 C39.64,13.722,36.018,13.722,32.341,13.722z M5.883,12.009c0.265,0,0.415,0,0.564,0c3.355,0,6.709-0.001,10.064,0.001
28 c0.724,0,1.039,0.326,1.036,1.037c-0.005,1.216-0.005,2.433-0.005,3.649c0,1.471,0.768,2.221,2.265,2.221
29 c2.85-0.001,5.7-0.002,8.55-0.001c1.497,0,2.253-0.744,2.255-2.227c0.002-1.19-0.002-2.379,0.003-3.569
30 c0.003-0.845,0.269-1.109,1.12-1.11c3.355-0.002,6.709-0.001,10.064-0.003c0.128,0,0.256-0.013,0.427-0.021
31 c-0.059-0.085-0.085-0.13-0.118-0.167c-1.893-2.123-3.783-4.25-5.693-6.359c-0.135-0.149-0.421-0.237-0.637-0.238
32 c-7.786-0.012-15.573-0.009-23.359-0.017c-0.328,0-0.557,0.087-0.774,0.333c-1.384,1.567-2.78,3.123-4.171,4.683
33 C6.966,10.792,6.459,11.363,5.883,12.009z M43.323,34.278c-3.688,0-7.322,0-10.98,0c0,1.021,0.005,2.009-0.001,2.997
34 c-0.014,2.089-1.786,3.835-3.914,3.842c-2.906,0.009-5.812,0.01-8.718-0.009c-0.415-0.003-0.847-0.078-1.238-0.212
35 c-1.625-0.558-2.656-2.029-2.655-3.717c0.001-0.959,0-1.919,0-2.906c-3.677,0-7.311,0-10.964,0
36 c-0.006,0.143-0.016,0.262-0.016,0.38c-0.001,1.939-0.004,3.878,0.001,5.817c0.003,1.514,0.925,2.427,2.471,2.427
37 c11.2,0.004,22.401,0.004,33.602,0c1.458,0,2.396-0.93,2.412-2.369c0.008-0.762,0.002-1.525,0.002-2.286
38 C43.323,36.932,43.323,35.622,43.323,34.278z"/>
39 </g>
40 </g>
41 </svg>
0 <?xml version="1.0" encoding="iso-8859-1"?>
1 <!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 width="128px" height="20px" viewBox="0 0 128 20" style="enable-background:new 0 0 128 20;" xml:space="preserve">
5 <g>
6 <path style="fill:#E1372F;" d="M115.938,20l0.328-3h2.179l0.937-5.816L128,0h-8.141l-1.956,3.227
7 C117.559,3.835,117.268,5,116.951,5h-0.211l-1.401-5h-8.194l5.154,11.375L110.951,20H115.938z"/>
8 <polygon style="fill:#E1372F;" points="15.595,6 16.494,0 5.305,0 4.955,3 2.705,3 0,20 4.932,20 5.233,18 7.679,18 8.405,13
9 13.719,13 14.538,8 9.225,8 9.542,6 "/>
10 <path style="fill:#E1372F;" d="M80.736,0h-4.991l-0.261,2h-2.452l-2.629,16.659L67.089,2H64.72l-0.261-2h-5.795l-8.822,17.476
11 L47.8,13.48c-0.317-0.581-0.714-0.894-1.031-1.185l0.026-0.156c2.828-0.899,4.203-2.184,4.679-5.197
12 C52.267,1.919,48.751,0,44.258,0h-6.402l-0.261,2h-2.416l-2.606,16.512L29.288,2h-2.703l-0.261-2h-5.461l-8.859,18h2.491l-0.832,2
13 h4.796l0.978-3h5.472l0.264,3h7.191h0.475h6.609l1.005-6h0.132l2.167,6h5.842h2.511h5.155l0.978-3h5.472l0.264,3h7.243h0.422h8.75
14 c5.842,0,10.6-3.788,11.551-9.709C92.102,2.969,87.424,0,80.736,0z M21.472,13l2.3-6h0.264c0,1-0.026,1.678,0.053,2.524L24.379,13
15 H21.472z M44.363,7.026C44.125,8.506,42.91,9,41.72,9h-0.502l0.529-4h0.555C43.544,5,44.601,5.493,44.363,7.026z M59.272,13l2.3-6
16 h0.264c0,1-0.026,1.678,0.053,2.524L62.18,13H59.272z M83.697,10.128c-0.402,2.488-2.239,3.672-4.487,3.776L79.203,14H76.12
17 l0.495-3h2.207l0.804-5h0.45C82.719,6,84.146,7.326,83.697,10.128z"/>
18 <path style="fill:#E1372F;" d="M106.127,2h-2.689l-0.292-2h-5.493l-8.735,17h2.676l-0.918,3h4.572l0.978-3h5.472l0.264,3h7.666
19 L106.127,2z M98.262,13l2.3-6h0.264c0,1-0.026,1.678,0.053,2.524L101.169,13H98.262z"/>
20 </g>
21 </svg>
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
0 <!-- Faraday Penetration Test IDE -->
11 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
22 <!-- See the file 'doc/LICENSE' for the license information -->
33 <!DOCTYPE html>
55 <!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
66 <!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
77 <!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
8 <!--[if (gt IE 9)|!(IE)]><!-->
9 <html id="no-overflow" lang="en" class="no-js"> <!--<![endif]-->
8 <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js" ng-app="faradayApp"> <!--<![endif]-->
109 <head>
1110 <meta charset="utf-8"/>
1211 <!--[if IE]><![endif]-->
1312 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
14 <title>Dashboard | Faraday</title>
13 <title ng-bind="title + 'Faraday'"></title>
1514 <meta name="description" content=""/>
1615 <meta name="keywords" content=""/>
1716 <meta name="author" content=""/>
1817
19 <!-- !CSS -->
18 <!-- CSS -->
2019 <link rel="stylesheet" type="text/css" href="normalize.css" />
2120 <link rel="stylesheet" type="text/css" href="estilos.css" />
2221 <link rel="stylesheet" type="text/css" href="script/jquery.qtip.css" />
22 <link rel="stylesheet" type="text/css" href="script/animate.css" />
2323 <link rel="stylesheet" href="script/bootstrap.min.css">
2424 <link rel="stylesheet" href="script/bootstrap-theme.min.css">
2525 <link rel="stylesheet" type="text/css" href="styles/font-awesome.css" />
26
27 <!-- Icons -->
2628 <link href="favicon.ico" rel="shortcut icon">
2729 <link href="favicon.ico" type="image/vnd.microsoft.icon" rel="icon" />
2830 <link href="images/site_preview.jpg" rel="image_src" />
2931
30 <script type="text/javascript" src="script/couch.js"></script>
31 <script type="text/javascript" src="script/common.js"></script>
32 <script type="text/javascript" src="/_utils/script/sha1.js"></script>
33 <script type="text/javascript" src="script/app.js"></script>
34 <script type="text/javascript" src="script/d3_summarized.js"></script>
35 <script type="text/javascript" src="script/reports_list.js"></script>
36 <script type="text/javascript" src="/_utils/script/json2.js"></script>
32 <!-- Scripts -->
3733 <script type="text/javascript" src="/_utils/script/jquery.js"></script>
3834 <script type="text/javascript" src="/_utils/script/jquery.couch.js"></script>
39 <script type="text/javascript" src="script/jquery.tablesorter.min.js"></script>
4035 <script type="text/javascript" src="script/bootstrap.min.js"></script>
36 <script type="text/javascript" src="script/angular.js"></script>
37 <script type="text/javascript" src="script/angular-cookies.js"></script>
38 <script type="text/javascript" src="script/angular-route.js"></script>
39 <script type="text/javascript" src="script/angular-selection-model.js"></script>
40 <script type="text/javascript" src="script/angular-file-upload-shim.js"></script><!-- compatibility with older browsers -->
41 <script type="text/javascript" src="script/angular-file-upload.js"></script>
42 <script type="text/javascript" src="script/ngClip.js"></script>
43 <script type="text/javascript" src="script/ui-bootstrap-tpls-0.11.2.min.js"></script>
4144 <script type="text/javascript" src="script/jquery.qtip.js"></script>
42 <script type="text/javascript" src="script/d3.min.js"></script>
45 <script type="text/javascript" src="script/cryptojs-sha1.js"></script>
46 <script type="text/javascript" src="script/ZeroClipboard.min.js"></script>
4347 </head>
4448
4549 <body>
4650 <div id="cont">
4751 <div class="wrapper">
4852 <header class="head">
49 <a href="#" class="ws-dashboard"><img class="logo" src="images/logo-faraday.png" alt="Faraday home | WS Dashboard"/></a>
53 <a href="#" class="ws-dashboard"><img class="logo animated fadeInDown" src="images/logo-faraday.svg" alt="Faraday home | WS Dashboard"/></a>
5054 </header>
5155
52 <section id="main" class="seccion clearfix">
53 <aside>
54 <nav class="left-nav">
55 <ul>
56 <li>
57 <a href="#" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
58 <h2><span class="fa fa-pie-chart" title="Dashboard"></span></h2>
59 </a>
60 </li>
61 <li>
62 <a href="#" class="status-report" style="color: #ffffff !important" title="Status Report">
63 <h2><span class="fa fa-list" title="Status Report"></span></h2>
64 </a>
65 </li>
66 </ul>
67 </nav>
68 </aside>
69
70 <div class="right-main">
71 <div id="reports-main" class="fila clearfix">
72 <h2 class="ws-label">
73 <span id="ws-name" class="label label-default" title="Current workspace"></span><!-- WS name -->
74
75 <div id="ws-control" class="btn-group">
76 <button id="refresh" type="button" class="btn btn-danger" title="Refresh current workspace">
77 <span class="glyphicon glyphicon-refresh"></span>
78 </button>
79 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" title="Change current workspace">
80 Change workspace <span class="caret"></span>
81 </button>
82 <ul id="nav" class="dropdown-menu dropdown-menu-right" role="menu"></ul><!-- WS navigation -->
83 </div><!-- #ws-control -->
84 </h2><!-- .ws-label -->
85 <div class="reports">
86 </div><!-- .reports -->
87 </div><!-- #reports-main -->
88 </div><!-- .right-main -->
89 </section><!-- #main -->
90 <footer>
91 </footer>
56 <div ng-controller="navigationCtrl" ng-include="'scripts/navigation/partials/leftBar.html'"></div>
57
58 <div ng-view></div>
9259 </div><!--!/#wrapper -->
9360 </div><!--!/#container -->
9461
95 <script type="text/javascript">
96 $(document).ready(function() {
97 var counter = 0;
98 var h = 0;
99 $.couch.allDbs({
100 success : function(dbs) {
101 dbs.filter(function(db_name){
102 return db_name.search(/^_/) < 0 && db_name.search("reports") < 0;
103 })
104 .forEach(function(db) {
105 // WSs list
106 $("#ws-control #nav").append('<li><a href="#'+db+'" class="ws" >'+db+'</a></li>');
107 // navigation between WSs
108 if(window.location.hash === "" && counter === 0) {
109 window.location.hash = db;
110 location.reload();
111 }
112 counter +=1;
113 });
114 if(counter < 1) {
115 $("#reports-main").empty();
116 $("#reports-main").append("<div id=\"no-workspace\" class=\"workspace\">No Workspaces installed, please start working to get some data</div><!-- .workspace -->");
117 }
118 }
119 });
120 // navegacion entre WSs en el dropdown
121 $(document).on("click", "a.ws", function(e) {
122 e.preventDefault();
123 var hash = $(this).attr("href").substr(1);
124 window.location.hash = hash;
125 location.reload();
126 });
127 $(document).on("click", "#refresh", function() {
128 location.reload();
129 });
130 $(document).on("click", "a.ws-dashboard", function(e) {
131 e.preventDefault();
132 var url = "../././reports/index.html#" + workspace;
133 window.location.href = url;
134 });
135 $(document).on("click", "a.status-report", function(e) {
136 e.preventDefault();
137 var url = "../././reports/faraday.html#/status/ws/" + workspace;
138 window.location.href = url;
139 });
140 $(document).on("click", "a.treemap-view", function(e) {
141 e.preventDefault();
142 var url = "../././reports/treemap.html?workspace=" + workspace +"&design=hosts&view=byservices#"+ workspace;
143 window.location.href = url;
144 });
145
146 //get workspace
147 domain = location.href;
148 space = domain.split("#");
149 workspace = space[1];
150
151 var ret = "Dashboard for "+ workspace;
152 $('#reports-main .ws-label span#ws-name').text(ret);
153
154 rutas = [
155 "reports/compound.html?workspace="+workspace+"&design=hosts&view=compound",
156 "reports/byservices.html?workspace="+workspace+"&design=hosts&view=byservices",
157 "reports/summarized.html?workspace="+workspace+"&design=hosts&view=summarized",
158 "reports/vulns.html?workspace="+workspace+"&design=hosts&view=vulns",
159 "reports/commands.html?workspace="+workspace+"&design=commands&view=list"
160 ];
161 var content_cake = "<div id='sequence'></div><div id='chart'><div id='explanation' style='visibility: hidden;'></div></div>";
162
163 $("#reports-main").append("<div class='col-lg-2'><article id='treemap' class='panel panel-default'><header>"+
164 "<h2><a class=\"treemap-view\" href=\"\">Top Services</a> <span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Top 5 services with the largest quantity of hosts\">"+
165 "</span></h2></header></article></div>"+
166 "<div class='col-lg-2'><article id='bar' class='panel panel-default'><header><h2>Top Hosts "+
167 "<span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Top 3 hosts with the largest quantity of services\"></span></h2></header></article></div>"+
168 "<div class='col-lg-2'><article id='cake' class='panel panel-default'><header><h2>Vulnerabilities "+
169 "<span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Vulnerabilty distribution for current WS\"></span></h2>"+
170 "</header>"+ content_cake +"</article></div>"+
171 "<div id='byservices'></div><div id='summarized'></div>"+
172 "<div id='compound'></div><div id='vulns'></div><div id='list'></div>");
173
174 design = "hosts";
175 view = "byservices";
176 treemap(workspace, design, view);
177 bar(workspace, design, view);
178 view = "vulns";
179 cake(workspace, design, view);
180 for (i = 0; i < rutas.length; i++) {
181 domain = rutas[i];
182 var div = load(domain);
183 }
184
185 var navegador = navigator.userAgent;
186 if (navigator.userAgent.indexOf('MSIE') !=-1) {
187 $("#main.seccion").height(screen.height - 100);
188 } else if (navigator.userAgent.indexOf('Firefox') !=-1) {
189 $("#main.seccion").height(screen.height - 100);
190 } else if (navigator.userAgent.indexOf('Chromium') !=-1) {
191 $("#main.seccion").height(screen.height - 100);
192 } else if (navigator.userAgent.indexOf('Chrome') !=-1) {
193 $("#main.seccion").height(screen.height - 100);
194 } else if (navigator.userAgent.indexOf('Opera') !=-1) {
195 $("#main.seccion").height(screen.height - 100);
196 }
197
198 $('#cont').on('mouseenter', '.faraday-qtips', function (event) {
199 $(this).qtip({
200 overwrite: false, // Don't overwrite tooltips already bound
201 show: {
202 event: event.type, // Use the same event type as above
203 ready: true // Show immediately - important!
204 },
205 hide: {
206 fixed: true,
207 delay: 300
208 },
209 content:{
210 text: function(event, api) {
211 var res = "<div id=\"contenido\">"+$(this).attr("title")+"</div>";
212 return res;
213 }
214 },
215 position:{
216 my: 'top center',
217 at: 'bottom center',
218 adjust: {
219 method: 'shift'
220 }
221 }
222 });
223 });
224 });
225
226 function load(domain){
227 $(".reports").load(domain, function(){
228 var parametros = domains(domain);
229 var div = get_report_div(parametros[0],parametros[1],parametros[2]);
230 if(parametros[1] == "byservices"){
231 $("#byservices").append(div);
232 }
233 if(parametros[1] == "summarized"){
234 $("#summarized").append(div);
235 }
236 if(parametros[1] == "vulns"){
237 $("#vulns").append(div);
238 }
239 if(parametros[1] == "list"){
240 $("#list").append(div);
241 }
242 if(parametros[1] == "compound"){
243 $("#compound").append(div);
244 }
245 });
246 }
247
248 function domains(domain){
249 //get the link parameters
250 space = domain.split("=");
251 workspace = space[1].split("&");
252 workspace = workspace[0];
253 design = space[2].split("&");
254 design = design[0];
255 view = space[3];
256 parametros = [workspace, view, design];
257 return parametros;
258 }
259
260 setTimeout(function() {
261 //order of compound when reload
262 sorter(0);
263 }, 1000);
264 </script>
62 <script type="text/javascript" src="scripts/app.js"></script>
63 <script type="text/javascript" src="scripts/attachments/providers/attachments.js"></script>
64 <script type="text/javascript" src="scripts/commons/providers/commons.js"></script>
65 <script type="text/javascript" src="scripts/commons/filters/orderObjectBy.js"></script>
66 <script type="text/javascript" src="scripts/fileExporter/directives/download.js"></script>
67 <script type="text/javascript" src="scripts/fileExporter/services/blob.js"></script>
68 <script type="text/javascript" src="scripts/fileExporter/services/click.js"></script>
69 <script type="text/javascript" src="scripts/hosts/services/hosts.js"></script>
70 <script type="text/javascript" src="scripts/modal/filter/Filter.js"></script>
71 <script type="text/javascript" src="scripts/modal/controllers/modalDelete.js"></script>
72 <script type="text/javascript" src="scripts/modal/controllers/modalEdit.js"></script>
73 <script type="text/javascript" src="scripts/modal/controllers/modalNew.js"></script>
74 <script type="text/javascript" src="scripts/modal/controllers/modalKO.js"></script>
75 <script type="text/javascript" src="scripts/navigation/controllers/navigationCtrl.js"></script>
76 <script type="text/javascript" src="scripts/notes/services/notes.js"></script>
77 <script type="text/javascript" src="scripts/statusReport/controllers/statusReport.js"></script>
78 <script type="text/javascript" src="scripts/statusReport/directives/textCollapse.js"></script>
79 <script type="text/javascript" src="scripts/statusReport/services/statusReport.js"></script>
80 <script type="text/javascript" src="scripts/statusReport/services/target.js"></script>
81 <script type="text/javascript" src="scripts/vulns/services/vulns.js"></script>
82 <script type="text/javascript" src="scripts/vulnsWeb/services/vulnsWeb.js"></script>
83 <script type="text/javascript" src="scripts/workspaces/controllers/workspaces.js"></script>
84 <script type="text/javascript" src="scripts/workspaces/services/workspaces.js"></script>
85 <script type="text/javascript" src="scripts/dashboard/controllers/dashboard.js"></script>
86 <script type="text/javascript" src="scripts/dashboard/controllers/graphicsBarCtrl.js"></script>
87 <script type="text/javascript" src="scripts/dashboard/controllers/summarizedCtrl.js"></script>
88 <script type="text/javascript" src="scripts/dashboard/services/dashboard.js"></script>
89 <script type="text/javascript" src="scripts/d3/services/d3.js"></script>
90 <script type="text/javascript" src="scripts/d3/directives/treemap.js"></script>
91 <script type="text/javascript" src="scripts/d3/directives/bar.js"></script>
92 <script type="text/javascript" src="scripts/d3/directives/cake.js"></script>
26593 </body>
26694 </html>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3 <!DOCTYPE html>
4 <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
5 <!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
6 <!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
7 <!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
8 <!--[if (gt IE 9)|!(IE)]><!-->
9 <html id="no-overflow" lang="en" class="no-js"> <!--<![endif]-->
10 <head>
11 <meta charset="utf-8"/>
12 <!--[if IE]><![endif]-->
13 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
14 <title>Dashboard | Faraday</title>
15 <meta name="description" content=""/>
16 <meta name="keywords" content=""/>
17 <meta name="author" content=""/>
18
19 <!-- !CSS -->
20 <link rel="stylesheet" type="text/css" href="normalize.css" />
21 <link rel="stylesheet" type="text/css" href="estilos.css" />
22 <link rel="stylesheet" type="text/css" href="script/jquery.qtip.css" />
23 <link rel="stylesheet" href="script/bootstrap.min.css">
24 <link rel="stylesheet" href="script/bootstrap-theme.min.css">
25 <link rel="stylesheet" type="text/css" href="styles/font-awesome.css" />
26 <link href="favicon.ico" rel="shortcut icon">
27 <link href="favicon.ico" type="image/vnd.microsoft.icon" rel="icon" />
28 <link href="images/site_preview.jpg" rel="image_src" />
29
30 <script type="text/javascript" src="script/couch.js"></script>
31 <script type="text/javascript" src="script/common.js"></script>
32 <script type="text/javascript" src="/_utils/script/sha1.js"></script>
33 <script type="text/javascript" src="script/app.js"></script>
34 <script type="text/javascript" src="script/d3_summarized.js"></script>
35 <script type="text/javascript" src="script/reports_list.js"></script>
36 <script type="text/javascript" src="/_utils/script/json2.js"></script>
37 <script type="text/javascript" src="/_utils/script/jquery.js"></script>
38 <script type="text/javascript" src="/_utils/script/jquery.couch.js"></script>
39 <script type="text/javascript" src="script/jquery.tablesorter.min.js"></script>
40 <script type="text/javascript" src="script/bootstrap.min.js"></script>
41 <script type="text/javascript" src="script/jquery.qtip.js"></script>
42 <script type="text/javascript" src="script/d3.min.js"></script>
43 </head>
44
45 <body>
46 <div id="cont">
47 <div class="wrapper">
48 <header class="head">
49 <a href="#" class="ws-dashboard"><img class="logo" src="images/logo-faraday.png" alt="Faraday home | WS Dashboard"/></a>
50 </header>
51
52 <section id="main" class="seccion clearfix">
53 <aside>
54 <nav class="left-nav">
55 <ul>
56 <li>
57 <a href="#" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
58 <h2><span class="fa fa-pie-chart" title="Dashboard"></span></h2>
59 </a>
60 </li>
61 <li>
62 <a href="#" class="status-report" style="color: #ffffff !important" title="Status Report">
63 <h2><span class="fa fa-list" title="Status Report"></span></h2>
64 </a>
65 </li>
66 <li>
67 <a href="#" class="workspaces" style="color: #ffffff !important" title="Workspaces">
68 <h2><span class="fa fa-folder-open-o" title="Workspaces"></span></h2>
69 </a>
70 </li>
71 </ul>
72 </nav>
73 </aside>
74
75 <div class="right-main">
76 <div id="reports-main" class="fila clearfix">
77 <h2 class="ws-label">
78 <span id="ws-name" class="label label-default" title="Current workspace"></span><!-- WS name -->
79
80 <div id="ws-control" class="btn-group">
81 <button id="refresh" type="button" class="btn btn-danger" title="Refresh current workspace">
82 <span class="glyphicon glyphicon-refresh"></span>
83 </button>
84 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" title="Change current workspace">
85 Change workspace <span class="caret"></span>
86 </button>
87 <ul id="nav" class="dropdown-menu dropdown-menu-right" role="menu"></ul><!-- WS navigation -->
88 </div><!-- #ws-control -->
89 </h2><!-- .ws-label -->
90 <div class="reports">
91 </div><!-- .reports -->
92 </div><!-- #reports-main -->
93 </div><!-- .right-main -->
94 </section><!-- #main -->
95 <footer>
96 </footer>
97 </div><!--!/#wrapper -->
98 </div><!--!/#container -->
99
100 <script type="text/javascript">
101 $(document).ready(function() {
102 var counter = 0;
103 var h = 0;
104 $.couch.allDbs({
105 success : function(dbs) {
106 dbs.filter(function(db_name){
107 return db_name.search(/^_/) < 0 && db_name.search("reports") < 0;
108 })
109 .forEach(function(db) {
110 // WSs list
111 $("#ws-control #nav").append('<li><a href="#'+db+'" class="ws" >'+db+'</a></li>');
112 // navigation between WSs
113 if(window.location.hash === "" && counter === 0) {
114 window.location.hash = db;
115 location.reload();
116 }
117 counter +=1;
118 });
119 if(counter < 1) {
120 $("#reports-main").empty();
121 $("#reports-main").append("<div id=\"no-workspace\" class=\"workspace\">No Workspaces installed, please start working to get some data</div><!-- .workspace -->");
122 }
123 }
124 });
125 // navegacion entre WSs en el dropdown
126 $(document).on("click", "a.ws", function(e) {
127 e.preventDefault();
128 var hash = $(this).attr("href").substr(1);
129 window.location.hash = hash;
130 location.reload();
131 });
132 $(document).on("click", "#refresh", function() {
133 location.reload();
134 });
135 $(document).on("click", "a.ws-dashboard", function(e) {
136 e.preventDefault();
137 var url = "../././reports/index.html#" + workspace;
138 window.location.href = url;
139 });
140 $(document).on("click", "a.status-report", function(e) {
141 e.preventDefault();
142 var url = "../././reports/faraday.html#/status/ws/" + workspace;
143 window.location.href = url;
144 });
145 $(document).on("click", "a.workspaces", function(e) {
146 e.preventDefault();
147 var url = "../././reports/faraday.html#/workspaces";
148 window.location.href = url;
149 });
150 $(document).on("click", "a.treemap-view", function(e) {
151 e.preventDefault();
152 var url = "../././reports/treemap.html?workspace=" + workspace +"&design=hosts&view=byservices#"+ workspace;
153 window.location.href = url;
154 });
155
156 //get workspace
157 domain = location.href;
158 space = domain.split("#");
159 workspace = space[1];
160
161 var ret = "Dashboard for "+ workspace;
162 $('#reports-main .ws-label span#ws-name').text(ret);
163
164 rutas = [
165 "reports/compound.html?workspace="+workspace+"&design=hosts&view=compound",
166 "reports/byservices.html?workspace="+workspace+"&design=hosts&view=byservices",
167 "reports/summarized.html?workspace="+workspace+"&design=hosts&view=summarized",
168 "reports/vulns.html?workspace="+workspace+"&design=hosts&view=vulns",
169 "reports/commands.html?workspace="+workspace+"&design=commands&view=list"
170 ];
171 var content_cake = "<div id='sequence'></div><div id='chart'><div id='explanation' style='visibility: hidden;'></div></div>";
172
173 $("#reports-main").append("<div class='col-lg-2'><article id='treemap' class='panel panel-default'><header>"+
174 "<h2><a class=\"treemap-view\" href=\"\">Top Services</a> <span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Top 5 services with the largest quantity of hosts\">"+
175 "</span></h2></header></article></div>"+
176 "<div class='col-lg-2'><article id='bar' class='panel panel-default'><header><h2>Top Hosts "+
177 "<span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Top 3 hosts with the largest quantity of services\"></span></h2></header></article></div>"+
178 "<div class='col-lg-2'><article id='cake' class='panel panel-default'><header><h2>Vulnerabilities "+
179 "<span class=\"glyphicon glyphicon-info-sign faraday-qtips\" title=\"Vulnerabilty distribution for current WS\"></span></h2>"+
180 "</header>"+ content_cake +"</article></div>"+
181 "<div id='byservices'></div><div id='summarized'></div>"+
182 "<div id='compound'></div><div id='vulns'></div><div id='list'></div>");
183
184 design = "hosts";
185 view = "byservices";
186 treemap(workspace, design, view);
187 bar(workspace, design, view);
188 view = "vulns";
189 cake(workspace, design, view);
190 for (i = 0; i < rutas.length; i++) {
191 domain = rutas[i];
192 var div = load(domain);
193 }
194
195 var navegador = navigator.userAgent;
196 if (navigator.userAgent.indexOf('MSIE') !=-1) {
197 $("#main.seccion").height(screen.height - 100);
198 } else if (navigator.userAgent.indexOf('Firefox') !=-1) {
199 $("#main.seccion").height(screen.height - 100);
200 } else if (navigator.userAgent.indexOf('Chromium') !=-1) {
201 $("#main.seccion").height(screen.height - 100);
202 } else if (navigator.userAgent.indexOf('Chrome') !=-1) {
203 $("#main.seccion").height(screen.height - 100);
204 } else if (navigator.userAgent.indexOf('Opera') !=-1) {
205 $("#main.seccion").height(screen.height - 100);
206 }
207
208 $('#cont').on('mouseenter', '.faraday-qtips', function (event) {
209 $(this).qtip({
210 overwrite: false, // Don't overwrite tooltips already bound
211 show: {
212 event: event.type, // Use the same event type as above
213 ready: true // Show immediately - important!
214 },
215 hide: {
216 fixed: true,
217 delay: 300
218 },
219 content:{
220 text: function(event, api) {
221 var res = "<div id=\"contenido\">"+$(this).attr("title")+"</div>";
222 return res;
223 }
224 },
225 position:{
226 my: 'top center',
227 at: 'bottom center',
228 adjust: {
229 method: 'shift'
230 }
231 }
232 });
233 });
234 });
235
236 function load(domain){
237 $(".reports").load(domain, function(){
238 var parametros = domains(domain);
239 var div = get_report_div(parametros[0],parametros[1],parametros[2]);
240 if(parametros[1] == "byservices"){
241 $("#byservices").append(div);
242 }
243 if(parametros[1] == "summarized"){
244 $("#summarized").append(div);
245 }
246 if(parametros[1] == "vulns"){
247 $("#vulns").append(div);
248 }
249 if(parametros[1] == "list"){
250 $("#list").append(div);
251 }
252 if(parametros[1] == "compound"){
253 $("#compound").append(div);
254 }
255 });
256 }
257
258 function domains(domain){
259 //get the link parameters
260 space = domain.split("=");
261 workspace = space[1].split("&");
262 workspace = workspace[0];
263 design = space[2].split("&");
264 design = design[0];
265 view = space[3];
266 parametros = [workspace, view, design];
267 return parametros;
268 }
269
270 setTimeout(function() {
271 //order of compound when reload
272 sorter(0);
273 }, 1000);
274 </script>
275 </body>
276 </html>
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
0 <!-- Faraday Penetration Test IDE -->
11 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
22 <!-- See the file 'doc/LICENSE' for the license information -->
33 <!DOCTYPE html>
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
0 <!-- Faraday Penetration Test IDE -->
11 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
22 <!-- See the file 'doc/LICENSE' for the license information -->
33 <!DOCTYPE html>
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
0 <!-- Faraday Penetration Test IDE -->
11 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
22 <!-- See the file 'doc/LICENSE' for the license information -->
33 <!DOCTYPE html>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <!DOCTYPE html>
15 <meta charset="utf-8">
26 <style>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <script type="text/javascript">
15 function get_report_div(workspace, view,design){
26 var arr = [];
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <!DOCTYPE html>
15 <html>
26 <head>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <script type="text/javascript">
15 function htmlentities(string, quote_style, charset, double_encode) {
26 var hash_map = translationtable('HTML_ENTITIES', quote_style), symbol = '';
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <script type="text/javascript" src="script/compound.js"></script>
15 <script type="text/javascript">
26 function htmlentities(string, quote_style, charset, double_encode) {
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <script type="text/javascript">
15 function htmlentities(string, quote_style, charset, double_encode) {
26 var hash_map = translationtable('HTML_ENTITIES', quote_style), symbol = '';
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <script type="text/javascript">
15 function get_report_div(workspace, view,design){
26 json_url = "/" + workspace + "/_design/" + design + "/_view/" + view+"?group=true";
0 /*!
1 * ZeroClipboard
2 * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
3 * Copyright (c) 2014 Jon Rohan, James M. Greene
4 * Licensed MIT
5 * http://zeroclipboard.org/
6 * v2.1.6
7 */
8 !function(a,b){"use strict";var c,d,e=a,f=e.document,g=e.navigator,h=e.setTimeout,i=e.encodeURIComponent,j=e.ActiveXObject,k=e.Error,l=e.Number.parseInt||e.parseInt,m=e.Number.parseFloat||e.parseFloat,n=e.Number.isNaN||e.isNaN,o=e.Math.round,p=e.Date.now,q=e.Object.keys,r=e.Object.defineProperty,s=e.Object.prototype.hasOwnProperty,t=e.Array.prototype.slice,u=function(){var a=function(a){return a};if("function"==typeof e.wrap&&"function"==typeof e.unwrap)try{var b=f.createElement("div"),c=e.unwrap(b);1===b.nodeType&&c&&1===c.nodeType&&(a=e.unwrap)}catch(d){}return a}(),v=function(a){return t.call(a,0)},w=function(){var a,c,d,e,f,g,h=v(arguments),i=h[0]||{};for(a=1,c=h.length;c>a;a++)if(null!=(d=h[a]))for(e in d)s.call(d,e)&&(f=i[e],g=d[e],i!==g&&g!==b&&(i[e]=g));return i},x=function(a){var b,c,d,e;if("object"!=typeof a||null==a)b=a;else if("number"==typeof a.length)for(b=[],c=0,d=a.length;d>c;c++)s.call(a,c)&&(b[c]=x(a[c]));else{b={};for(e in a)s.call(a,e)&&(b[e]=x(a[e]))}return b},y=function(a,b){for(var c={},d=0,e=b.length;e>d;d++)b[d]in a&&(c[b[d]]=a[b[d]]);return c},z=function(a,b){var c={};for(var d in a)-1===b.indexOf(d)&&(c[d]=a[d]);return c},A=function(a){if(a)for(var b in a)s.call(a,b)&&delete a[b];return a},B=function(a,b){if(a&&1===a.nodeType&&a.ownerDocument&&b&&(1===b.nodeType&&b.ownerDocument&&b.ownerDocument===a.ownerDocument||9===b.nodeType&&!b.ownerDocument&&b===a.ownerDocument))do{if(a===b)return!0;a=a.parentNode}while(a);return!1},C=function(a){var b;return"string"==typeof a&&a&&(b=a.split("#")[0].split("?")[0],b=a.slice(0,a.lastIndexOf("/")+1)),b},D=function(a){var b,c;return"string"==typeof a&&a&&(c=a.match(/^(?:|[^:@]*@|.+\)@(?=http[s]?|file)|.+?\s+(?: at |@)(?:[^:\(]+ )*[\(]?)((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/),c&&c[1]?b=c[1]:(c=a.match(/\)@((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/),c&&c[1]&&(b=c[1]))),b},E=function(){var a,b;try{throw new k}catch(c){b=c}return b&&(a=b.sourceURL||b.fileName||D(b.stack)),a},F=function(){var a,c,d;if(f.currentScript&&(a=f.currentScript.src))return a;if(c=f.getElementsByTagName("script"),1===c.length)return c[0].src||b;if("readyState"in c[0])for(d=c.length;d--;)if("interactive"===c[d].readyState&&(a=c[d].src))return a;return"loading"===f.readyState&&(a=c[c.length-1].src)?a:(a=E())?a:b},G=function(){var a,c,d,e=f.getElementsByTagName("script");for(a=e.length;a--;){if(!(d=e[a].src)){c=null;break}if(d=C(d),null==c)c=d;else if(c!==d){c=null;break}}return c||b},H=function(){var a=C(F())||G()||"";return a+"ZeroClipboard.swf"},I={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,unavailable:null,deactivated:null,overdue:null,ready:null},J="11.0.0",K={},L={},M=null,N={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate","flash-overdue":"Flash communication was established but NOT within the acceptable time limit"}},O={swfPath:H(),trustedDomains:a.location.host?[a.location.host]:[],cacheBust:!0,forceEnhancedClipboard:!1,flashLoadTimeout:3e4,autoActivate:!0,bubbleEvents:!0,containerId:"global-zeroclipboard-html-bridge",containerClass:"global-zeroclipboard-container",swfObjectId:"global-zeroclipboard-flash-bridge",hoverClass:"zeroclipboard-is-hover",activeClass:"zeroclipboard-is-active",forceHandCursor:!1,title:null,zIndex:999999999},P=function(a){if("object"==typeof a&&null!==a)for(var b in a)if(s.call(a,b))if(/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(b))O[b]=a[b];else if(null==I.bridge)if("containerId"===b||"swfObjectId"===b){if(!cb(a[b]))throw new Error("The specified `"+b+"` value is not valid as an HTML4 Element ID");O[b]=a[b]}else O[b]=a[b];{if("string"!=typeof a||!a)return x(O);if(s.call(O,a))return O[a]}},Q=function(){return{browser:y(g,["userAgent","platform","appName"]),flash:z(I,["bridge"]),zeroclipboard:{version:Fb.version,config:Fb.config()}}},R=function(){return!!(I.disabled||I.outdated||I.unavailable||I.deactivated)},S=function(a,b){var c,d,e,f={};if("string"==typeof a&&a)e=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)s.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&Fb.on(c,a[c]);if(e&&e.length){for(c=0,d=e.length;d>c;c++)a=e[c].replace(/^on/,""),f[a]=!0,K[a]||(K[a]=[]),K[a].push(b);if(f.ready&&I.ready&&Fb.emit({type:"ready"}),f.error){var g=["disabled","outdated","unavailable","deactivated","overdue"];for(c=0,d=g.length;d>c;c++)if(I[g[c]]===!0){Fb.emit({type:"error",name:"flash-"+g[c]});break}}}return Fb},T=function(a,b){var c,d,e,f,g;if(0===arguments.length)f=q(K);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)s.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&Fb.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),g=K[a],g&&g.length)if(b)for(e=g.indexOf(b);-1!==e;)g.splice(e,1),e=g.indexOf(b,e);else g.length=0;return Fb},U=function(a){var b;return b="string"==typeof a&&a?x(K[a])||null:x(K)},V=function(a){var b,c,d;return a=db(a),a&&!jb(a)?"ready"===a.type&&I.overdue===!0?Fb.emit({type:"error",name:"flash-overdue"}):(b=w({},a),ib.call(this,b),"copy"===a.type&&(d=pb(L),c=d.data,M=d.formatMap),c):void 0},W=function(){if("boolean"!=typeof I.ready&&(I.ready=!1),!Fb.isFlashUnusable()&&null===I.bridge){var a=O.flashLoadTimeout;"number"==typeof a&&a>=0&&h(function(){"boolean"!=typeof I.deactivated&&(I.deactivated=!0),I.deactivated===!0&&Fb.emit({type:"error",name:"flash-deactivated"})},a),I.overdue=!1,nb()}},X=function(){Fb.clearData(),Fb.blur(),Fb.emit("destroy"),ob(),Fb.off()},Y=function(a,b){var c;if("object"==typeof a&&a&&"undefined"==typeof b)c=a,Fb.clearData();else{if("string"!=typeof a||!a)return;c={},c[a]=b}for(var d in c)"string"==typeof d&&d&&s.call(c,d)&&"string"==typeof c[d]&&c[d]&&(L[d]=c[d])},Z=function(a){"undefined"==typeof a?(A(L),M=null):"string"==typeof a&&s.call(L,a)&&delete L[a]},$=function(a){return"undefined"==typeof a?x(L):"string"==typeof a&&s.call(L,a)?L[a]:void 0},_=function(a){if(a&&1===a.nodeType){c&&(xb(c,O.activeClass),c!==a&&xb(c,O.hoverClass)),c=a,wb(a,O.hoverClass);var b=a.getAttribute("title")||O.title;if("string"==typeof b&&b){var d=mb(I.bridge);d&&d.setAttribute("title",b)}var e=O.forceHandCursor===!0||"pointer"===yb(a,"cursor");Cb(e),Bb()}},ab=function(){var a=mb(I.bridge);a&&(a.removeAttribute("title"),a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.top="1px"),c&&(xb(c,O.hoverClass),xb(c,O.activeClass),c=null)},bb=function(){return c||null},cb=function(a){return"string"==typeof a&&a&&/^[A-Za-z][A-Za-z0-9_:\-\.]*$/.test(a)},db=function(a){var b;if("string"==typeof a&&a?(b=a,a={}):"object"==typeof a&&a&&"string"==typeof a.type&&a.type&&(b=a.type),b){!a.target&&/^(copy|aftercopy|_click)$/.test(b.toLowerCase())&&(a.target=d),w(a,{type:b.toLowerCase(),target:a.target||c||null,relatedTarget:a.relatedTarget||null,currentTarget:I&&I.bridge||null,timeStamp:a.timeStamp||p()||null});var e=N[a.type];return"error"===a.type&&a.name&&e&&(e=e[a.name]),e&&(a.message=e),"ready"===a.type&&w(a,{target:null,version:I.version}),"error"===a.type&&(/^flash-(disabled|outdated|unavailable|deactivated|overdue)$/.test(a.name)&&w(a,{target:null,minimumVersion:J}),/^flash-(outdated|unavailable|deactivated|overdue)$/.test(a.name)&&w(a,{version:I.version})),"copy"===a.type&&(a.clipboardData={setData:Fb.setData,clearData:Fb.clearData}),"aftercopy"===a.type&&(a=qb(a,M)),a.target&&!a.relatedTarget&&(a.relatedTarget=eb(a.target)),a=fb(a)}},eb=function(a){var b=a&&a.getAttribute&&a.getAttribute("data-clipboard-target");return b?f.getElementById(b):null},fb=function(a){if(a&&/^_(?:click|mouse(?:over|out|down|up|move))$/.test(a.type)){var c=a.target,d="_mouseover"===a.type&&a.relatedTarget?a.relatedTarget:b,g="_mouseout"===a.type&&a.relatedTarget?a.relatedTarget:b,h=Ab(c),i=e.screenLeft||e.screenX||0,j=e.screenTop||e.screenY||0,k=f.body.scrollLeft+f.documentElement.scrollLeft,l=f.body.scrollTop+f.documentElement.scrollTop,m=h.left+("number"==typeof a._stageX?a._stageX:0),n=h.top+("number"==typeof a._stageY?a._stageY:0),o=m-k,p=n-l,q=i+o,r=j+p,s="number"==typeof a.movementX?a.movementX:0,t="number"==typeof a.movementY?a.movementY:0;delete a._stageX,delete a._stageY,w(a,{srcElement:c,fromElement:d,toElement:g,screenX:q,screenY:r,pageX:m,pageY:n,clientX:o,clientY:p,x:o,y:p,movementX:s,movementY:t,offsetX:0,offsetY:0,layerX:0,layerY:0})}return a},gb=function(a){var b=a&&"string"==typeof a.type&&a.type||"";return!/^(?:(?:before)?copy|destroy)$/.test(b)},hb=function(a,b,c,d){d?h(function(){a.apply(b,c)},0):a.apply(b,c)},ib=function(a){if("object"==typeof a&&a&&a.type){var b=gb(a),c=K["*"]||[],d=K[a.type]||[],f=c.concat(d);if(f&&f.length){var g,h,i,j,k,l=this;for(g=0,h=f.length;h>g;g++)i=f[g],j=l,"string"==typeof i&&"function"==typeof e[i]&&(i=e[i]),"object"==typeof i&&i&&"function"==typeof i.handleEvent&&(j=i,i=i.handleEvent),"function"==typeof i&&(k=w({},a),hb(i,j,[k],b))}return this}},jb=function(a){var b=a.target||c||null,e="swf"===a._source;delete a._source;var f=["flash-disabled","flash-outdated","flash-unavailable","flash-deactivated","flash-overdue"];switch(a.type){case"error":-1!==f.indexOf(a.name)&&w(I,{disabled:"flash-disabled"===a.name,outdated:"flash-outdated"===a.name,unavailable:"flash-unavailable"===a.name,deactivated:"flash-deactivated"===a.name,overdue:"flash-overdue"===a.name,ready:!1});break;case"ready":var g=I.deactivated===!0;w(I,{disabled:!1,outdated:!1,unavailable:!1,deactivated:!1,overdue:g,ready:!g});break;case"beforecopy":d=b;break;case"copy":var h,i,j=a.relatedTarget;!L["text/html"]&&!L["text/plain"]&&j&&(i=j.value||j.outerHTML||j.innerHTML)&&(h=j.value||j.textContent||j.innerText)?(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",h),i!==h&&a.clipboardData.setData("text/html",i)):!L["text/plain"]&&a.target&&(h=a.target.getAttribute("data-clipboard-text"))&&(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",h));break;case"aftercopy":Fb.clearData(),b&&b!==vb()&&b.focus&&b.focus();break;case"_mouseover":Fb.focus(b),O.bubbleEvents===!0&&e&&(b&&b!==a.relatedTarget&&!B(a.relatedTarget,b)&&kb(w({},a,{type:"mouseenter",bubbles:!1,cancelable:!1})),kb(w({},a,{type:"mouseover"})));break;case"_mouseout":Fb.blur(),O.bubbleEvents===!0&&e&&(b&&b!==a.relatedTarget&&!B(a.relatedTarget,b)&&kb(w({},a,{type:"mouseleave",bubbles:!1,cancelable:!1})),kb(w({},a,{type:"mouseout"})));break;case"_mousedown":wb(b,O.activeClass),O.bubbleEvents===!0&&e&&kb(w({},a,{type:a.type.slice(1)}));break;case"_mouseup":xb(b,O.activeClass),O.bubbleEvents===!0&&e&&kb(w({},a,{type:a.type.slice(1)}));break;case"_click":d=null,O.bubbleEvents===!0&&e&&kb(w({},a,{type:a.type.slice(1)}));break;case"_mousemove":O.bubbleEvents===!0&&e&&kb(w({},a,{type:a.type.slice(1)}))}return/^_(?:click|mouse(?:over|out|down|up|move))$/.test(a.type)?!0:void 0},kb=function(a){if(a&&"string"==typeof a.type&&a){var b,c=a.target||null,d=c&&c.ownerDocument||f,g={view:d.defaultView||e,canBubble:!0,cancelable:!0,detail:"click"===a.type?1:0,button:"number"==typeof a.which?a.which-1:"number"==typeof a.button?a.button:d.createEvent?0:1},h=w(g,a);c&&d.createEvent&&c.dispatchEvent&&(h=[h.type,h.canBubble,h.cancelable,h.view,h.detail,h.screenX,h.screenY,h.clientX,h.clientY,h.ctrlKey,h.altKey,h.shiftKey,h.metaKey,h.button,h.relatedTarget],b=d.createEvent("MouseEvents"),b.initMouseEvent&&(b.initMouseEvent.apply(b,h),b._source="js",c.dispatchEvent(b)))}},lb=function(){var a=f.createElement("div");return a.id=O.containerId,a.className=O.containerClass,a.style.position="absolute",a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px",a.style.zIndex=""+Db(O.zIndex),a},mb=function(a){for(var b=a&&a.parentNode;b&&"OBJECT"===b.nodeName&&b.parentNode;)b=b.parentNode;return b||null},nb=function(){var a,b=I.bridge,c=mb(b);if(!b){var d=ub(e.location.host,O),g="never"===d?"none":"all",h=sb(O),i=O.swfPath+rb(O.swfPath,O);c=lb();var j=f.createElement("div");c.appendChild(j),f.body.appendChild(c);var k=f.createElement("div"),l="activex"===I.pluginType;k.innerHTML='<object id="'+O.swfObjectId+'" name="'+O.swfObjectId+'" width="100%" height="100%" '+(l?'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"':'type="application/x-shockwave-flash" data="'+i+'"')+">"+(l?'<param name="movie" value="'+i+'"/>':"")+'<param name="allowScriptAccess" value="'+d+'"/><param name="allowNetworking" value="'+g+'"/><param name="menu" value="false"/><param name="wmode" value="transparent"/><param name="flashvars" value="'+h+'"/></object>',b=k.firstChild,k=null,u(b).ZeroClipboard=Fb,c.replaceChild(b,j)}return b||(b=f[O.swfObjectId],b&&(a=b.length)&&(b=b[a-1]),!b&&c&&(b=c.firstChild)),I.bridge=b||null,b},ob=function(){var a=I.bridge;if(a){var b=mb(a);b&&("activex"===I.pluginType&&"readyState"in a?(a.style.display="none",function c(){if(4===a.readyState){for(var d in a)"function"==typeof a[d]&&(a[d]=null);a.parentNode&&a.parentNode.removeChild(a),b.parentNode&&b.parentNode.removeChild(b)}else h(c,10)}()):(a.parentNode&&a.parentNode.removeChild(a),b.parentNode&&b.parentNode.removeChild(b))),I.ready=null,I.bridge=null,I.deactivated=null}},pb=function(a){var b={},c={};if("object"==typeof a&&a){for(var d in a)if(d&&s.call(a,d)&&"string"==typeof a[d]&&a[d])switch(d.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":b.text=a[d],c.text=d;break;case"text/html":case"html":case"air:html":case"flash:html":b.html=a[d],c.html=d;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":b.rtf=a[d],c.rtf=d}return{data:b,formatMap:c}}},qb=function(a,b){if("object"!=typeof a||!a||"object"!=typeof b||!b)return a;var c={};for(var d in a)if(s.call(a,d)){if("success"!==d&&"data"!==d){c[d]=a[d];continue}c[d]={};var e=a[d];for(var f in e)f&&s.call(e,f)&&s.call(b,f)&&(c[d][b[f]]=e[f])}return c},rb=function(a,b){var c=null==b||b&&b.cacheBust===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+p():""},sb=function(a){var b,c,d,f,g="",h=[];if(a.trustedDomains&&("string"==typeof a.trustedDomains?f=[a.trustedDomains]:"object"==typeof a.trustedDomains&&"length"in a.trustedDomains&&(f=a.trustedDomains)),f&&f.length)for(b=0,c=f.length;c>b;b++)if(s.call(f,b)&&f[b]&&"string"==typeof f[b]){if(d=tb(f[b]),!d)continue;if("*"===d){h.length=0,h.push(d);break}h.push.apply(h,[d,"//"+d,e.location.protocol+"//"+d])}return h.length&&(g+="trustedOrigins="+i(h.join(","))),a.forceEnhancedClipboard===!0&&(g+=(g?"&":"")+"forceEnhancedClipboard=true"),"string"==typeof a.swfObjectId&&a.swfObjectId&&(g+=(g?"&":"")+"swfObjectId="+i(a.swfObjectId)),g},tb=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},ub=function(){var a=function(a){var b,c,d,e=[];if("string"==typeof a&&(a=[a]),"object"!=typeof a||!a||"number"!=typeof a.length)return e;for(b=0,c=a.length;c>b;b++)if(s.call(a,b)&&(d=tb(a[b]))){if("*"===d){e.length=0,e.push("*");break}-1===e.indexOf(d)&&e.push(d)}return e};return function(b,c){var d=tb(c.swfPath);null===d&&(d=b);var e=a(c.trustedDomains),f=e.length;if(f>0){if(1===f&&"*"===e[0])return"always";if(-1!==e.indexOf(b))return 1===f&&b===d?"sameDomain":"always"}return"never"}}(),vb=function(){try{return f.activeElement}catch(a){return null}},wb=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)||a.classList.add(b),a;if(b&&"string"==typeof b){var c=(b||"").split(/\s+/);if(1===a.nodeType)if(a.className){for(var d=" "+a.className+" ",e=a.className,f=0,g=c.length;g>f;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}else a.className=b}return a},xb=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)&&a.classList.remove(b),a;if("string"==typeof b&&b){var c=b.split(/\s+/);if(1===a.nodeType&&a.className){for(var d=(" "+a.className+" ").replace(/[\n\t]/g," "),e=0,f=c.length;f>e;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}}return a},yb=function(a,b){var c=e.getComputedStyle(a,null).getPropertyValue(b);return"cursor"!==b||c&&"auto"!==c||"A"!==a.nodeName?c:"pointer"},zb=function(){var a,b,c,d=1;return"function"==typeof f.body.getBoundingClientRect&&(a=f.body.getBoundingClientRect(),b=a.right-a.left,c=f.body.offsetWidth,d=o(b/c*100)/100),d},Ab=function(a){var b={left:0,top:0,width:0,height:0};if(a.getBoundingClientRect){var c,d,g,h=a.getBoundingClientRect();"pageXOffset"in e&&"pageYOffset"in e?(c=e.pageXOffset,d=e.pageYOffset):(g=zb(),c=o(f.documentElement.scrollLeft/g),d=o(f.documentElement.scrollTop/g));var i=f.documentElement.clientLeft||0,j=f.documentElement.clientTop||0;b.left=h.left+c-i,b.top=h.top+d-j,b.width="width"in h?h.width:h.right-h.left,b.height="height"in h?h.height:h.bottom-h.top}return b},Bb=function(){var a;if(c&&(a=mb(I.bridge))){var b=Ab(c);w(a.style,{width:b.width+"px",height:b.height+"px",top:b.top+"px",left:b.left+"px",zIndex:""+Db(O.zIndex)})}},Cb=function(a){I.ready===!0&&(I.bridge&&"function"==typeof I.bridge.setHandCursor?I.bridge.setHandCursor(a):I.ready=!1)},Db=function(a){if(/^(?:auto|inherit)$/.test(a))return a;var b;return"number"!=typeof a||n(a)?"string"==typeof a&&(b=Db(l(a,10))):b=a,"number"==typeof b?b:"auto"},Eb=function(a){function b(a){var b=a.match(/[\d]+/g);return b.length=3,b.join(".")}function c(a){return!!a&&(a=a.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(a)||"chrome.plugin"===a.slice(-13))}function d(a){a&&(i=!0,a.version&&(l=b(a.version)),!l&&a.description&&(l=b(a.description)),a.filename&&(k=c(a.filename)))}var e,f,h,i=!1,j=!1,k=!1,l="";if(g.plugins&&g.plugins.length)e=g.plugins["Shockwave Flash"],d(e),g.plugins["Shockwave Flash 2.0"]&&(i=!0,l="2.0.0.11");else if(g.mimeTypes&&g.mimeTypes.length)h=g.mimeTypes["application/x-shockwave-flash"],e=h&&h.enabledPlugin,d(e);else if("undefined"!=typeof a){j=!0;try{f=new a("ShockwaveFlash.ShockwaveFlash.7"),i=!0,l=b(f.GetVariable("$version"))}catch(n){try{f=new a("ShockwaveFlash.ShockwaveFlash.6"),i=!0,l="6.0.21"}catch(o){try{f=new a("ShockwaveFlash.ShockwaveFlash"),i=!0,l=b(f.GetVariable("$version"))}catch(p){j=!1}}}}I.disabled=i!==!0,I.outdated=l&&m(l)<m(J),I.version=l||"0.0.0",I.pluginType=k?"pepper":j?"activex":i?"netscape":"unknown"};Eb(j);var Fb=function(){return this instanceof Fb?void("function"==typeof Fb._createClient&&Fb._createClient.apply(this,v(arguments))):new Fb};r(Fb,"version",{value:"2.1.6",writable:!1,configurable:!0,enumerable:!0}),Fb.config=function(){return P.apply(this,v(arguments))},Fb.state=function(){return Q.apply(this,v(arguments))},Fb.isFlashUnusable=function(){return R.apply(this,v(arguments))},Fb.on=function(){return S.apply(this,v(arguments))},Fb.off=function(){return T.apply(this,v(arguments))},Fb.handlers=function(){return U.apply(this,v(arguments))},Fb.emit=function(){return V.apply(this,v(arguments))},Fb.create=function(){return W.apply(this,v(arguments))},Fb.destroy=function(){return X.apply(this,v(arguments))},Fb.setData=function(){return Y.apply(this,v(arguments))},Fb.clearData=function(){return Z.apply(this,v(arguments))},Fb.getData=function(){return $.apply(this,v(arguments))},Fb.focus=Fb.activate=function(){return _.apply(this,v(arguments))},Fb.blur=Fb.deactivate=function(){return ab.apply(this,v(arguments))},Fb.activeElement=function(){return bb.apply(this,v(arguments))};var Gb=0,Hb={},Ib=0,Jb={},Kb={};w(O,{autoActivate:!0});var Lb=function(a){var b=this;b.id=""+Gb++,Hb[b.id]={instance:b,elements:[],handlers:{}},a&&b.clip(a),Fb.on("*",function(a){return b.emit(a)}),Fb.on("destroy",function(){b.destroy()}),Fb.create()},Mb=function(a,b){var c,d,e,f={},g=Hb[this.id]&&Hb[this.id].handlers;if("string"==typeof a&&a)e=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)s.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.on(c,a[c]);if(e&&e.length){for(c=0,d=e.length;d>c;c++)a=e[c].replace(/^on/,""),f[a]=!0,g[a]||(g[a]=[]),g[a].push(b);if(f.ready&&I.ready&&this.emit({type:"ready",client:this}),f.error){var h=["disabled","outdated","unavailable","deactivated","overdue"];for(c=0,d=h.length;d>c;c++)if(I[h[c]]){this.emit({type:"error",name:"flash-"+h[c],client:this});break}}}return this},Nb=function(a,b){var c,d,e,f,g,h=Hb[this.id]&&Hb[this.id].handlers;if(0===arguments.length)f=q(h);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)s.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),g=h[a],g&&g.length)if(b)for(e=g.indexOf(b);-1!==e;)g.splice(e,1),e=g.indexOf(b,e);else g.length=0;return this},Ob=function(a){var b=null,c=Hb[this.id]&&Hb[this.id].handlers;return c&&(b="string"==typeof a&&a?c[a]?c[a].slice(0):[]:x(c)),b},Pb=function(a){if(Ub.call(this,a)){"object"==typeof a&&a&&"string"==typeof a.type&&a.type&&(a=w({},a));var b=w({},db(a),{client:this});Vb.call(this,b)}return this},Qb=function(a){a=Wb(a);for(var b=0;b<a.length;b++)if(s.call(a,b)&&a[b]&&1===a[b].nodeType){a[b].zcClippingId?-1===Jb[a[b].zcClippingId].indexOf(this.id)&&Jb[a[b].zcClippingId].push(this.id):(a[b].zcClippingId="zcClippingId_"+Ib++,Jb[a[b].zcClippingId]=[this.id],O.autoActivate===!0&&Xb(a[b]));var c=Hb[this.id]&&Hb[this.id].elements;-1===c.indexOf(a[b])&&c.push(a[b])}return this},Rb=function(a){var b=Hb[this.id];if(!b)return this;var c,d=b.elements;a="undefined"==typeof a?d.slice(0):Wb(a);for(var e=a.length;e--;)if(s.call(a,e)&&a[e]&&1===a[e].nodeType){for(c=0;-1!==(c=d.indexOf(a[e],c));)d.splice(c,1);var f=Jb[a[e].zcClippingId];if(f){for(c=0;-1!==(c=f.indexOf(this.id,c));)f.splice(c,1);0===f.length&&(O.autoActivate===!0&&Yb(a[e]),delete a[e].zcClippingId)}}return this},Sb=function(){var a=Hb[this.id];return a&&a.elements?a.elements.slice(0):[]},Tb=function(){this.unclip(),this.off(),delete Hb[this.id]},Ub=function(a){if(!a||!a.type)return!1;if(a.client&&a.client!==this)return!1;var b=Hb[this.id]&&Hb[this.id].elements,c=!!b&&b.length>0,d=!a.target||c&&-1!==b.indexOf(a.target),e=a.relatedTarget&&c&&-1!==b.indexOf(a.relatedTarget),f=a.client&&a.client===this;return d||e||f?!0:!1},Vb=function(a){if("object"==typeof a&&a&&a.type){var b=gb(a),c=Hb[this.id]&&Hb[this.id].handlers["*"]||[],d=Hb[this.id]&&Hb[this.id].handlers[a.type]||[],f=c.concat(d);if(f&&f.length){var g,h,i,j,k,l=this;for(g=0,h=f.length;h>g;g++)i=f[g],j=l,"string"==typeof i&&"function"==typeof e[i]&&(i=e[i]),"object"==typeof i&&i&&"function"==typeof i.handleEvent&&(j=i,i=i.handleEvent),"function"==typeof i&&(k=w({},a),hb(i,j,[k],b))}return this}},Wb=function(a){return"string"==typeof a&&(a=[]),"number"!=typeof a.length?[a]:a},Xb=function(a){if(a&&1===a.nodeType){var b=function(a){(a||(a=e.event))&&("js"!==a._source&&(a.stopImmediatePropagation(),a.preventDefault()),delete a._source)},c=function(c){(c||(c=e.event))&&(b(c),Fb.focus(a))};a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",b,!1),a.addEventListener("mouseenter",b,!1),a.addEventListener("mouseleave",b,!1),a.addEventListener("mousemove",b,!1),Kb[a.zcClippingId]={mouseover:c,mouseout:b,mouseenter:b,mouseleave:b,mousemove:b}}},Yb=function(a){if(a&&1===a.nodeType){var b=Kb[a.zcClippingId];if("object"==typeof b&&b){for(var c,d,e=["move","leave","enter","out","over"],f=0,g=e.length;g>f;f++)c="mouse"+e[f],d=b[c],"function"==typeof d&&a.removeEventListener(c,d,!1);delete Kb[a.zcClippingId]}}};Fb._createClient=function(){Lb.apply(this,v(arguments))},Fb.prototype.on=function(){return Mb.apply(this,v(arguments))},Fb.prototype.off=function(){return Nb.apply(this,v(arguments))},Fb.prototype.handlers=function(){return Ob.apply(this,v(arguments))},Fb.prototype.emit=function(){return Pb.apply(this,v(arguments))},Fb.prototype.clip=function(){return Qb.apply(this,v(arguments))},Fb.prototype.unclip=function(){return Rb.apply(this,v(arguments))},Fb.prototype.elements=function(){return Sb.apply(this,v(arguments))},Fb.prototype.destroy=function(){return Tb.apply(this,v(arguments))},Fb.prototype.setText=function(a){return Fb.setData("text/plain",a),this},Fb.prototype.setHtml=function(a){return Fb.setData("text/html",a),this},Fb.prototype.setRichText=function(a){return Fb.setData("application/rtf",a),this},Fb.prototype.setData=function(){return Fb.setData.apply(this,v(arguments)),this},Fb.prototype.clearData=function(){return Fb.clearData.apply(this,v(arguments)),this},Fb.prototype.getData=function(){return Fb.getData.apply(this,v(arguments))},"function"==typeof define&&define.amd?define(function(){return Fb}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=Fb:a.ZeroClipboard=Fb}(function(){return this||window}());
0 /**
1 * @license AngularJS v1.2.23
2 * (c) 2010-2014 Google, Inc. http://angularjs.org
3 * License: MIT
4 */
5 (function(window, angular, undefined) {'use strict';
6
7 /**
8 * @ngdoc module
9 * @name ngCookies
10 * @description
11 *
12 * # ngCookies
13 *
14 * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
15 *
16 *
17 * <div doc-module-components="ngCookies"></div>
18 *
19 * See {@link ngCookies.$cookies `$cookies`} and
20 * {@link ngCookies.$cookieStore `$cookieStore`} for usage.
21 */
22
23
24 angular.module('ngCookies', ['ng']).
25 /**
26 * @ngdoc service
27 * @name $cookies
28 *
29 * @description
30 * Provides read/write access to browser's cookies.
31 *
32 * Only a simple Object is exposed and by adding or removing properties to/from this object, new
33 * cookies are created/deleted at the end of current $eval.
34 * The object's properties can only be strings.
35 *
36 * Requires the {@link ngCookies `ngCookies`} module to be installed.
37 *
38 * @example
39 *
40 * ```js
41 * angular.module('cookiesExample', ['ngCookies'])
42 * .controller('ExampleController', ['$cookies', function($cookies) {
43 * // Retrieving a cookie
44 * var favoriteCookie = $cookies.myFavorite;
45 * // Setting a cookie
46 * $cookies.myFavorite = 'oatmeal';
47 * }]);
48 * ```
49 */
50 factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
51 var cookies = {},
52 lastCookies = {},
53 lastBrowserCookies,
54 runEval = false,
55 copy = angular.copy,
56 isUndefined = angular.isUndefined;
57
58 //creates a poller fn that copies all cookies from the $browser to service & inits the service
59 $browser.addPollFn(function() {
60 var currentCookies = $browser.cookies();
61 if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
62 lastBrowserCookies = currentCookies;
63 copy(currentCookies, lastCookies);
64 copy(currentCookies, cookies);
65 if (runEval) $rootScope.$apply();
66 }
67 })();
68
69 runEval = true;
70
71 //at the end of each eval, push cookies
72 //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
73 // strings or browser refuses to store some cookies, we update the model in the push fn.
74 $rootScope.$watch(push);
75
76 return cookies;
77
78
79 /**
80 * Pushes all the cookies from the service to the browser and verifies if all cookies were
81 * stored.
82 */
83 function push() {
84 var name,
85 value,
86 browserCookies,
87 updated;
88
89 //delete any cookies deleted in $cookies
90 for (name in lastCookies) {
91 if (isUndefined(cookies[name])) {
92 $browser.cookies(name, undefined);
93 }
94 }
95
96 //update all cookies updated in $cookies
97 for(name in cookies) {
98 value = cookies[name];
99 if (!angular.isString(value)) {
100 value = '' + value;
101 cookies[name] = value;
102 }
103 if (value !== lastCookies[name]) {
104 $browser.cookies(name, value);
105 updated = true;
106 }
107 }
108
109 //verify what was actually stored
110 if (updated){
111 updated = false;
112 browserCookies = $browser.cookies();
113
114 for (name in cookies) {
115 if (cookies[name] !== browserCookies[name]) {
116 //delete or reset all cookies that the browser dropped from $cookies
117 if (isUndefined(browserCookies[name])) {
118 delete cookies[name];
119 } else {
120 cookies[name] = browserCookies[name];
121 }
122 updated = true;
123 }
124 }
125 }
126 }
127 }]).
128
129
130 /**
131 * @ngdoc service
132 * @name $cookieStore
133 * @requires $cookies
134 *
135 * @description
136 * Provides a key-value (string-object) storage, that is backed by session cookies.
137 * Objects put or retrieved from this storage are automatically serialized or
138 * deserialized by angular's toJson/fromJson.
139 *
140 * Requires the {@link ngCookies `ngCookies`} module to be installed.
141 *
142 * @example
143 *
144 * ```js
145 * angular.module('cookieStoreExample', ['ngCookies'])
146 * .controller('ExampleController', ['$cookieStore', function($cookieStore) {
147 * // Put cookie
148 * $cookieStore.put('myFavorite','oatmeal');
149 * // Get cookie
150 * var favoriteCookie = $cookieStore.get('myFavorite');
151 * // Removing a cookie
152 * $cookieStore.remove('myFavorite');
153 * }]);
154 * ```
155 */
156 factory('$cookieStore', ['$cookies', function($cookies) {
157
158 return {
159 /**
160 * @ngdoc method
161 * @name $cookieStore#get
162 *
163 * @description
164 * Returns the value of given cookie key
165 *
166 * @param {string} key Id to use for lookup.
167 * @returns {Object} Deserialized cookie value.
168 */
169 get: function(key) {
170 var value = $cookies[key];
171 return value ? angular.fromJson(value) : value;
172 },
173
174 /**
175 * @ngdoc method
176 * @name $cookieStore#put
177 *
178 * @description
179 * Sets a value for given cookie key
180 *
181 * @param {string} key Id for the `value`.
182 * @param {Object} value Value to be stored.
183 */
184 put: function(key, value) {
185 $cookies[key] = angular.toJson(value);
186 },
187
188 /**
189 * @ngdoc method
190 * @name $cookieStore#remove
191 *
192 * @description
193 * Remove given cookie
194 *
195 * @param {string} key Id of the key-value pair to delete.
196 */
197 remove: function(key) {
198 delete $cookies[key];
199 }
200 };
201
202 }]);
203
204
205 })(window, window.angular);
0 /**!
1 * AngularJS file upload/drop directive with progress and abort
2 * FileAPI Flash shim for old browsers not supporting FormData
3 * @author Danial <[email protected]>
4 * @version 2.1.1
5 */
6
7 (function() {
8
9 var hasFlash = function() {
10 try {
11 var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
12 if (fo) return true;
13 } catch(e) {
14 if (navigator.mimeTypes['application/x-shockwave-flash'] != undefined) return true;
15 }
16 return false;
17 }
18
19 function patchXHR(fnName, newFn) {
20 window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
21 };
22
23 if ((window.XMLHttpRequest && !window.FormData) || (window.FileAPI && FileAPI.forceLoad)) {
24 var initializeUploadListener = function(xhr) {
25 if (!xhr.__listeners) {
26 if (!xhr.upload) xhr.upload = {};
27 xhr.__listeners = [];
28 var origAddEventListener = xhr.upload.addEventListener;
29 xhr.upload.addEventListener = function(t, fn, b) {
30 xhr.__listeners[t] = fn;
31 origAddEventListener && origAddEventListener.apply(this, arguments);
32 };
33 }
34 }
35
36 patchXHR('open', function(orig) {
37 return function(m, url, b) {
38 initializeUploadListener(this);
39 this.__url = url;
40 try {
41 orig.apply(this, [m, url, b]);
42 } catch (e) {
43 if (e.message.indexOf('Access is denied') > -1) {
44 orig.apply(this, [m, '_fix_for_ie_crossdomain__', b]);
45 }
46 }
47 }
48 });
49
50 patchXHR('getResponseHeader', function(orig) {
51 return function(h) {
52 return this.__fileApiXHR && this.__fileApiXHR.getResponseHeader ? this.__fileApiXHR.getResponseHeader(h) : (orig == null ? null : orig.apply(this, [h]));
53 };
54 });
55
56 patchXHR('getAllResponseHeaders', function(orig) {
57 return function() {
58 return this.__fileApiXHR && this.__fileApiXHR.getAllResponseHeaders ? this.__fileApiXHR.getAllResponseHeaders() : (orig == null ? null : orig.apply(this));
59 }
60 });
61
62 patchXHR('abort', function(orig) {
63 return function() {
64 return this.__fileApiXHR && this.__fileApiXHR.abort ? this.__fileApiXHR.abort() : (orig == null ? null : orig.apply(this));
65 }
66 });
67
68 patchXHR('setRequestHeader', function(orig) {
69 return function(header, value) {
70 if (header === '__setXHR_') {
71 initializeUploadListener(this);
72 var val = value(this);
73 // fix for angular < 1.2.0
74 if (val instanceof Function) {
75 val(this);
76 }
77 } else {
78 this.__requestHeaders = this.__requestHeaders || {};
79 this.__requestHeaders[header] = value;
80 orig.apply(this, arguments);
81 }
82 }
83 });
84
85 function redefineProp(xhr, prop, fn) {
86 try {
87 Object.defineProperty(xhr, prop, {get: fn});
88 } catch (e) {/*ignore*/}
89 }
90
91 patchXHR('send', function(orig) {
92 return function() {
93 var xhr = this;
94 if (arguments[0] && arguments[0].__isFileAPIShim) {
95 var formData = arguments[0];
96 var config = {
97 url: xhr.__url,
98 jsonp: false, //removes the callback form param
99 cache: true, //removes the ?fileapiXXX in the url
100 complete: function(err, fileApiXHR) {
101 xhr.__completed = true;
102 if (!err && xhr.__listeners['load'])
103 xhr.__listeners['load']({type: 'load', loaded: xhr.__loaded, total: xhr.__total, target: xhr, lengthComputable: true});
104 if (!err && xhr.__listeners['loadend'])
105 xhr.__listeners['loadend']({type: 'loadend', loaded: xhr.__loaded, total: xhr.__total, target: xhr, lengthComputable: true});
106 if (err === 'abort' && xhr.__listeners['abort'])
107 xhr.__listeners['abort']({type: 'abort', loaded: xhr.__loaded, total: xhr.__total, target: xhr, lengthComputable: true});
108 if (fileApiXHR.status !== undefined) redefineProp(xhr, 'status', function() {return (fileApiXHR.status == 0 && err && err !== 'abort') ? 500 : fileApiXHR.status});
109 if (fileApiXHR.statusText !== undefined) redefineProp(xhr, 'statusText', function() {return fileApiXHR.statusText});
110 redefineProp(xhr, 'readyState', function() {return 4});
111 if (fileApiXHR.response !== undefined) redefineProp(xhr, 'response', function() {return fileApiXHR.response});
112 var resp = fileApiXHR.responseText || (err && fileApiXHR.status == 0 && err !== 'abort' ? err : undefined);
113 redefineProp(xhr, 'responseText', function() {return resp});
114 redefineProp(xhr, 'response', function() {return resp});
115 if (err) redefineProp(xhr, 'err', function() {return err});
116 xhr.__fileApiXHR = fileApiXHR;
117 if (xhr.onreadystatechange) xhr.onreadystatechange();
118 if (xhr.onload) xhr.onload();
119 },
120 fileprogress: function(e) {
121 e.target = xhr;
122 xhr.__listeners['progress'] && xhr.__listeners['progress'](e);
123 xhr.__total = e.total;
124 xhr.__loaded = e.loaded;
125 if (e.total === e.loaded) {
126 // fix flash issue that doesn't call complete if there is no response text from the server
127 var _this = this
128 setTimeout(function() {
129 if (!xhr.__completed) {
130 xhr.getAllResponseHeaders = function(){};
131 _this.complete(null, {status: 204, statusText: 'No Content'});
132 }
133 }, 10000);
134 }
135 },
136 headers: xhr.__requestHeaders
137 }
138 config.data = {};
139 config.files = {}
140 for (var i = 0; i < formData.data.length; i++) {
141 var item = formData.data[i];
142 if (item.val != null && item.val.name != null && item.val.size != null && item.val.type != null) {
143 config.files[item.key] = item.val;
144 } else {
145 config.data[item.key] = item.val;
146 }
147 }
148
149 setTimeout(function() {
150 if (!hasFlash()) {
151 throw 'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';
152 }
153 xhr.__fileApiXHR = FileAPI.upload(config);
154 }, 1);
155 } else {
156 orig.apply(xhr, arguments);
157 }
158 }
159 });
160 window.XMLHttpRequest.__isFileAPIShim = true;
161
162 var addFlash = function(elem) {
163 if (!hasFlash()) {
164 throw 'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';
165 }
166 var el = angular.element(elem);
167 if (!el.attr('disabled')) {
168 if (!el.hasClass('js-fileapi-wrapper') && (el.attr('ng-file-select') != null || el.attr('data-ng-file-select') != null ||
169 (el.attr('ng-file-generated-elem') &&
170 (el.parent().attr('ng-file-select') != null || el.parent().attr('data-ng-file-select') != null)))) {
171 if (FileAPI.wrapInsideDiv) {
172 var wrap = document.createElement('div');
173 wrap.innerHTML = '<div class="js-fileapi-wrapper" style="position:relative; overflow:hidden"></div>';
174 wrap = wrap.firstChild;
175 var parent = elem.parentNode;
176 parent.insertBefore(wrap, elem);
177 parent.removeChild(elem);
178 wrap.appendChild(elem);
179 } else {
180 el.addClass('js-fileapi-wrapper');
181 if (el.attr('ng-file-generated-elem')) {
182 if (el.parent().css('position') === '' || el.parent().css('position') === 'static') {
183 el.parent().css('position', 'relative');
184 }
185 el.css('top', 0).css('bottom', 0).css('left', 0).css('right', 0).css('width', '100%').css('height', '100%').
186 css('padding', 0).css('margin', 0);
187 el.parent().unbind('click', el.parent().__afu_fileClickDelegate__);
188 }
189 }
190 }
191 }
192 };
193 var changeFnWrapper = function(fn) {
194 return function(evt) {
195 var files = FileAPI.getFiles(evt);
196 //just a double check for #233
197 for (var i = 0; i < files.length; i++) {
198 if (files[i].size === undefined) files[i].size = 0;
199 if (files[i].name === undefined) files[i].name = 'file';
200 if (files[i].type === undefined) files[i].type = 'undefined';
201 }
202 if (!evt.target) {
203 evt.target = {};
204 }
205 evt.target.files = files;
206 // if evt.target.files is not writable use helper field
207 if (evt.target.files != files) {
208 evt.__files_ = files;
209 }
210 (evt.__files_ || evt.target.files).item = function(i) {
211 return (evt.__files_ || evt.target.files)[i] || null;
212 }
213 if (fn) fn.apply(this, [evt]);
214 };
215 };
216 var isFileChange = function(elem, e) {
217 return (e.toLowerCase() === 'change' || e.toLowerCase() === 'onchange') && elem.getAttribute('type') == 'file';
218 }
219 if (HTMLInputElement.prototype.addEventListener) {
220 HTMLInputElement.prototype.addEventListener = (function(origAddEventListener) {
221 return function(e, fn, b, d) {
222 if (isFileChange(this, e)) {
223 addFlash(this);
224 origAddEventListener.apply(this, [e, changeFnWrapper(fn), b, d]);
225 } else {
226 origAddEventListener.apply(this, [e, fn, b, d]);
227 }
228 }
229 })(HTMLInputElement.prototype.addEventListener);
230 }
231 if (HTMLInputElement.prototype.attachEvent) {
232 HTMLInputElement.prototype.attachEvent = (function(origAttachEvent) {
233 return function(e, fn) {
234 if (isFileChange(this, e)) {
235 addFlash(this);
236 if (window.jQuery) {
237 // fix for #281 jQuery on IE8
238 angular.element(this).bind('change', changeFnWrapper(null));
239 } else {
240 origAttachEvent.apply(this, [e, changeFnWrapper(fn)]);
241 }
242 } else {
243 origAttachEvent.apply(this, [e, fn]);
244 }
245 }
246 })(HTMLInputElement.prototype.attachEvent);
247 }
248
249 window.FormData = FormData = function() {
250 return {
251 append: function(key, val, name) {
252 this.data.push({
253 key: key,
254 val: val,
255 name: name
256 });
257 },
258 data: [],
259 __isFileAPIShim: true
260 };
261 };
262
263 (function () {
264 //load FileAPI
265 if (!window.FileAPI) {
266 window.FileAPI = {};
267 }
268 if (FileAPI.forceLoad) {
269 FileAPI.html5 = false;
270 }
271
272 if (!FileAPI.upload) {
273 var jsUrl, basePath, script = document.createElement('script'), allScripts = document.getElementsByTagName('script'), i, index, src;
274 if (window.FileAPI.jsUrl) {
275 jsUrl = window.FileAPI.jsUrl;
276 } else if (window.FileAPI.jsPath) {
277 basePath = window.FileAPI.jsPath;
278 } else {
279 for (i = 0; i < allScripts.length; i++) {
280 src = allScripts[i].src;
281 index = src.search(/\/angular\-file\-upload[\-a-zA-z0-9\.]*\.js/)
282 if (index > -1) {
283 basePath = src.substring(0, index + 1);
284 break;
285 }
286 }
287 }
288
289 if (FileAPI.staticPath == null) FileAPI.staticPath = basePath;
290 script.setAttribute('src', jsUrl || basePath + 'FileAPI.min.js');
291 document.getElementsByTagName('head')[0].appendChild(script);
292 FileAPI.hasFlash = hasFlash();
293 }
294 })();
295 FileAPI.disableFileInput = function(elem, disable) {
296 if (disable) {
297 elem.removeClass('js-fileapi-wrapper')
298 } else {
299 elem.addClass('js-fileapi-wrapper');
300 }
301 }
302 }
303
304
305 if (!window.FileReader) {
306 window.FileReader = function() {
307 var _this = this, loadStarted = false;
308 this.listeners = {};
309 this.addEventListener = function(type, fn) {
310 _this.listeners[type] = _this.listeners[type] || [];
311 _this.listeners[type].push(fn);
312 };
313 this.removeEventListener = function(type, fn) {
314 _this.listeners[type] && _this.listeners[type].splice(_this.listeners[type].indexOf(fn), 1);
315 };
316 this.dispatchEvent = function(evt) {
317 var list = _this.listeners[evt.type];
318 if (list) {
319 for (var i = 0; i < list.length; i++) {
320 list[i].call(_this, evt);
321 }
322 }
323 };
324 this.onabort = this.onerror = this.onload = this.onloadstart = this.onloadend = this.onprogress = null;
325
326 var constructEvent = function(type, evt) {
327 var e = {type: type, target: _this, loaded: evt.loaded, total: evt.total, error: evt.error};
328 if (evt.result != null) e.target.result = evt.result;
329 return e;
330 };
331 var listener = function(evt) {
332 if (!loadStarted) {
333 loadStarted = true;
334 _this.onloadstart && this.onloadstart(constructEvent('loadstart', evt));
335 }
336 if (evt.type === 'load') {
337 _this.onloadend && _this.onloadend(constructEvent('loadend', evt));
338 var e = constructEvent('load', evt);
339 _this.onload && _this.onload(e);
340 _this.dispatchEvent(e);
341 } else if (evt.type === 'progress') {
342 var e = constructEvent('progress', evt);
343 _this.onprogress && _this.onprogress(e);
344 _this.dispatchEvent(e);
345 } else {
346 var e = constructEvent('error', evt);
347 _this.onerror && _this.onerror(e);
348 _this.dispatchEvent(e);
349 }
350 };
351 this.readAsArrayBuffer = function(file) {
352 FileAPI.readAsBinaryString(file, listener);
353 }
354 this.readAsBinaryString = function(file) {
355 FileAPI.readAsBinaryString(file, listener);
356 }
357 this.readAsDataURL = function(file) {
358 FileAPI.readAsDataURL(file, listener);
359 }
360 this.readAsText = function(file) {
361 FileAPI.readAsText(file, listener);
362 }
363 }
364 }
365 })();
0 /**!
1 * AngularJS file upload/drop directive with progress and abort
2 * @author Danial <[email protected]>
3 * @version 2.1.1
4 */
5 (function() {
6
7 function patchXHR(fnName, newFn) {
8 window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
9 }
10
11 if (window.XMLHttpRequest && !window.XMLHttpRequest.__isFileAPIShim) {
12 patchXHR('setRequestHeader', function(orig) {
13 return function(header, value) {
14 if (header === '__setXHR_') {
15 var val = value(this);
16 // fix for angular < 1.2.0
17 if (val instanceof Function) {
18 val(this);
19 }
20 } else {
21 orig.apply(this, arguments);
22 }
23 }
24 });
25 }
26
27 var angularFileUpload = angular.module('angularFileUpload', []);
28 angularFileUpload.version = '2.1.1';
29 angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function($http, $q, $timeout) {
30 function sendHttp(config) {
31 config.method = config.method || 'POST';
32 config.headers = config.headers || {};
33 config.transformRequest = config.transformRequest || function(data, headersGetter) {
34 if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
35 return data;
36 }
37 return $http.defaults.transformRequest[0](data, headersGetter);
38 };
39 var deferred = $q.defer();
40 var promise = deferred.promise;
41
42 config.headers['__setXHR_'] = function() {
43 return function(xhr) {
44 if (!xhr) return;
45 config.__XHR = xhr;
46 config.xhrFn && config.xhrFn(xhr);
47 xhr.upload.addEventListener('progress', function(e) {
48 e.config = config;
49 deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
50 }, false);
51 //fix for firefox not firing upload progress end, also IE8-9
52 xhr.upload.addEventListener('load', function(e) {
53 if (e.lengthComputable) {
54 e.config = config;
55 deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
56 }
57 }, false);
58 };
59 };
60
61 $http(config).then(function(r){deferred.resolve(r)}, function(e){deferred.reject(e)}, function(n){deferred.notify(n)});
62
63 promise.success = function(fn) {
64 promise.then(function(response) {
65 fn(response.data, response.status, response.headers, config);
66 });
67 return promise;
68 };
69
70 promise.error = function(fn) {
71 promise.then(null, function(response) {
72 fn(response.data, response.status, response.headers, config);
73 });
74 return promise;
75 };
76
77 promise.progress = function(fn) {
78 promise.progress_fn = fn;
79 promise.then(null, null, function(update) {
80 fn(update);
81 });
82 return promise;
83 };
84 promise.abort = function() {
85 if (config.__XHR) {
86 $timeout(function() {
87 config.__XHR.abort();
88 });
89 }
90 return promise;
91 };
92 promise.xhr = function(fn) {
93 config.xhrFn = (function(origXhrFn) {
94 return function() {
95 origXhrFn && origXhrFn.apply(promise, arguments);
96 fn.apply(promise, arguments);
97 }
98 })(config.xhrFn);
99 return promise;
100 };
101
102 return promise;
103 }
104
105 this.upload = function(config) {
106 config.headers = config.headers || {};
107 config.headers['Content-Type'] = undefined;
108 config.transformRequest = config.transformRequest || $http.defaults.transformRequest;
109 var formData = new FormData();
110 var origTransformRequest = config.transformRequest;
111 var origData = config.data;
112 config.transformRequest = function(formData, headerGetter) {
113 if (origData) {
114 if (config.formDataAppender) {
115 for (var key in origData) {
116 var val = origData[key];
117 config.formDataAppender(formData, key, val);
118 }
119 } else {
120 for (var key in origData) {
121 var val = origData[key];
122 if (typeof origTransformRequest == 'function') {
123 val = origTransformRequest(val, headerGetter);
124 } else {
125 for (var i = 0; i < origTransformRequest.length; i++) {
126 var transformFn = origTransformRequest[i];
127 if (typeof transformFn == 'function') {
128 val = transformFn(val, headerGetter);
129 }
130 }
131 }
132 if (val != undefined) formData.append(key, val);
133 }
134 }
135 }
136
137 if (config.file != null) {
138 var fileFormName = config.fileFormDataName || 'file';
139
140 if (Object.prototype.toString.call(config.file) === '[object Array]') {
141 var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
142 for (var i = 0; i < config.file.length; i++) {
143 formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
144 (config.fileName && config.fileName[i]) || config.file[i].name);
145 }
146 } else {
147 formData.append(fileFormName, config.file, config.fileName || config.file.name);
148 }
149 }
150 return formData;
151 };
152
153 config.data = formData;
154
155 return sendHttp(config);
156 };
157
158 this.http = function(config) {
159 return sendHttp(config);
160 };
161 }]);
162
163 angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', '$compile', function($parse, $timeout, $compile) { return {
164 restrict: 'AEC',
165 require:'?ngModel',
166 link: function(scope, elem, attr, ngModel) {
167 handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
168 }
169 }}]);
170
171 function handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
172 if (attr.ngMultiple && $parse(attr.ngMultiple)(scope)) {
173 elem.attr('multiple', 'true');
174 attr['multiple'] = 'true';
175 }
176 var accept = attr.ngAccept && $parse(attr.ngAccept)(scope);
177 if (accept) {
178 elem.attr('accept', accept);
179 attr['accept'] = accept;
180 }
181 if (elem[0].tagName.toLowerCase() !== 'input' || (elem.attr('type') && elem.attr('type').toLowerCase()) !== 'file') {
182 var fileElem = angular.element('<input type="file">')
183 if (attr['multiple']) fileElem.attr('multiple', attr['multiple']);
184 if (attr['accept']) fileElem.attr('accept', attr['accept']);
185 fileElem.css('width', '1px').css('height', '1px').css('opacity', 0).css('position', 'absolute').css('filter', 'alpha(opacity=0)')
186 .css('padding', 0).css('margin', 0).css('overflow', 'hidden').attr('tabindex', '-1').attr('ng-file-generated-elem', true);
187 elem.append(fileElem);
188 elem.__afu_fileClickDelegate__ = function() {
189 fileElem[0].click();
190 };
191 elem.bind('click', elem.__afu_fileClickDelegate__);
192 elem.css('overflow', 'hidden');
193 var origElem = elem;
194 elem = fileElem;
195 }
196 var changeFn = $parse(attr.ngFileChange);
197 if ($parse(attr.resetOnClick)(scope) != false) {
198 if (navigator.appVersion.indexOf("MSIE 10") !== -1) {
199 // fix for IE10 cannot set the value of the input to null programmatically by replacing input
200 var replaceElem = function(evt) {
201 var inputFile = elem.clone();
202 inputFile.val('');
203 elem.replaceWith(inputFile);
204 $compile(inputFile)(scope);
205 fileElem = inputFile;
206 elem = inputFile;
207 elem.bind('change', onChangeFn);
208 elem.unbind('click');
209 elem[0].click();
210 elem.bind('click', replaceElem);
211 evt.preventDefault();
212 evt.stopPropagation();
213 };
214 elem.bind('click', replaceElem);
215 } else {
216 elem.bind('click', function(evt) {
217 elem[0].value = null;
218 });
219 }
220 }
221 var onChangeFn = function(evt) {
222 var files = [], fileList, i;
223 fileList = evt.__files_ || evt.target.files;
224 updateModel(fileList, attr, ngModel, changeFn, scope, evt);
225 };
226 elem.bind('change', onChangeFn);
227 if (attr['ngFileSelect'] != '') {
228 attr.ngFileChange = attr.ngFileSelect;
229 }
230
231 function updateModel(fileList, attr, ngModel, change, scope, evt) {
232 var files = [];
233 for (var i = 0; i < fileList.length; i++) {
234 files.push(fileList.item(i));
235 }
236 if (ngModel) {
237 scope[attr.ngModel] ? scope[attr.ngModel].value = files : scope[attr.ngModel] = files;
238 ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
239 }
240 if (change) {
241 $timeout(function() {
242 change(scope, {
243 $files : files,
244 $event : evt
245 });
246 });
247 }
248 }
249 }
250
251 angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', '$location', function($parse, $timeout, $location) { return {
252 restrict: 'AEC',
253 require:'?ngModel',
254 link: function(scope, elem, attr, ngModel) {
255 handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
256 }
257 }}]);
258
259 angularFileUpload.directive('ngNoFileDrop', function() {
260 return function(scope, elem, attr) {
261 if (dropAvailable()) elem.css('display', 'none')
262 }
263 });
264
265 //for backward compatibility
266 angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
267 return function(scope, elem, attr) {
268 if (dropAvailable()) {
269 var fn = $parse(attr['ngFileDropAvailable']);
270 $timeout(function() {
271 fn(scope);
272 });
273 }
274 }
275 }]);
276
277 function handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
278 var available = dropAvailable();
279 if (attr['dropAvailable']) {
280 $timeout(function() {
281 scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
282 });
283 }
284 if (!available) {
285 if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
286 elem.css('display', 'none');
287 }
288 return;
289 }
290 var leaveTimeout = null;
291 var stopPropagation = $parse(attr.stopPropagation)(scope);
292 var dragOverDelay = 1;
293 var accept = $parse(attr.ngAccept)(scope) || attr.accept;
294 var regexp = accept ? new RegExp(globStringToRegex(accept)) : null;
295 var actualDragOverClass;
296 elem[0].addEventListener('dragover', function(evt) {
297 evt.preventDefault();
298 if (stopPropagation) evt.stopPropagation();
299 $timeout.cancel(leaveTimeout);
300 if (!scope.actualDragOverClass) {
301 actualDragOverClass = calculateDragOverClass(scope, attr, evt);
302 }
303 elem.addClass(actualDragOverClass);
304 }, false);
305 elem[0].addEventListener('dragenter', function(evt) {
306 evt.preventDefault();
307 if (stopPropagation) evt.stopPropagation();
308 }, false);
309 elem[0].addEventListener('dragleave', function(evt) {
310 leaveTimeout = $timeout(function() {
311 elem.removeClass(actualDragOverClass);
312 actualDragOverClass = null;
313 }, dragOverDelay || 1);
314 }, false);
315 if (attr['ngFileDrop'] != '') {
316 attr.ngFileChange = scope.ngFileDrop;
317 }
318 elem[0].addEventListener('drop', function(evt) {
319 evt.preventDefault();
320 if (stopPropagation) evt.stopPropagation();
321 elem.removeClass(actualDragOverClass);
322 actualDragOverClass = null;
323 extractFiles(evt, function(files, rejFiles) {
324 if (ngModel) {
325 scope[attr.ngModel] ? scope[attr.ngModel].value = files : scope[attr.ngModel] = files;
326 ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
327 }
328 if (attr['ngFileRejectedModel']) {
329 scope[attr.ngFileRejectedModel] ? scope[attr.ngFileRejectedModel].value = rejFiles :
330 scope[attr.ngFileRejectedModel] = rejFiles;
331 }
332
333 $timeout(function() {
334 $parse(attr.ngFileChange)(scope, {
335 $files : files,
336 $rejectedFiles: rejFiles,
337 $event : evt
338 });
339 });
340 }, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
341 }, false);
342
343 function calculateDragOverClass(scope, attr, evt) {
344 var valid = true;
345 if (regexp) {
346 var items = evt.dataTransfer.items;
347 if (items != null) {
348 for (var i = 0 ; i < items.length && valid; i++) {
349 valid = valid && (items[i].kind == 'file' || items[i].kind == '') &&
350 (items[i].type.match(regexp) != null || (items[i].name != null && items[i].name.match(regexp) != null));
351 }
352 }
353 }
354 var clazz = $parse(attr.dragOverClass)(scope, {$event : evt});
355 if (clazz) {
356 if (clazz.delay) dragOverDelay = clazz.delay;
357 if (clazz.accept) clazz = valid ? clazz.accept : clazz.reject;
358 }
359 return clazz || attr['dragOverClass'] || 'dragover';
360 }
361
362 function extractFiles(evt, callback, allowDir, multiple) {
363 var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
364
365 function addFile(file) {
366 if (!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) {
367 files.push(file);
368 } else {
369 rejFiles.push(file);
370 }
371 }
372
373 if (items && items.length > 0 && $location.protocol() != 'file') {
374 for (var i = 0; i < items.length; i++) {
375 if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
376 var entry = items[i].webkitGetAsEntry();
377 if (entry.isDirectory && !allowDir) {
378 continue;
379 }
380 if (entry != null) {
381 //fix for chrome bug https://code.google.com/p/chromium/issues/detail?id=149735
382 if (isASCII(entry.name)) {
383 traverseFileTree(files, entry);
384 } else if (!items[i].webkitGetAsEntry().isDirectory) {
385 addFile(items[i].getAsFile());
386 }
387 }
388 } else {
389 var f = items[i].getAsFile();
390 if (f != null) addFile(f);
391 }
392 if (!multiple && files.length > 0) break;
393 }
394 } else {
395 var fileList = evt.dataTransfer.files;
396 if (fileList != null) {
397 for (var i = 0; i < fileList.length; i++) {
398 addFile(fileList.item(i));
399 if (!multiple && files.length > 0) break;
400 }
401 }
402 }
403 var delays = 0;
404 (function waitForProcess(delay) {
405 $timeout(function() {
406 if (!processing) {
407 if (!multiple && files.length > 1) {
408 var i = 0;
409 while (files[i].type == 'directory') i++;
410 files = [files[i]];
411 }
412 callback(files, rejFiles);
413 } else {
414 if (delays++ * 10 < 20 * 1000) {
415 waitForProcess(10);
416 }
417 }
418 }, delay || 0)
419 })();
420
421 function traverseFileTree(files, entry, path) {
422 if (entry != null) {
423 if (entry.isDirectory) {
424 var filePath = (path || '') + entry.name;
425 addFile({name: entry.name, type: 'directory', path: filePath});
426 var dirReader = entry.createReader();
427 var entries = [];
428 processing++;
429 var readEntries = function() {
430 dirReader.readEntries(function(results) {
431 try {
432 if (!results.length) {
433 for (var i = 0; i < entries.length; i++) {
434 traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
435 }
436 processing--;
437 } else {
438 entries = entries.concat(Array.prototype.slice.call(results || [], 0));
439 readEntries();
440 }
441 } catch (e) {
442 processing--;
443 console.error(e);
444 }
445 }, function() {
446 processing--;
447 });
448 };
449 readEntries();
450 } else {
451 processing++;
452 entry.file(function(file) {
453 try {
454 processing--;
455 file.path = (path ? path : '') + file.name;
456 addFile(file);
457 } catch (e) {
458 processing--;
459 console.error(e);
460 }
461 }, function(e) {
462 processing--;
463 });
464 }
465 }
466 }
467 }
468 }
469
470 function dropAvailable() {
471 var div = document.createElement('div');
472 return ('draggable' in div) && ('ondrop' in div);
473 }
474
475 function isASCII(str) {
476 return /^[\000-\177]*$/.test(str);
477 }
478
479 function globStringToRegex(str) {
480 if (str.length > 2 && str[0] === '/' && str[str.length -1] === '/') {
481 return str.substring(1, str.length - 1);
482 }
483 var split = str.split(','), result = '';
484 if (split.length > 1) {
485 for (var i = 0; i < split.length; i++) {
486 result += '(' + globStringToRegex(split[i]) + ')';
487 if (i < split.length - 1) {
488 result += '|'
489 }
490 }
491 } else {
492 result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
493 result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
494 }
495 return result;
496 }
497
498 })();
0 @charset "UTF-8";
1
2 /*!
3 Animate.css - http://daneden.me/animate
4 Licensed under the MIT license - http://opensource.org/licenses/MIT
5
6 Copyright (c) 2015 Daniel Eden
7 */
8
9 .animated {
10 -webkit-animation-duration: 1s;
11 animation-duration: 1s;
12 -webkit-animation-fill-mode: both;
13 animation-fill-mode: both;
14 }
15
16 .animated.infinite {
17 -webkit-animation-iteration-count: infinite;
18 animation-iteration-count: infinite;
19 }
20
21 .animated.hinge {
22 -webkit-animation-duration: 2s;
23 animation-duration: 2s;
24 }
25
26 .animated.bounceIn,
27 .animated.bounceOut {
28 -webkit-animation-duration: .75s;
29 animation-duration: .75s;
30 }
31
32 .animated.flipOutX,
33 .animated.flipOutY {
34 -webkit-animation-duration: .75s;
35 animation-duration: .75s;
36 }
37
38 @-webkit-keyframes bounce {
39 0%, 20%, 53%, 80%, 100% {
40 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
41 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
42 -webkit-transform: translate3d(0,0,0);
43 transform: translate3d(0,0,0);
44 }
45
46 40%, 43% {
47 -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
48 transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
49 -webkit-transform: translate3d(0, -30px, 0);
50 transform: translate3d(0, -30px, 0);
51 }
52
53 70% {
54 -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
55 transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
56 -webkit-transform: translate3d(0, -15px, 0);
57 transform: translate3d(0, -15px, 0);
58 }
59
60 90% {
61 -webkit-transform: translate3d(0,-4px,0);
62 transform: translate3d(0,-4px,0);
63 }
64 }
65
66 @keyframes bounce {
67 0%, 20%, 53%, 80%, 100% {
68 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
69 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
70 -webkit-transform: translate3d(0,0,0);
71 transform: translate3d(0,0,0);
72 }
73
74 40%, 43% {
75 -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
76 transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
77 -webkit-transform: translate3d(0, -30px, 0);
78 transform: translate3d(0, -30px, 0);
79 }
80
81 70% {
82 -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
83 transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
84 -webkit-transform: translate3d(0, -15px, 0);
85 transform: translate3d(0, -15px, 0);
86 }
87
88 90% {
89 -webkit-transform: translate3d(0,-4px,0);
90 transform: translate3d(0,-4px,0);
91 }
92 }
93
94 .bounce {
95 -webkit-animation-name: bounce;
96 animation-name: bounce;
97 -webkit-transform-origin: center bottom;
98 transform-origin: center bottom;
99 }
100
101 @-webkit-keyframes flash {
102 0%, 50%, 100% {
103 opacity: 1;
104 }
105
106 25%, 75% {
107 opacity: 0;
108 }
109 }
110
111 @keyframes flash {
112 0%, 50%, 100% {
113 opacity: 1;
114 }
115
116 25%, 75% {
117 opacity: 0;
118 }
119 }
120
121 .flash {
122 -webkit-animation-name: flash;
123 animation-name: flash;
124 }
125
126 /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
127
128 @-webkit-keyframes pulse {
129 0% {
130 -webkit-transform: scale3d(1, 1, 1);
131 transform: scale3d(1, 1, 1);
132 }
133
134 50% {
135 -webkit-transform: scale3d(1.05, 1.05, 1.05);
136 transform: scale3d(1.05, 1.05, 1.05);
137 }
138
139 100% {
140 -webkit-transform: scale3d(1, 1, 1);
141 transform: scale3d(1, 1, 1);
142 }
143 }
144
145 @keyframes pulse {
146 0% {
147 -webkit-transform: scale3d(1, 1, 1);
148 transform: scale3d(1, 1, 1);
149 }
150
151 50% {
152 -webkit-transform: scale3d(1.05, 1.05, 1.05);
153 transform: scale3d(1.05, 1.05, 1.05);
154 }
155
156 100% {
157 -webkit-transform: scale3d(1, 1, 1);
158 transform: scale3d(1, 1, 1);
159 }
160 }
161
162 .pulse {
163 -webkit-animation-name: pulse;
164 animation-name: pulse;
165 }
166
167 @-webkit-keyframes rubberBand {
168 0% {
169 -webkit-transform: scale3d(1, 1, 1);
170 transform: scale3d(1, 1, 1);
171 }
172
173 30% {
174 -webkit-transform: scale3d(1.25, 0.75, 1);
175 transform: scale3d(1.25, 0.75, 1);
176 }
177
178 40% {
179 -webkit-transform: scale3d(0.75, 1.25, 1);
180 transform: scale3d(0.75, 1.25, 1);
181 }
182
183 50% {
184 -webkit-transform: scale3d(1.15, 0.85, 1);
185 transform: scale3d(1.15, 0.85, 1);
186 }
187
188 65% {
189 -webkit-transform: scale3d(.95, 1.05, 1);
190 transform: scale3d(.95, 1.05, 1);
191 }
192
193 75% {
194 -webkit-transform: scale3d(1.05, .95, 1);
195 transform: scale3d(1.05, .95, 1);
196 }
197
198 100% {
199 -webkit-transform: scale3d(1, 1, 1);
200 transform: scale3d(1, 1, 1);
201 }
202 }
203
204 @keyframes rubberBand {
205 0% {
206 -webkit-transform: scale3d(1, 1, 1);
207 transform: scale3d(1, 1, 1);
208 }
209
210 30% {
211 -webkit-transform: scale3d(1.25, 0.75, 1);
212 transform: scale3d(1.25, 0.75, 1);
213 }
214
215 40% {
216 -webkit-transform: scale3d(0.75, 1.25, 1);
217 transform: scale3d(0.75, 1.25, 1);
218 }
219
220 50% {
221 -webkit-transform: scale3d(1.15, 0.85, 1);
222 transform: scale3d(1.15, 0.85, 1);
223 }
224
225 65% {
226 -webkit-transform: scale3d(.95, 1.05, 1);
227 transform: scale3d(.95, 1.05, 1);
228 }
229
230 75% {
231 -webkit-transform: scale3d(1.05, .95, 1);
232 transform: scale3d(1.05, .95, 1);
233 }
234
235 100% {
236 -webkit-transform: scale3d(1, 1, 1);
237 transform: scale3d(1, 1, 1);
238 }
239 }
240
241 .rubberBand {
242 -webkit-animation-name: rubberBand;
243 animation-name: rubberBand;
244 }
245
246 @-webkit-keyframes shake {
247 0%, 100% {
248 -webkit-transform: translate3d(0, 0, 0);
249 transform: translate3d(0, 0, 0);
250 }
251
252 10%, 30%, 50%, 70%, 90% {
253 -webkit-transform: translate3d(-10px, 0, 0);
254 transform: translate3d(-10px, 0, 0);
255 }
256
257 20%, 40%, 60%, 80% {
258 -webkit-transform: translate3d(10px, 0, 0);
259 transform: translate3d(10px, 0, 0);
260 }
261 }
262
263 @keyframes shake {
264 0%, 100% {
265 -webkit-transform: translate3d(0, 0, 0);
266 transform: translate3d(0, 0, 0);
267 }
268
269 10%, 30%, 50%, 70%, 90% {
270 -webkit-transform: translate3d(-10px, 0, 0);
271 transform: translate3d(-10px, 0, 0);
272 }
273
274 20%, 40%, 60%, 80% {
275 -webkit-transform: translate3d(10px, 0, 0);
276 transform: translate3d(10px, 0, 0);
277 }
278 }
279
280 .shake {
281 -webkit-animation-name: shake;
282 animation-name: shake;
283 }
284
285 @-webkit-keyframes swing {
286 20% {
287 -webkit-transform: rotate3d(0, 0, 1, 15deg);
288 transform: rotate3d(0, 0, 1, 15deg);
289 }
290
291 40% {
292 -webkit-transform: rotate3d(0, 0, 1, -10deg);
293 transform: rotate3d(0, 0, 1, -10deg);
294 }
295
296 60% {
297 -webkit-transform: rotate3d(0, 0, 1, 5deg);
298 transform: rotate3d(0, 0, 1, 5deg);
299 }
300
301 80% {
302 -webkit-transform: rotate3d(0, 0, 1, -5deg);
303 transform: rotate3d(0, 0, 1, -5deg);
304 }
305
306 100% {
307 -webkit-transform: rotate3d(0, 0, 1, 0deg);
308 transform: rotate3d(0, 0, 1, 0deg);
309 }
310 }
311
312 @keyframes swing {
313 20% {
314 -webkit-transform: rotate3d(0, 0, 1, 15deg);
315 transform: rotate3d(0, 0, 1, 15deg);
316 }
317
318 40% {
319 -webkit-transform: rotate3d(0, 0, 1, -10deg);
320 transform: rotate3d(0, 0, 1, -10deg);
321 }
322
323 60% {
324 -webkit-transform: rotate3d(0, 0, 1, 5deg);
325 transform: rotate3d(0, 0, 1, 5deg);
326 }
327
328 80% {
329 -webkit-transform: rotate3d(0, 0, 1, -5deg);
330 transform: rotate3d(0, 0, 1, -5deg);
331 }
332
333 100% {
334 -webkit-transform: rotate3d(0, 0, 1, 0deg);
335 transform: rotate3d(0, 0, 1, 0deg);
336 }
337 }
338
339 .swing {
340 -webkit-transform-origin: top center;
341 transform-origin: top center;
342 -webkit-animation-name: swing;
343 animation-name: swing;
344 }
345
346 @-webkit-keyframes tada {
347 0% {
348 -webkit-transform: scale3d(1, 1, 1);
349 transform: scale3d(1, 1, 1);
350 }
351
352 10%, 20% {
353 -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
354 transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
355 }
356
357 30%, 50%, 70%, 90% {
358 -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
359 transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
360 }
361
362 40%, 60%, 80% {
363 -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
364 transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
365 }
366
367 100% {
368 -webkit-transform: scale3d(1, 1, 1);
369 transform: scale3d(1, 1, 1);
370 }
371 }
372
373 @keyframes tada {
374 0% {
375 -webkit-transform: scale3d(1, 1, 1);
376 transform: scale3d(1, 1, 1);
377 }
378
379 10%, 20% {
380 -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
381 transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
382 }
383
384 30%, 50%, 70%, 90% {
385 -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
386 transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
387 }
388
389 40%, 60%, 80% {
390 -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
391 transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
392 }
393
394 100% {
395 -webkit-transform: scale3d(1, 1, 1);
396 transform: scale3d(1, 1, 1);
397 }
398 }
399
400 .tada {
401 -webkit-animation-name: tada;
402 animation-name: tada;
403 }
404
405 /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
406
407 @-webkit-keyframes wobble {
408 0% {
409 -webkit-transform: none;
410 transform: none;
411 }
412
413 15% {
414 -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
415 transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
416 }
417
418 30% {
419 -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
420 transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
421 }
422
423 45% {
424 -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
425 transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
426 }
427
428 60% {
429 -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
430 transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
431 }
432
433 75% {
434 -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
435 transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
436 }
437
438 100% {
439 -webkit-transform: none;
440 transform: none;
441 }
442 }
443
444 @keyframes wobble {
445 0% {
446 -webkit-transform: none;
447 transform: none;
448 }
449
450 15% {
451 -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
452 transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
453 }
454
455 30% {
456 -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
457 transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
458 }
459
460 45% {
461 -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
462 transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
463 }
464
465 60% {
466 -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
467 transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
468 }
469
470 75% {
471 -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
472 transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
473 }
474
475 100% {
476 -webkit-transform: none;
477 transform: none;
478 }
479 }
480
481 .wobble {
482 -webkit-animation-name: wobble;
483 animation-name: wobble;
484 }
485
486 @-webkit-keyframes bounceIn {
487 0%, 20%, 40%, 60%, 80%, 100% {
488 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
489 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
490 }
491
492 0% {
493 opacity: 0;
494 -webkit-transform: scale3d(.3, .3, .3);
495 transform: scale3d(.3, .3, .3);
496 }
497
498 20% {
499 -webkit-transform: scale3d(1.1, 1.1, 1.1);
500 transform: scale3d(1.1, 1.1, 1.1);
501 }
502
503 40% {
504 -webkit-transform: scale3d(.9, .9, .9);
505 transform: scale3d(.9, .9, .9);
506 }
507
508 60% {
509 opacity: 1;
510 -webkit-transform: scale3d(1.03, 1.03, 1.03);
511 transform: scale3d(1.03, 1.03, 1.03);
512 }
513
514 80% {
515 -webkit-transform: scale3d(.97, .97, .97);
516 transform: scale3d(.97, .97, .97);
517 }
518
519 100% {
520 opacity: 1;
521 -webkit-transform: scale3d(1, 1, 1);
522 transform: scale3d(1, 1, 1);
523 }
524 }
525
526 @keyframes bounceIn {
527 0%, 20%, 40%, 60%, 80%, 100% {
528 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
529 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
530 }
531
532 0% {
533 opacity: 0;
534 -webkit-transform: scale3d(.3, .3, .3);
535 transform: scale3d(.3, .3, .3);
536 }
537
538 20% {
539 -webkit-transform: scale3d(1.1, 1.1, 1.1);
540 transform: scale3d(1.1, 1.1, 1.1);
541 }
542
543 40% {
544 -webkit-transform: scale3d(.9, .9, .9);
545 transform: scale3d(.9, .9, .9);
546 }
547
548 60% {
549 opacity: 1;
550 -webkit-transform: scale3d(1.03, 1.03, 1.03);
551 transform: scale3d(1.03, 1.03, 1.03);
552 }
553
554 80% {
555 -webkit-transform: scale3d(.97, .97, .97);
556 transform: scale3d(.97, .97, .97);
557 }
558
559 100% {
560 opacity: 1;
561 -webkit-transform: scale3d(1, 1, 1);
562 transform: scale3d(1, 1, 1);
563 }
564 }
565
566 .bounceIn {
567 -webkit-animation-name: bounceIn;
568 animation-name: bounceIn;
569 }
570
571 @-webkit-keyframes bounceInDown {
572 0%, 60%, 75%, 90%, 100% {
573 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
574 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
575 }
576
577 0% {
578 opacity: 0;
579 -webkit-transform: translate3d(0, -3000px, 0);
580 transform: translate3d(0, -3000px, 0);
581 }
582
583 60% {
584 opacity: 1;
585 -webkit-transform: translate3d(0, 25px, 0);
586 transform: translate3d(0, 25px, 0);
587 }
588
589 75% {
590 -webkit-transform: translate3d(0, -10px, 0);
591 transform: translate3d(0, -10px, 0);
592 }
593
594 90% {
595 -webkit-transform: translate3d(0, 5px, 0);
596 transform: translate3d(0, 5px, 0);
597 }
598
599 100% {
600 -webkit-transform: none;
601 transform: none;
602 }
603 }
604
605 @keyframes bounceInDown {
606 0%, 60%, 75%, 90%, 100% {
607 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
608 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
609 }
610
611 0% {
612 opacity: 0;
613 -webkit-transform: translate3d(0, -3000px, 0);
614 transform: translate3d(0, -3000px, 0);
615 }
616
617 60% {
618 opacity: 1;
619 -webkit-transform: translate3d(0, 25px, 0);
620 transform: translate3d(0, 25px, 0);
621 }
622
623 75% {
624 -webkit-transform: translate3d(0, -10px, 0);
625 transform: translate3d(0, -10px, 0);
626 }
627
628 90% {
629 -webkit-transform: translate3d(0, 5px, 0);
630 transform: translate3d(0, 5px, 0);
631 }
632
633 100% {
634 -webkit-transform: none;
635 transform: none;
636 }
637 }
638
639 .bounceInDown {
640 -webkit-animation-name: bounceInDown;
641 animation-name: bounceInDown;
642 }
643
644 @-webkit-keyframes bounceInLeft {
645 0%, 60%, 75%, 90%, 100% {
646 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
647 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
648 }
649
650 0% {
651 opacity: 0;
652 -webkit-transform: translate3d(-3000px, 0, 0);
653 transform: translate3d(-3000px, 0, 0);
654 }
655
656 60% {
657 opacity: 1;
658 -webkit-transform: translate3d(25px, 0, 0);
659 transform: translate3d(25px, 0, 0);
660 }
661
662 75% {
663 -webkit-transform: translate3d(-10px, 0, 0);
664 transform: translate3d(-10px, 0, 0);
665 }
666
667 90% {
668 -webkit-transform: translate3d(5px, 0, 0);
669 transform: translate3d(5px, 0, 0);
670 }
671
672 100% {
673 -webkit-transform: none;
674 transform: none;
675 }
676 }
677
678 @keyframes bounceInLeft {
679 0%, 60%, 75%, 90%, 100% {
680 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
681 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
682 }
683
684 0% {
685 opacity: 0;
686 -webkit-transform: translate3d(-3000px, 0, 0);
687 transform: translate3d(-3000px, 0, 0);
688 }
689
690 60% {
691 opacity: 1;
692 -webkit-transform: translate3d(25px, 0, 0);
693 transform: translate3d(25px, 0, 0);
694 }
695
696 75% {
697 -webkit-transform: translate3d(-10px, 0, 0);
698 transform: translate3d(-10px, 0, 0);
699 }
700
701 90% {
702 -webkit-transform: translate3d(5px, 0, 0);
703 transform: translate3d(5px, 0, 0);
704 }
705
706 100% {
707 -webkit-transform: none;
708 transform: none;
709 }
710 }
711
712 .bounceInLeft {
713 -webkit-animation-name: bounceInLeft;
714 animation-name: bounceInLeft;
715 }
716
717 @-webkit-keyframes bounceInRight {
718 0%, 60%, 75%, 90%, 100% {
719 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
720 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
721 }
722
723 0% {
724 opacity: 0;
725 -webkit-transform: translate3d(3000px, 0, 0);
726 transform: translate3d(3000px, 0, 0);
727 }
728
729 60% {
730 opacity: 1;
731 -webkit-transform: translate3d(-25px, 0, 0);
732 transform: translate3d(-25px, 0, 0);
733 }
734
735 75% {
736 -webkit-transform: translate3d(10px, 0, 0);
737 transform: translate3d(10px, 0, 0);
738 }
739
740 90% {
741 -webkit-transform: translate3d(-5px, 0, 0);
742 transform: translate3d(-5px, 0, 0);
743 }
744
745 100% {
746 -webkit-transform: none;
747 transform: none;
748 }
749 }
750
751 @keyframes bounceInRight {
752 0%, 60%, 75%, 90%, 100% {
753 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
754 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
755 }
756
757 0% {
758 opacity: 0;
759 -webkit-transform: translate3d(3000px, 0, 0);
760 transform: translate3d(3000px, 0, 0);
761 }
762
763 60% {
764 opacity: 1;
765 -webkit-transform: translate3d(-25px, 0, 0);
766 transform: translate3d(-25px, 0, 0);
767 }
768
769 75% {
770 -webkit-transform: translate3d(10px, 0, 0);
771 transform: translate3d(10px, 0, 0);
772 }
773
774 90% {
775 -webkit-transform: translate3d(-5px, 0, 0);
776 transform: translate3d(-5px, 0, 0);
777 }
778
779 100% {
780 -webkit-transform: none;
781 transform: none;
782 }
783 }
784
785 .bounceInRight {
786 -webkit-animation-name: bounceInRight;
787 animation-name: bounceInRight;
788 }
789
790 @-webkit-keyframes bounceInUp {
791 0%, 60%, 75%, 90%, 100% {
792 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
793 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
794 }
795
796 0% {
797 opacity: 0;
798 -webkit-transform: translate3d(0, 3000px, 0);
799 transform: translate3d(0, 3000px, 0);
800 }
801
802 60% {
803 opacity: 1;
804 -webkit-transform: translate3d(0, -20px, 0);
805 transform: translate3d(0, -20px, 0);
806 }
807
808 75% {
809 -webkit-transform: translate3d(0, 10px, 0);
810 transform: translate3d(0, 10px, 0);
811 }
812
813 90% {
814 -webkit-transform: translate3d(0, -5px, 0);
815 transform: translate3d(0, -5px, 0);
816 }
817
818 100% {
819 -webkit-transform: translate3d(0, 0, 0);
820 transform: translate3d(0, 0, 0);
821 }
822 }
823
824 @keyframes bounceInUp {
825 0%, 60%, 75%, 90%, 100% {
826 -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
827 transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
828 }
829
830 0% {
831 opacity: 0;
832 -webkit-transform: translate3d(0, 3000px, 0);
833 transform: translate3d(0, 3000px, 0);
834 }
835
836 60% {
837 opacity: 1;
838 -webkit-transform: translate3d(0, -20px, 0);
839 transform: translate3d(0, -20px, 0);
840 }
841
842 75% {
843 -webkit-transform: translate3d(0, 10px, 0);
844 transform: translate3d(0, 10px, 0);
845 }
846
847 90% {
848 -webkit-transform: translate3d(0, -5px, 0);
849 transform: translate3d(0, -5px, 0);
850 }
851
852 100% {
853 -webkit-transform: translate3d(0, 0, 0);
854 transform: translate3d(0, 0, 0);
855 }
856 }
857
858 .bounceInUp {
859 -webkit-animation-name: bounceInUp;
860 animation-name: bounceInUp;
861 }
862
863 @-webkit-keyframes bounceOut {
864 20% {
865 -webkit-transform: scale3d(.9, .9, .9);
866 transform: scale3d(.9, .9, .9);
867 }
868
869 50%, 55% {
870 opacity: 1;
871 -webkit-transform: scale3d(1.1, 1.1, 1.1);
872 transform: scale3d(1.1, 1.1, 1.1);
873 }
874
875 100% {
876 opacity: 0;
877 -webkit-transform: scale3d(.3, .3, .3);
878 transform: scale3d(.3, .3, .3);
879 }
880 }
881
882 @keyframes bounceOut {
883 20% {
884 -webkit-transform: scale3d(.9, .9, .9);
885 transform: scale3d(.9, .9, .9);
886 }
887
888 50%, 55% {
889 opacity: 1;
890 -webkit-transform: scale3d(1.1, 1.1, 1.1);
891 transform: scale3d(1.1, 1.1, 1.1);
892 }
893
894 100% {
895 opacity: 0;
896 -webkit-transform: scale3d(.3, .3, .3);
897 transform: scale3d(.3, .3, .3);
898 }
899 }
900
901 .bounceOut {
902 -webkit-animation-name: bounceOut;
903 animation-name: bounceOut;
904 }
905
906 @-webkit-keyframes bounceOutDown {
907 20% {
908 -webkit-transform: translate3d(0, 10px, 0);
909 transform: translate3d(0, 10px, 0);
910 }
911
912 40%, 45% {
913 opacity: 1;
914 -webkit-transform: translate3d(0, -20px, 0);
915 transform: translate3d(0, -20px, 0);
916 }
917
918 100% {
919 opacity: 0;
920 -webkit-transform: translate3d(0, 2000px, 0);
921 transform: translate3d(0, 2000px, 0);
922 }
923 }
924
925 @keyframes bounceOutDown {
926 20% {
927 -webkit-transform: translate3d(0, 10px, 0);
928 transform: translate3d(0, 10px, 0);
929 }
930
931 40%, 45% {
932 opacity: 1;
933 -webkit-transform: translate3d(0, -20px, 0);
934 transform: translate3d(0, -20px, 0);
935 }
936
937 100% {
938 opacity: 0;
939 -webkit-transform: translate3d(0, 2000px, 0);
940 transform: translate3d(0, 2000px, 0);
941 }
942 }
943
944 .bounceOutDown {
945 -webkit-animation-name: bounceOutDown;
946 animation-name: bounceOutDown;
947 }
948
949 @-webkit-keyframes bounceOutLeft {
950 20% {
951 opacity: 1;
952 -webkit-transform: translate3d(20px, 0, 0);
953 transform: translate3d(20px, 0, 0);
954 }
955
956 100% {
957 opacity: 0;
958 -webkit-transform: translate3d(-2000px, 0, 0);
959 transform: translate3d(-2000px, 0, 0);
960 }
961 }
962
963 @keyframes bounceOutLeft {
964 20% {
965 opacity: 1;
966 -webkit-transform: translate3d(20px, 0, 0);
967 transform: translate3d(20px, 0, 0);
968 }
969
970 100% {
971 opacity: 0;
972 -webkit-transform: translate3d(-2000px, 0, 0);
973 transform: translate3d(-2000px, 0, 0);
974 }
975 }
976
977 .bounceOutLeft {
978 -webkit-animation-name: bounceOutLeft;
979 animation-name: bounceOutLeft;
980 }
981
982 @-webkit-keyframes bounceOutRight {
983 20% {
984 opacity: 1;
985 -webkit-transform: translate3d(-20px, 0, 0);
986 transform: translate3d(-20px, 0, 0);
987 }
988
989 100% {
990 opacity: 0;
991 -webkit-transform: translate3d(2000px, 0, 0);
992 transform: translate3d(2000px, 0, 0);
993 }
994 }
995
996 @keyframes bounceOutRight {
997 20% {
998 opacity: 1;
999 -webkit-transform: translate3d(-20px, 0, 0);
1000 transform: translate3d(-20px, 0, 0);
1001 }
1002
1003 100% {
1004 opacity: 0;
1005 -webkit-transform: translate3d(2000px, 0, 0);
1006 transform: translate3d(2000px, 0, 0);
1007 }
1008 }
1009
1010 .bounceOutRight {
1011 -webkit-animation-name: bounceOutRight;
1012 animation-name: bounceOutRight;
1013 }
1014
1015 @-webkit-keyframes bounceOutUp {
1016 20% {
1017 -webkit-transform: translate3d(0, -10px, 0);
1018 transform: translate3d(0, -10px, 0);
1019 }
1020
1021 40%, 45% {
1022 opacity: 1;
1023 -webkit-transform: translate3d(0, 20px, 0);
1024 transform: translate3d(0, 20px, 0);
1025 }
1026
1027 100% {
1028 opacity: 0;
1029 -webkit-transform: translate3d(0, -2000px, 0);
1030 transform: translate3d(0, -2000px, 0);
1031 }
1032 }
1033
1034 @keyframes bounceOutUp {
1035 20% {
1036 -webkit-transform: translate3d(0, -10px, 0);
1037 transform: translate3d(0, -10px, 0);
1038 }
1039
1040 40%, 45% {
1041 opacity: 1;
1042 -webkit-transform: translate3d(0, 20px, 0);
1043 transform: translate3d(0, 20px, 0);
1044 }
1045
1046 100% {
1047 opacity: 0;
1048 -webkit-transform: translate3d(0, -2000px, 0);
1049 transform: translate3d(0, -2000px, 0);
1050 }
1051 }
1052
1053 .bounceOutUp {
1054 -webkit-animation-name: bounceOutUp;
1055 animation-name: bounceOutUp;
1056 }
1057
1058 @-webkit-keyframes fadeIn {
1059 0% {
1060 opacity: 0;
1061 }
1062
1063 100% {
1064 opacity: 1;
1065 }
1066 }
1067
1068 @keyframes fadeIn {
1069 0% {
1070 opacity: 0;
1071 }
1072
1073 100% {
1074 opacity: 1;
1075 }
1076 }
1077
1078 .fadeIn {
1079 -webkit-animation-name: fadeIn;
1080 animation-name: fadeIn;
1081 }
1082
1083 @-webkit-keyframes fadeInDown {
1084 0% {
1085 opacity: 0;
1086 -webkit-transform: translate3d(0, -100%, 0);
1087 transform: translate3d(0, -100%, 0);
1088 }
1089
1090 100% {
1091 opacity: 1;
1092 -webkit-transform: none;
1093 transform: none;
1094 }
1095 }
1096
1097 @keyframes fadeInDown {
1098 0% {
1099 opacity: 0;
1100 -webkit-transform: translate3d(0, -100%, 0);
1101 transform: translate3d(0, -100%, 0);
1102 }
1103
1104 100% {
1105 opacity: 1;
1106 -webkit-transform: none;
1107 transform: none;
1108 }
1109 }
1110
1111 .fadeInDown {
1112 -webkit-animation-name: fadeInDown;
1113 animation-name: fadeInDown;
1114 }
1115
1116 @-webkit-keyframes fadeInDownBig {
1117 0% {
1118 opacity: 0;
1119 -webkit-transform: translate3d(0, -2000px, 0);
1120 transform: translate3d(0, -2000px, 0);
1121 }
1122
1123 100% {
1124 opacity: 1;
1125 -webkit-transform: none;
1126 transform: none;
1127 }
1128 }
1129
1130 @keyframes fadeInDownBig {
1131 0% {
1132 opacity: 0;
1133 -webkit-transform: translate3d(0, -2000px, 0);
1134 transform: translate3d(0, -2000px, 0);
1135 }
1136
1137 100% {
1138 opacity: 1;
1139 -webkit-transform: none;
1140 transform: none;
1141 }
1142 }
1143
1144 .fadeInDownBig {
1145 -webkit-animation-name: fadeInDownBig;
1146 animation-name: fadeInDownBig;
1147 }
1148
1149 @-webkit-keyframes fadeInLeft {
1150 0% {
1151 opacity: 0;
1152 -webkit-transform: translate3d(-100%, 0, 0);
1153 transform: translate3d(-100%, 0, 0);
1154 }
1155
1156 100% {
1157 opacity: 1;
1158 -webkit-transform: none;
1159 transform: none;
1160 }
1161 }
1162
1163 @keyframes fadeInLeft {
1164 0% {
1165 opacity: 0;
1166 -webkit-transform: translate3d(-100%, 0, 0);
1167 transform: translate3d(-100%, 0, 0);
1168 }
1169
1170 100% {
1171 opacity: 1;
1172 -webkit-transform: none;
1173 transform: none;
1174 }
1175 }
1176
1177 .fadeInLeft {
1178 -webkit-animation-name: fadeInLeft;
1179 animation-name: fadeInLeft;
1180 }
1181
1182 @-webkit-keyframes fadeInLeftBig {
1183 0% {
1184 opacity: 0;
1185 -webkit-transform: translate3d(-2000px, 0, 0);
1186 transform: translate3d(-2000px, 0, 0);
1187 }
1188
1189 100% {
1190 opacity: 1;
1191 -webkit-transform: none;
1192 transform: none;
1193 }
1194 }
1195
1196 @keyframes fadeInLeftBig {
1197 0% {
1198 opacity: 0;
1199 -webkit-transform: translate3d(-2000px, 0, 0);
1200 transform: translate3d(-2000px, 0, 0);
1201 }
1202
1203 100% {
1204 opacity: 1;
1205 -webkit-transform: none;
1206 transform: none;
1207 }
1208 }
1209
1210 .fadeInLeftBig {
1211 -webkit-animation-name: fadeInLeftBig;
1212 animation-name: fadeInLeftBig;
1213 }
1214
1215 @-webkit-keyframes fadeInRight {
1216 0% {
1217 opacity: 0;
1218 -webkit-transform: translate3d(100%, 0, 0);
1219 transform: translate3d(100%, 0, 0);
1220 }
1221
1222 100% {
1223 opacity: 1;
1224 -webkit-transform: none;
1225 transform: none;
1226 }
1227 }
1228
1229 @keyframes fadeInRight {
1230 0% {
1231 opacity: 0;
1232 -webkit-transform: translate3d(100%, 0, 0);
1233 transform: translate3d(100%, 0, 0);
1234 }
1235
1236 100% {
1237 opacity: 1;
1238 -webkit-transform: none;
1239 transform: none;
1240 }
1241 }
1242
1243 .fadeInRight {
1244 -webkit-animation-name: fadeInRight;
1245 animation-name: fadeInRight;
1246 }
1247
1248 @-webkit-keyframes fadeInRightBig {
1249 0% {
1250 opacity: 0;
1251 -webkit-transform: translate3d(2000px, 0, 0);
1252 transform: translate3d(2000px, 0, 0);
1253 }
1254
1255 100% {
1256 opacity: 1;
1257 -webkit-transform: none;
1258 transform: none;
1259 }
1260 }
1261
1262 @keyframes fadeInRightBig {
1263 0% {
1264 opacity: 0;
1265 -webkit-transform: translate3d(2000px, 0, 0);
1266 transform: translate3d(2000px, 0, 0);
1267 }
1268
1269 100% {
1270 opacity: 1;
1271 -webkit-transform: none;
1272 transform: none;
1273 }
1274 }
1275
1276 .fadeInRightBig {
1277 -webkit-animation-name: fadeInRightBig;
1278 animation-name: fadeInRightBig;
1279 }
1280
1281 @-webkit-keyframes fadeInUp {
1282 0% {
1283 opacity: 0;
1284 -webkit-transform: translate3d(0, 100%, 0);
1285 transform: translate3d(0, 100%, 0);
1286 }
1287
1288 100% {
1289 opacity: 1;
1290 -webkit-transform: none;
1291 transform: none;
1292 }
1293 }
1294
1295 @keyframes fadeInUp {
1296 0% {
1297 opacity: 0;
1298 -webkit-transform: translate3d(0, 100%, 0);
1299 transform: translate3d(0, 100%, 0);
1300 }
1301
1302 100% {
1303 opacity: 1;
1304 -webkit-transform: none;
1305 transform: none;
1306 }
1307 }
1308
1309 .fadeInUp {
1310 -webkit-animation-name: fadeInUp;
1311 animation-name: fadeInUp;
1312 }
1313
1314 @-webkit-keyframes fadeInUpBig {
1315 0% {
1316 opacity: 0;
1317 -webkit-transform: translate3d(0, 2000px, 0);
1318 transform: translate3d(0, 2000px, 0);
1319 }
1320
1321 100% {
1322 opacity: 1;
1323 -webkit-transform: none;
1324 transform: none;
1325 }
1326 }
1327
1328 @keyframes fadeInUpBig {
1329 0% {
1330 opacity: 0;
1331 -webkit-transform: translate3d(0, 2000px, 0);
1332 transform: translate3d(0, 2000px, 0);
1333 }
1334
1335 100% {
1336 opacity: 1;
1337 -webkit-transform: none;
1338 transform: none;
1339 }
1340 }
1341
1342 .fadeInUpBig {
1343 -webkit-animation-name: fadeInUpBig;
1344 animation-name: fadeInUpBig;
1345 }
1346
1347 @-webkit-keyframes fadeOut {
1348 0% {
1349 opacity: 1;
1350 }
1351
1352 100% {
1353 opacity: 0;
1354 }
1355 }
1356
1357 @keyframes fadeOut {
1358 0% {
1359 opacity: 1;
1360 }
1361
1362 100% {
1363 opacity: 0;
1364 }
1365 }
1366
1367 .fadeOut {
1368 -webkit-animation-name: fadeOut;
1369 animation-name: fadeOut;
1370 }
1371
1372 @-webkit-keyframes fadeOutDown {
1373 0% {
1374 opacity: 1;
1375 }
1376
1377 100% {
1378 opacity: 0;
1379 -webkit-transform: translate3d(0, 100%, 0);
1380 transform: translate3d(0, 100%, 0);
1381 }
1382 }
1383
1384 @keyframes fadeOutDown {
1385 0% {
1386 opacity: 1;
1387 }
1388
1389 100% {
1390 opacity: 0;
1391 -webkit-transform: translate3d(0, 100%, 0);
1392 transform: translate3d(0, 100%, 0);
1393 }
1394 }
1395
1396 .fadeOutDown {
1397 -webkit-animation-name: fadeOutDown;
1398 animation-name: fadeOutDown;
1399 }
1400
1401 @-webkit-keyframes fadeOutDownBig {
1402 0% {
1403 opacity: 1;
1404 }
1405
1406 100% {
1407 opacity: 0;
1408 -webkit-transform: translate3d(0, 2000px, 0);
1409 transform: translate3d(0, 2000px, 0);
1410 }
1411 }
1412
1413 @keyframes fadeOutDownBig {
1414 0% {
1415 opacity: 1;
1416 }
1417
1418 100% {
1419 opacity: 0;
1420 -webkit-transform: translate3d(0, 2000px, 0);
1421 transform: translate3d(0, 2000px, 0);
1422 }
1423 }
1424
1425 .fadeOutDownBig {
1426 -webkit-animation-name: fadeOutDownBig;
1427 animation-name: fadeOutDownBig;
1428 }
1429
1430 @-webkit-keyframes fadeOutLeft {
1431 0% {
1432 opacity: 1;
1433 }
1434
1435 100% {
1436 opacity: 0;
1437 -webkit-transform: translate3d(-100%, 0, 0);
1438 transform: translate3d(-100%, 0, 0);
1439 }
1440 }
1441
1442 @keyframes fadeOutLeft {
1443 0% {
1444 opacity: 1;
1445 }
1446
1447 100% {
1448 opacity: 0;
1449 -webkit-transform: translate3d(-100%, 0, 0);
1450 transform: translate3d(-100%, 0, 0);
1451 }
1452 }
1453
1454 .fadeOutLeft {
1455 -webkit-animation-name: fadeOutLeft;
1456 animation-name: fadeOutLeft;
1457 }
1458
1459 @-webkit-keyframes fadeOutLeftBig {
1460 0% {
1461 opacity: 1;
1462 }
1463
1464 100% {
1465 opacity: 0;
1466 -webkit-transform: translate3d(-2000px, 0, 0);
1467 transform: translate3d(-2000px, 0, 0);
1468 }
1469 }
1470
1471 @keyframes fadeOutLeftBig {
1472 0% {
1473 opacity: 1;
1474 }
1475
1476 100% {
1477 opacity: 0;
1478 -webkit-transform: translate3d(-2000px, 0, 0);
1479 transform: translate3d(-2000px, 0, 0);
1480 }
1481 }
1482
1483 .fadeOutLeftBig {
1484 -webkit-animation-name: fadeOutLeftBig;
1485 animation-name: fadeOutLeftBig;
1486 }
1487
1488 @-webkit-keyframes fadeOutRight {
1489 0% {
1490 opacity: 1;
1491 }
1492
1493 100% {
1494 opacity: 0;
1495 -webkit-transform: translate3d(100%, 0, 0);
1496 transform: translate3d(100%, 0, 0);
1497 }
1498 }
1499
1500 @keyframes fadeOutRight {
1501 0% {
1502 opacity: 1;
1503 }
1504
1505 100% {
1506 opacity: 0;
1507 -webkit-transform: translate3d(100%, 0, 0);
1508 transform: translate3d(100%, 0, 0);
1509 }
1510 }
1511
1512 .fadeOutRight {
1513 -webkit-animation-name: fadeOutRight;
1514 animation-name: fadeOutRight;
1515 }
1516
1517 @-webkit-keyframes fadeOutRightBig {
1518 0% {
1519 opacity: 1;
1520 }
1521
1522 100% {
1523 opacity: 0;
1524 -webkit-transform: translate3d(2000px, 0, 0);
1525 transform: translate3d(2000px, 0, 0);
1526 }
1527 }
1528
1529 @keyframes fadeOutRightBig {
1530 0% {
1531 opacity: 1;
1532 }
1533
1534 100% {
1535 opacity: 0;
1536 -webkit-transform: translate3d(2000px, 0, 0);
1537 transform: translate3d(2000px, 0, 0);
1538 }
1539 }
1540
1541 .fadeOutRightBig {
1542 -webkit-animation-name: fadeOutRightBig;
1543 animation-name: fadeOutRightBig;
1544 }
1545
1546 @-webkit-keyframes fadeOutUp {
1547 0% {
1548 opacity: 1;
1549 }
1550
1551 100% {
1552 opacity: 0;
1553 -webkit-transform: translate3d(0, -100%, 0);
1554 transform: translate3d(0, -100%, 0);
1555 }
1556 }
1557
1558 @keyframes fadeOutUp {
1559 0% {
1560 opacity: 1;
1561 }
1562
1563 100% {
1564 opacity: 0;
1565 -webkit-transform: translate3d(0, -100%, 0);
1566 transform: translate3d(0, -100%, 0);
1567 }
1568 }
1569
1570 .fadeOutUp {
1571 -webkit-animation-name: fadeOutUp;
1572 animation-name: fadeOutUp;
1573 }
1574
1575 @-webkit-keyframes fadeOutUpBig {
1576 0% {
1577 opacity: 1;
1578 }
1579
1580 100% {
1581 opacity: 0;
1582 -webkit-transform: translate3d(0, -2000px, 0);
1583 transform: translate3d(0, -2000px, 0);
1584 }
1585 }
1586
1587 @keyframes fadeOutUpBig {
1588 0% {
1589 opacity: 1;
1590 }
1591
1592 100% {
1593 opacity: 0;
1594 -webkit-transform: translate3d(0, -2000px, 0);
1595 transform: translate3d(0, -2000px, 0);
1596 }
1597 }
1598
1599 .fadeOutUpBig {
1600 -webkit-animation-name: fadeOutUpBig;
1601 animation-name: fadeOutUpBig;
1602 }
1603
1604 @-webkit-keyframes flip {
1605 0% {
1606 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1607 transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1608 -webkit-animation-timing-function: ease-out;
1609 animation-timing-function: ease-out;
1610 }
1611
1612 40% {
1613 -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1614 transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1615 -webkit-animation-timing-function: ease-out;
1616 animation-timing-function: ease-out;
1617 }
1618
1619 50% {
1620 -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1621 transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1622 -webkit-animation-timing-function: ease-in;
1623 animation-timing-function: ease-in;
1624 }
1625
1626 80% {
1627 -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
1628 transform: perspective(400px) scale3d(.95, .95, .95);
1629 -webkit-animation-timing-function: ease-in;
1630 animation-timing-function: ease-in;
1631 }
1632
1633 100% {
1634 -webkit-transform: perspective(400px);
1635 transform: perspective(400px);
1636 -webkit-animation-timing-function: ease-in;
1637 animation-timing-function: ease-in;
1638 }
1639 }
1640
1641 @keyframes flip {
1642 0% {
1643 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1644 transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1645 -webkit-animation-timing-function: ease-out;
1646 animation-timing-function: ease-out;
1647 }
1648
1649 40% {
1650 -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1651 transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1652 -webkit-animation-timing-function: ease-out;
1653 animation-timing-function: ease-out;
1654 }
1655
1656 50% {
1657 -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1658 transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1659 -webkit-animation-timing-function: ease-in;
1660 animation-timing-function: ease-in;
1661 }
1662
1663 80% {
1664 -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
1665 transform: perspective(400px) scale3d(.95, .95, .95);
1666 -webkit-animation-timing-function: ease-in;
1667 animation-timing-function: ease-in;
1668 }
1669
1670 100% {
1671 -webkit-transform: perspective(400px);
1672 transform: perspective(400px);
1673 -webkit-animation-timing-function: ease-in;
1674 animation-timing-function: ease-in;
1675 }
1676 }
1677
1678 .animated.flip {
1679 -webkit-backface-visibility: visible;
1680 backface-visibility: visible;
1681 -webkit-animation-name: flip;
1682 animation-name: flip;
1683 }
1684
1685 @-webkit-keyframes flipInX {
1686 0% {
1687 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1688 transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1689 -webkit-transition-timing-function: ease-in;
1690 transition-timing-function: ease-in;
1691 opacity: 0;
1692 }
1693
1694 40% {
1695 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1696 transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1697 -webkit-transition-timing-function: ease-in;
1698 transition-timing-function: ease-in;
1699 }
1700
1701 60% {
1702 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1703 transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1704 opacity: 1;
1705 }
1706
1707 80% {
1708 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1709 transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1710 }
1711
1712 100% {
1713 -webkit-transform: perspective(400px);
1714 transform: perspective(400px);
1715 }
1716 }
1717
1718 @keyframes flipInX {
1719 0% {
1720 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1721 transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1722 -webkit-transition-timing-function: ease-in;
1723 transition-timing-function: ease-in;
1724 opacity: 0;
1725 }
1726
1727 40% {
1728 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1729 transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1730 -webkit-transition-timing-function: ease-in;
1731 transition-timing-function: ease-in;
1732 }
1733
1734 60% {
1735 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1736 transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1737 opacity: 1;
1738 }
1739
1740 80% {
1741 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1742 transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1743 }
1744
1745 100% {
1746 -webkit-transform: perspective(400px);
1747 transform: perspective(400px);
1748 }
1749 }
1750
1751 .flipInX {
1752 -webkit-backface-visibility: visible !important;
1753 backface-visibility: visible !important;
1754 -webkit-animation-name: flipInX;
1755 animation-name: flipInX;
1756 }
1757
1758 @-webkit-keyframes flipInY {
1759 0% {
1760 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1761 transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1762 -webkit-transition-timing-function: ease-in;
1763 transition-timing-function: ease-in;
1764 opacity: 0;
1765 }
1766
1767 40% {
1768 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1769 transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1770 -webkit-transition-timing-function: ease-in;
1771 transition-timing-function: ease-in;
1772 }
1773
1774 60% {
1775 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1776 transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1777 opacity: 1;
1778 }
1779
1780 80% {
1781 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1782 transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1783 }
1784
1785 100% {
1786 -webkit-transform: perspective(400px);
1787 transform: perspective(400px);
1788 }
1789 }
1790
1791 @keyframes flipInY {
1792 0% {
1793 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1794 transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1795 -webkit-transition-timing-function: ease-in;
1796 transition-timing-function: ease-in;
1797 opacity: 0;
1798 }
1799
1800 40% {
1801 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1802 transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1803 -webkit-transition-timing-function: ease-in;
1804 transition-timing-function: ease-in;
1805 }
1806
1807 60% {
1808 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1809 transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1810 opacity: 1;
1811 }
1812
1813 80% {
1814 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1815 transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1816 }
1817
1818 100% {
1819 -webkit-transform: perspective(400px);
1820 transform: perspective(400px);
1821 }
1822 }
1823
1824 .flipInY {
1825 -webkit-backface-visibility: visible !important;
1826 backface-visibility: visible !important;
1827 -webkit-animation-name: flipInY;
1828 animation-name: flipInY;
1829 }
1830
1831 @-webkit-keyframes flipOutX {
1832 0% {
1833 -webkit-transform: perspective(400px);
1834 transform: perspective(400px);
1835 }
1836
1837 30% {
1838 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1839 transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1840 opacity: 1;
1841 }
1842
1843 100% {
1844 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1845 transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1846 opacity: 0;
1847 }
1848 }
1849
1850 @keyframes flipOutX {
1851 0% {
1852 -webkit-transform: perspective(400px);
1853 transform: perspective(400px);
1854 }
1855
1856 30% {
1857 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1858 transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1859 opacity: 1;
1860 }
1861
1862 100% {
1863 -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1864 transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1865 opacity: 0;
1866 }
1867 }
1868
1869 .flipOutX {
1870 -webkit-animation-name: flipOutX;
1871 animation-name: flipOutX;
1872 -webkit-backface-visibility: visible !important;
1873 backface-visibility: visible !important;
1874 }
1875
1876 @-webkit-keyframes flipOutY {
1877 0% {
1878 -webkit-transform: perspective(400px);
1879 transform: perspective(400px);
1880 }
1881
1882 30% {
1883 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
1884 transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
1885 opacity: 1;
1886 }
1887
1888 100% {
1889 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1890 transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1891 opacity: 0;
1892 }
1893 }
1894
1895 @keyframes flipOutY {
1896 0% {
1897 -webkit-transform: perspective(400px);
1898 transform: perspective(400px);
1899 }
1900
1901 30% {
1902 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
1903 transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
1904 opacity: 1;
1905 }
1906
1907 100% {
1908 -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1909 transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1910 opacity: 0;
1911 }
1912 }
1913
1914 .flipOutY {
1915 -webkit-backface-visibility: visible !important;
1916 backface-visibility: visible !important;
1917 -webkit-animation-name: flipOutY;
1918 animation-name: flipOutY;
1919 }
1920
1921 @-webkit-keyframes lightSpeedIn {
1922 0% {
1923 -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
1924 transform: translate3d(100%, 0, 0) skewX(-30deg);
1925 opacity: 0;
1926 }
1927
1928 60% {
1929 -webkit-transform: skewX(20deg);
1930 transform: skewX(20deg);
1931 opacity: 1;
1932 }
1933
1934 80% {
1935 -webkit-transform: skewX(-5deg);
1936 transform: skewX(-5deg);
1937 opacity: 1;
1938 }
1939
1940 100% {
1941 -webkit-transform: none;
1942 transform: none;
1943 opacity: 1;
1944 }
1945 }
1946
1947 @keyframes lightSpeedIn {
1948 0% {
1949 -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
1950 transform: translate3d(100%, 0, 0) skewX(-30deg);
1951 opacity: 0;
1952 }
1953
1954 60% {
1955 -webkit-transform: skewX(20deg);
1956 transform: skewX(20deg);
1957 opacity: 1;
1958 }
1959
1960 80% {
1961 -webkit-transform: skewX(-5deg);
1962 transform: skewX(-5deg);
1963 opacity: 1;
1964 }
1965
1966 100% {
1967 -webkit-transform: none;
1968 transform: none;
1969 opacity: 1;
1970 }
1971 }
1972
1973 .lightSpeedIn {
1974 -webkit-animation-name: lightSpeedIn;
1975 animation-name: lightSpeedIn;
1976 -webkit-animation-timing-function: ease-out;
1977 animation-timing-function: ease-out;
1978 }
1979
1980 @-webkit-keyframes lightSpeedOut {
1981 0% {
1982 opacity: 1;
1983 }
1984
1985 100% {
1986 -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
1987 transform: translate3d(100%, 0, 0) skewX(30deg);
1988 opacity: 0;
1989 }
1990 }
1991
1992 @keyframes lightSpeedOut {
1993 0% {
1994 opacity: 1;
1995 }
1996
1997 100% {
1998 -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
1999 transform: translate3d(100%, 0, 0) skewX(30deg);
2000 opacity: 0;
2001 }
2002 }
2003
2004 .lightSpeedOut {
2005 -webkit-animation-name: lightSpeedOut;
2006 animation-name: lightSpeedOut;
2007 -webkit-animation-timing-function: ease-in;
2008 animation-timing-function: ease-in;
2009 }
2010
2011 @-webkit-keyframes rotateIn {
2012 0% {
2013 -webkit-transform-origin: center;
2014 transform-origin: center;
2015 -webkit-transform: rotate3d(0, 0, 1, -200deg);
2016 transform: rotate3d(0, 0, 1, -200deg);
2017 opacity: 0;
2018 }
2019
2020 100% {
2021 -webkit-transform-origin: center;
2022 transform-origin: center;
2023 -webkit-transform: none;
2024 transform: none;
2025 opacity: 1;
2026 }
2027 }
2028
2029 @keyframes rotateIn {
2030 0% {
2031 -webkit-transform-origin: center;
2032 transform-origin: center;
2033 -webkit-transform: rotate3d(0, 0, 1, -200deg);
2034 transform: rotate3d(0, 0, 1, -200deg);
2035 opacity: 0;
2036 }
2037
2038 100% {
2039 -webkit-transform-origin: center;
2040 transform-origin: center;
2041 -webkit-transform: none;
2042 transform: none;
2043 opacity: 1;
2044 }
2045 }
2046
2047 .rotateIn {
2048 -webkit-animation-name: rotateIn;
2049 animation-name: rotateIn;
2050 }
2051
2052 @-webkit-keyframes rotateInDownLeft {
2053 0% {
2054 -webkit-transform-origin: left bottom;
2055 transform-origin: left bottom;
2056 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2057 transform: rotate3d(0, 0, 1, -45deg);
2058 opacity: 0;
2059 }
2060
2061 100% {
2062 -webkit-transform-origin: left bottom;
2063 transform-origin: left bottom;
2064 -webkit-transform: none;
2065 transform: none;
2066 opacity: 1;
2067 }
2068 }
2069
2070 @keyframes rotateInDownLeft {
2071 0% {
2072 -webkit-transform-origin: left bottom;
2073 transform-origin: left bottom;
2074 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2075 transform: rotate3d(0, 0, 1, -45deg);
2076 opacity: 0;
2077 }
2078
2079 100% {
2080 -webkit-transform-origin: left bottom;
2081 transform-origin: left bottom;
2082 -webkit-transform: none;
2083 transform: none;
2084 opacity: 1;
2085 }
2086 }
2087
2088 .rotateInDownLeft {
2089 -webkit-animation-name: rotateInDownLeft;
2090 animation-name: rotateInDownLeft;
2091 }
2092
2093 @-webkit-keyframes rotateInDownRight {
2094 0% {
2095 -webkit-transform-origin: right bottom;
2096 transform-origin: right bottom;
2097 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2098 transform: rotate3d(0, 0, 1, 45deg);
2099 opacity: 0;
2100 }
2101
2102 100% {
2103 -webkit-transform-origin: right bottom;
2104 transform-origin: right bottom;
2105 -webkit-transform: none;
2106 transform: none;
2107 opacity: 1;
2108 }
2109 }
2110
2111 @keyframes rotateInDownRight {
2112 0% {
2113 -webkit-transform-origin: right bottom;
2114 transform-origin: right bottom;
2115 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2116 transform: rotate3d(0, 0, 1, 45deg);
2117 opacity: 0;
2118 }
2119
2120 100% {
2121 -webkit-transform-origin: right bottom;
2122 transform-origin: right bottom;
2123 -webkit-transform: none;
2124 transform: none;
2125 opacity: 1;
2126 }
2127 }
2128
2129 .rotateInDownRight {
2130 -webkit-animation-name: rotateInDownRight;
2131 animation-name: rotateInDownRight;
2132 }
2133
2134 @-webkit-keyframes rotateInUpLeft {
2135 0% {
2136 -webkit-transform-origin: left bottom;
2137 transform-origin: left bottom;
2138 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2139 transform: rotate3d(0, 0, 1, 45deg);
2140 opacity: 0;
2141 }
2142
2143 100% {
2144 -webkit-transform-origin: left bottom;
2145 transform-origin: left bottom;
2146 -webkit-transform: none;
2147 transform: none;
2148 opacity: 1;
2149 }
2150 }
2151
2152 @keyframes rotateInUpLeft {
2153 0% {
2154 -webkit-transform-origin: left bottom;
2155 transform-origin: left bottom;
2156 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2157 transform: rotate3d(0, 0, 1, 45deg);
2158 opacity: 0;
2159 }
2160
2161 100% {
2162 -webkit-transform-origin: left bottom;
2163 transform-origin: left bottom;
2164 -webkit-transform: none;
2165 transform: none;
2166 opacity: 1;
2167 }
2168 }
2169
2170 .rotateInUpLeft {
2171 -webkit-animation-name: rotateInUpLeft;
2172 animation-name: rotateInUpLeft;
2173 }
2174
2175 @-webkit-keyframes rotateInUpRight {
2176 0% {
2177 -webkit-transform-origin: right bottom;
2178 transform-origin: right bottom;
2179 -webkit-transform: rotate3d(0, 0, 1, -90deg);
2180 transform: rotate3d(0, 0, 1, -90deg);
2181 opacity: 0;
2182 }
2183
2184 100% {
2185 -webkit-transform-origin: right bottom;
2186 transform-origin: right bottom;
2187 -webkit-transform: none;
2188 transform: none;
2189 opacity: 1;
2190 }
2191 }
2192
2193 @keyframes rotateInUpRight {
2194 0% {
2195 -webkit-transform-origin: right bottom;
2196 transform-origin: right bottom;
2197 -webkit-transform: rotate3d(0, 0, 1, -90deg);
2198 transform: rotate3d(0, 0, 1, -90deg);
2199 opacity: 0;
2200 }
2201
2202 100% {
2203 -webkit-transform-origin: right bottom;
2204 transform-origin: right bottom;
2205 -webkit-transform: none;
2206 transform: none;
2207 opacity: 1;
2208 }
2209 }
2210
2211 .rotateInUpRight {
2212 -webkit-animation-name: rotateInUpRight;
2213 animation-name: rotateInUpRight;
2214 }
2215
2216 @-webkit-keyframes rotateOut {
2217 0% {
2218 -webkit-transform-origin: center;
2219 transform-origin: center;
2220 opacity: 1;
2221 }
2222
2223 100% {
2224 -webkit-transform-origin: center;
2225 transform-origin: center;
2226 -webkit-transform: rotate3d(0, 0, 1, 200deg);
2227 transform: rotate3d(0, 0, 1, 200deg);
2228 opacity: 0;
2229 }
2230 }
2231
2232 @keyframes rotateOut {
2233 0% {
2234 -webkit-transform-origin: center;
2235 transform-origin: center;
2236 opacity: 1;
2237 }
2238
2239 100% {
2240 -webkit-transform-origin: center;
2241 transform-origin: center;
2242 -webkit-transform: rotate3d(0, 0, 1, 200deg);
2243 transform: rotate3d(0, 0, 1, 200deg);
2244 opacity: 0;
2245 }
2246 }
2247
2248 .rotateOut {
2249 -webkit-animation-name: rotateOut;
2250 animation-name: rotateOut;
2251 }
2252
2253 @-webkit-keyframes rotateOutDownLeft {
2254 0% {
2255 -webkit-transform-origin: left bottom;
2256 transform-origin: left bottom;
2257 opacity: 1;
2258 }
2259
2260 100% {
2261 -webkit-transform-origin: left bottom;
2262 transform-origin: left bottom;
2263 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2264 transform: rotate3d(0, 0, 1, 45deg);
2265 opacity: 0;
2266 }
2267 }
2268
2269 @keyframes rotateOutDownLeft {
2270 0% {
2271 -webkit-transform-origin: left bottom;
2272 transform-origin: left bottom;
2273 opacity: 1;
2274 }
2275
2276 100% {
2277 -webkit-transform-origin: left bottom;
2278 transform-origin: left bottom;
2279 -webkit-transform: rotate3d(0, 0, 1, 45deg);
2280 transform: rotate3d(0, 0, 1, 45deg);
2281 opacity: 0;
2282 }
2283 }
2284
2285 .rotateOutDownLeft {
2286 -webkit-animation-name: rotateOutDownLeft;
2287 animation-name: rotateOutDownLeft;
2288 }
2289
2290 @-webkit-keyframes rotateOutDownRight {
2291 0% {
2292 -webkit-transform-origin: right bottom;
2293 transform-origin: right bottom;
2294 opacity: 1;
2295 }
2296
2297 100% {
2298 -webkit-transform-origin: right bottom;
2299 transform-origin: right bottom;
2300 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2301 transform: rotate3d(0, 0, 1, -45deg);
2302 opacity: 0;
2303 }
2304 }
2305
2306 @keyframes rotateOutDownRight {
2307 0% {
2308 -webkit-transform-origin: right bottom;
2309 transform-origin: right bottom;
2310 opacity: 1;
2311 }
2312
2313 100% {
2314 -webkit-transform-origin: right bottom;
2315 transform-origin: right bottom;
2316 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2317 transform: rotate3d(0, 0, 1, -45deg);
2318 opacity: 0;
2319 }
2320 }
2321
2322 .rotateOutDownRight {
2323 -webkit-animation-name: rotateOutDownRight;
2324 animation-name: rotateOutDownRight;
2325 }
2326
2327 @-webkit-keyframes rotateOutUpLeft {
2328 0% {
2329 -webkit-transform-origin: left bottom;
2330 transform-origin: left bottom;
2331 opacity: 1;
2332 }
2333
2334 100% {
2335 -webkit-transform-origin: left bottom;
2336 transform-origin: left bottom;
2337 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2338 transform: rotate3d(0, 0, 1, -45deg);
2339 opacity: 0;
2340 }
2341 }
2342
2343 @keyframes rotateOutUpLeft {
2344 0% {
2345 -webkit-transform-origin: left bottom;
2346 transform-origin: left bottom;
2347 opacity: 1;
2348 }
2349
2350 100% {
2351 -webkit-transform-origin: left bottom;
2352 transform-origin: left bottom;
2353 -webkit-transform: rotate3d(0, 0, 1, -45deg);
2354 transform: rotate3d(0, 0, 1, -45deg);
2355 opacity: 0;
2356 }
2357 }
2358
2359 .rotateOutUpLeft {
2360 -webkit-animation-name: rotateOutUpLeft;
2361 animation-name: rotateOutUpLeft;
2362 }
2363
2364 @-webkit-keyframes rotateOutUpRight {
2365 0% {
2366 -webkit-transform-origin: right bottom;
2367 transform-origin: right bottom;
2368 opacity: 1;
2369 }
2370
2371 100% {
2372 -webkit-transform-origin: right bottom;
2373 transform-origin: right bottom;
2374 -webkit-transform: rotate3d(0, 0, 1, 90deg);
2375 transform: rotate3d(0, 0, 1, 90deg);
2376 opacity: 0;
2377 }
2378 }
2379
2380 @keyframes rotateOutUpRight {
2381 0% {
2382 -webkit-transform-origin: right bottom;
2383 transform-origin: right bottom;
2384 opacity: 1;
2385 }
2386
2387 100% {
2388 -webkit-transform-origin: right bottom;
2389 transform-origin: right bottom;
2390 -webkit-transform: rotate3d(0, 0, 1, 90deg);
2391 transform: rotate3d(0, 0, 1, 90deg);
2392 opacity: 0;
2393 }
2394 }
2395
2396 .rotateOutUpRight {
2397 -webkit-animation-name: rotateOutUpRight;
2398 animation-name: rotateOutUpRight;
2399 }
2400
2401 @-webkit-keyframes hinge {
2402 0% {
2403 -webkit-transform-origin: top left;
2404 transform-origin: top left;
2405 -webkit-animation-timing-function: ease-in-out;
2406 animation-timing-function: ease-in-out;
2407 }
2408
2409 20%, 60% {
2410 -webkit-transform: rotate3d(0, 0, 1, 80deg);
2411 transform: rotate3d(0, 0, 1, 80deg);
2412 -webkit-transform-origin: top left;
2413 transform-origin: top left;
2414 -webkit-animation-timing-function: ease-in-out;
2415 animation-timing-function: ease-in-out;
2416 }
2417
2418 40%, 80% {
2419 -webkit-transform: rotate3d(0, 0, 1, 60deg);
2420 transform: rotate3d(0, 0, 1, 60deg);
2421 -webkit-transform-origin: top left;
2422 transform-origin: top left;
2423 -webkit-animation-timing-function: ease-in-out;
2424 animation-timing-function: ease-in-out;
2425 opacity: 1;
2426 }
2427
2428 100% {
2429 -webkit-transform: translate3d(0, 700px, 0);
2430 transform: translate3d(0, 700px, 0);
2431 opacity: 0;
2432 }
2433 }
2434
2435 @keyframes hinge {
2436 0% {
2437 -webkit-transform-origin: top left;
2438 transform-origin: top left;
2439 -webkit-animation-timing-function: ease-in-out;
2440 animation-timing-function: ease-in-out;
2441 }
2442
2443 20%, 60% {
2444 -webkit-transform: rotate3d(0, 0, 1, 80deg);
2445 transform: rotate3d(0, 0, 1, 80deg);
2446 -webkit-transform-origin: top left;
2447 transform-origin: top left;
2448 -webkit-animation-timing-function: ease-in-out;
2449 animation-timing-function: ease-in-out;
2450 }
2451
2452 40%, 80% {
2453 -webkit-transform: rotate3d(0, 0, 1, 60deg);
2454 transform: rotate3d(0, 0, 1, 60deg);
2455 -webkit-transform-origin: top left;
2456 transform-origin: top left;
2457 -webkit-animation-timing-function: ease-in-out;
2458 animation-timing-function: ease-in-out;
2459 opacity: 1;
2460 }
2461
2462 100% {
2463 -webkit-transform: translate3d(0, 700px, 0);
2464 transform: translate3d(0, 700px, 0);
2465 opacity: 0;
2466 }
2467 }
2468
2469 .hinge {
2470 -webkit-animation-name: hinge;
2471 animation-name: hinge;
2472 }
2473
2474 /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2475
2476 @-webkit-keyframes rollIn {
2477 0% {
2478 opacity: 0;
2479 -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2480 transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2481 }
2482
2483 100% {
2484 opacity: 1;
2485 -webkit-transform: none;
2486 transform: none;
2487 }
2488 }
2489
2490 @keyframes rollIn {
2491 0% {
2492 opacity: 0;
2493 -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2494 transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2495 }
2496
2497 100% {
2498 opacity: 1;
2499 -webkit-transform: none;
2500 transform: none;
2501 }
2502 }
2503
2504 .rollIn {
2505 -webkit-animation-name: rollIn;
2506 animation-name: rollIn;
2507 }
2508
2509 /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2510
2511 @-webkit-keyframes rollOut {
2512 0% {
2513 opacity: 1;
2514 }
2515
2516 100% {
2517 opacity: 0;
2518 -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2519 transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2520 }
2521 }
2522
2523 @keyframes rollOut {
2524 0% {
2525 opacity: 1;
2526 }
2527
2528 100% {
2529 opacity: 0;
2530 -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2531 transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2532 }
2533 }
2534
2535 .rollOut {
2536 -webkit-animation-name: rollOut;
2537 animation-name: rollOut;
2538 }
2539
2540 @-webkit-keyframes zoomIn {
2541 0% {
2542 opacity: 0;
2543 -webkit-transform: scale3d(.3, .3, .3);
2544 transform: scale3d(.3, .3, .3);
2545 }
2546
2547 50% {
2548 opacity: 1;
2549 }
2550 }
2551
2552 @keyframes zoomIn {
2553 0% {
2554 opacity: 0;
2555 -webkit-transform: scale3d(.3, .3, .3);
2556 transform: scale3d(.3, .3, .3);
2557 }
2558
2559 50% {
2560 opacity: 1;
2561 }
2562 }
2563
2564 .zoomIn {
2565 -webkit-animation-name: zoomIn;
2566 animation-name: zoomIn;
2567 }
2568
2569 @-webkit-keyframes zoomInDown {
2570 0% {
2571 opacity: 0;
2572 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2573 transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2574 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2575 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2576 }
2577
2578 60% {
2579 opacity: 1;
2580 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2581 transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2582 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2583 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2584 }
2585 }
2586
2587 @keyframes zoomInDown {
2588 0% {
2589 opacity: 0;
2590 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2591 transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2592 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2593 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2594 }
2595
2596 60% {
2597 opacity: 1;
2598 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2599 transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2600 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2601 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2602 }
2603 }
2604
2605 .zoomInDown {
2606 -webkit-animation-name: zoomInDown;
2607 animation-name: zoomInDown;
2608 }
2609
2610 @-webkit-keyframes zoomInLeft {
2611 0% {
2612 opacity: 0;
2613 -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2614 transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2615 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2616 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2617 }
2618
2619 60% {
2620 opacity: 1;
2621 -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2622 transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2623 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2624 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2625 }
2626 }
2627
2628 @keyframes zoomInLeft {
2629 0% {
2630 opacity: 0;
2631 -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2632 transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2633 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2634 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2635 }
2636
2637 60% {
2638 opacity: 1;
2639 -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2640 transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2641 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2642 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2643 }
2644 }
2645
2646 .zoomInLeft {
2647 -webkit-animation-name: zoomInLeft;
2648 animation-name: zoomInLeft;
2649 }
2650
2651 @-webkit-keyframes zoomInRight {
2652 0% {
2653 opacity: 0;
2654 -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2655 transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2656 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2657 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2658 }
2659
2660 60% {
2661 opacity: 1;
2662 -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2663 transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2664 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2665 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2666 }
2667 }
2668
2669 @keyframes zoomInRight {
2670 0% {
2671 opacity: 0;
2672 -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2673 transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2674 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2675 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2676 }
2677
2678 60% {
2679 opacity: 1;
2680 -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2681 transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2682 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2683 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2684 }
2685 }
2686
2687 .zoomInRight {
2688 -webkit-animation-name: zoomInRight;
2689 animation-name: zoomInRight;
2690 }
2691
2692 @-webkit-keyframes zoomInUp {
2693 0% {
2694 opacity: 0;
2695 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2696 transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2697 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2698 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2699 }
2700
2701 60% {
2702 opacity: 1;
2703 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2704 transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2705 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2706 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2707 }
2708 }
2709
2710 @keyframes zoomInUp {
2711 0% {
2712 opacity: 0;
2713 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2714 transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2715 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2716 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2717 }
2718
2719 60% {
2720 opacity: 1;
2721 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2722 transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2723 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2724 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2725 }
2726 }
2727
2728 .zoomInUp {
2729 -webkit-animation-name: zoomInUp;
2730 animation-name: zoomInUp;
2731 }
2732
2733 @-webkit-keyframes zoomOut {
2734 0% {
2735 opacity: 1;
2736 }
2737
2738 50% {
2739 opacity: 0;
2740 -webkit-transform: scale3d(.3, .3, .3);
2741 transform: scale3d(.3, .3, .3);
2742 }
2743
2744 100% {
2745 opacity: 0;
2746 }
2747 }
2748
2749 @keyframes zoomOut {
2750 0% {
2751 opacity: 1;
2752 }
2753
2754 50% {
2755 opacity: 0;
2756 -webkit-transform: scale3d(.3, .3, .3);
2757 transform: scale3d(.3, .3, .3);
2758 }
2759
2760 100% {
2761 opacity: 0;
2762 }
2763 }
2764
2765 .zoomOut {
2766 -webkit-animation-name: zoomOut;
2767 animation-name: zoomOut;
2768 }
2769
2770 @-webkit-keyframes zoomOutDown {
2771 40% {
2772 opacity: 1;
2773 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2774 transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2775 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2776 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2777 }
2778
2779 100% {
2780 opacity: 0;
2781 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2782 transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2783 -webkit-transform-origin: center bottom;
2784 transform-origin: center bottom;
2785 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2786 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2787 }
2788 }
2789
2790 @keyframes zoomOutDown {
2791 40% {
2792 opacity: 1;
2793 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2794 transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2795 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2796 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2797 }
2798
2799 100% {
2800 opacity: 0;
2801 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2802 transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2803 -webkit-transform-origin: center bottom;
2804 transform-origin: center bottom;
2805 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2806 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2807 }
2808 }
2809
2810 .zoomOutDown {
2811 -webkit-animation-name: zoomOutDown;
2812 animation-name: zoomOutDown;
2813 }
2814
2815 @-webkit-keyframes zoomOutLeft {
2816 40% {
2817 opacity: 1;
2818 -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2819 transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2820 }
2821
2822 100% {
2823 opacity: 0;
2824 -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
2825 transform: scale(.1) translate3d(-2000px, 0, 0);
2826 -webkit-transform-origin: left center;
2827 transform-origin: left center;
2828 }
2829 }
2830
2831 @keyframes zoomOutLeft {
2832 40% {
2833 opacity: 1;
2834 -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2835 transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2836 }
2837
2838 100% {
2839 opacity: 0;
2840 -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
2841 transform: scale(.1) translate3d(-2000px, 0, 0);
2842 -webkit-transform-origin: left center;
2843 transform-origin: left center;
2844 }
2845 }
2846
2847 .zoomOutLeft {
2848 -webkit-animation-name: zoomOutLeft;
2849 animation-name: zoomOutLeft;
2850 }
2851
2852 @-webkit-keyframes zoomOutRight {
2853 40% {
2854 opacity: 1;
2855 -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
2856 transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
2857 }
2858
2859 100% {
2860 opacity: 0;
2861 -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
2862 transform: scale(.1) translate3d(2000px, 0, 0);
2863 -webkit-transform-origin: right center;
2864 transform-origin: right center;
2865 }
2866 }
2867
2868 @keyframes zoomOutRight {
2869 40% {
2870 opacity: 1;
2871 -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
2872 transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
2873 }
2874
2875 100% {
2876 opacity: 0;
2877 -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
2878 transform: scale(.1) translate3d(2000px, 0, 0);
2879 -webkit-transform-origin: right center;
2880 transform-origin: right center;
2881 }
2882 }
2883
2884 .zoomOutRight {
2885 -webkit-animation-name: zoomOutRight;
2886 animation-name: zoomOutRight;
2887 }
2888
2889 @-webkit-keyframes zoomOutUp {
2890 40% {
2891 opacity: 1;
2892 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2893 transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2894 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2895 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2896 }
2897
2898 100% {
2899 opacity: 0;
2900 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
2901 transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
2902 -webkit-transform-origin: center bottom;
2903 transform-origin: center bottom;
2904 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2905 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2906 }
2907 }
2908
2909 @keyframes zoomOutUp {
2910 40% {
2911 opacity: 1;
2912 -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2913 transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2914 -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2915 animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2916 }
2917
2918 100% {
2919 opacity: 0;
2920 -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
2921 transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
2922 -webkit-transform-origin: center bottom;
2923 transform-origin: center bottom;
2924 -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2925 animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2926 }
2927 }
2928
2929 .zoomOutUp {
2930 -webkit-animation-name: zoomOutUp;
2931 animation-name: zoomOutUp;
2932 }
2933
2934 @-webkit-keyframes slideInDown {
2935 0% {
2936 -webkit-transform: translate3d(0, -100%, 0);
2937 transform: translate3d(0, -100%, 0);
2938 visibility: visible;
2939 }
2940
2941 100% {
2942 -webkit-transform: translate3d(0, 0, 0);
2943 transform: translate3d(0, 0, 0);
2944 }
2945 }
2946
2947 @keyframes slideInDown {
2948 0% {
2949 -webkit-transform: translate3d(0, -100%, 0);
2950 transform: translate3d(0, -100%, 0);
2951 visibility: visible;
2952 }
2953
2954 100% {
2955 -webkit-transform: translate3d(0, 0, 0);
2956 transform: translate3d(0, 0, 0);
2957 }
2958 }
2959
2960 .slideInDown {
2961 -webkit-animation-name: slideInDown;
2962 animation-name: slideInDown;
2963 }
2964
2965 @-webkit-keyframes slideInLeft {
2966 0% {
2967 -webkit-transform: translate3d(-100%, 0, 0);
2968 transform: translate3d(-100%, 0, 0);
2969 visibility: visible;
2970 }
2971
2972 100% {
2973 -webkit-transform: translate3d(0, 0, 0);
2974 transform: translate3d(0, 0, 0);
2975 }
2976 }
2977
2978 @keyframes slideInLeft {
2979 0% {
2980 -webkit-transform: translate3d(-100%, 0, 0);
2981 transform: translate3d(-100%, 0, 0);
2982 visibility: visible;
2983 }
2984
2985 100% {
2986 -webkit-transform: translate3d(0, 0, 0);
2987 transform: translate3d(0, 0, 0);
2988 }
2989 }
2990
2991 .slideInLeft {
2992 -webkit-animation-name: slideInLeft;
2993 animation-name: slideInLeft;
2994 }
2995
2996 @-webkit-keyframes slideInRight {
2997 0% {
2998 -webkit-transform: translate3d(100%, 0, 0);
2999 transform: translate3d(100%, 0, 0);
3000 visibility: visible;
3001 }
3002
3003 100% {
3004 -webkit-transform: translate3d(0, 0, 0);
3005 transform: translate3d(0, 0, 0);
3006 }
3007 }
3008
3009 @keyframes slideInRight {
3010 0% {
3011 -webkit-transform: translate3d(100%, 0, 0);
3012 transform: translate3d(100%, 0, 0);
3013 visibility: visible;
3014 }
3015
3016 100% {
3017 -webkit-transform: translate3d(0, 0, 0);
3018 transform: translate3d(0, 0, 0);
3019 }
3020 }
3021
3022 .slideInRight {
3023 -webkit-animation-name: slideInRight;
3024 animation-name: slideInRight;
3025 }
3026
3027 @-webkit-keyframes slideInUp {
3028 0% {
3029 -webkit-transform: translate3d(0, 100%, 0);
3030 transform: translate3d(0, 100%, 0);
3031 visibility: visible;
3032 }
3033
3034 100% {
3035 -webkit-transform: translate3d(0, 0, 0);
3036 transform: translate3d(0, 0, 0);
3037 }
3038 }
3039
3040 @keyframes slideInUp {
3041 0% {
3042 -webkit-transform: translate3d(0, 100%, 0);
3043 transform: translate3d(0, 100%, 0);
3044 visibility: visible;
3045 }
3046
3047 100% {
3048 -webkit-transform: translate3d(0, 0, 0);
3049 transform: translate3d(0, 0, 0);
3050 }
3051 }
3052
3053 .slideInUp {
3054 -webkit-animation-name: slideInUp;
3055 animation-name: slideInUp;
3056 }
3057
3058 @-webkit-keyframes slideOutDown {
3059 0% {
3060 -webkit-transform: translate3d(0, 0, 0);
3061 transform: translate3d(0, 0, 0);
3062 }
3063
3064 100% {
3065 visibility: hidden;
3066 -webkit-transform: translate3d(0, 100%, 0);
3067 transform: translate3d(0, 100%, 0);
3068 }
3069 }
3070
3071 @keyframes slideOutDown {
3072 0% {
3073 -webkit-transform: translate3d(0, 0, 0);
3074 transform: translate3d(0, 0, 0);
3075 }
3076
3077 100% {
3078 visibility: hidden;
3079 -webkit-transform: translate3d(0, 100%, 0);
3080 transform: translate3d(0, 100%, 0);
3081 }
3082 }
3083
3084 .slideOutDown {
3085 -webkit-animation-name: slideOutDown;
3086 animation-name: slideOutDown;
3087 }
3088
3089 @-webkit-keyframes slideOutLeft {
3090 0% {
3091 -webkit-transform: translate3d(0, 0, 0);
3092 transform: translate3d(0, 0, 0);
3093 }
3094
3095 100% {
3096 visibility: hidden;
3097 -webkit-transform: translate3d(-100%, 0, 0);
3098 transform: translate3d(-100%, 0, 0);
3099 }
3100 }
3101
3102 @keyframes slideOutLeft {
3103 0% {
3104 -webkit-transform: translate3d(0, 0, 0);
3105 transform: translate3d(0, 0, 0);
3106 }
3107
3108 100% {
3109 visibility: hidden;
3110 -webkit-transform: translate3d(-100%, 0, 0);
3111 transform: translate3d(-100%, 0, 0);
3112 }
3113 }
3114
3115 .slideOutLeft {
3116 -webkit-animation-name: slideOutLeft;
3117 animation-name: slideOutLeft;
3118 }
3119
3120 @-webkit-keyframes slideOutRight {
3121 0% {
3122 -webkit-transform: translate3d(0, 0, 0);
3123 transform: translate3d(0, 0, 0);
3124 }
3125
3126 100% {
3127 visibility: hidden;
3128 -webkit-transform: translate3d(100%, 0, 0);
3129 transform: translate3d(100%, 0, 0);
3130 }
3131 }
3132
3133 @keyframes slideOutRight {
3134 0% {
3135 -webkit-transform: translate3d(0, 0, 0);
3136 transform: translate3d(0, 0, 0);
3137 }
3138
3139 100% {
3140 visibility: hidden;
3141 -webkit-transform: translate3d(100%, 0, 0);
3142 transform: translate3d(100%, 0, 0);
3143 }
3144 }
3145
3146 .slideOutRight {
3147 -webkit-animation-name: slideOutRight;
3148 animation-name: slideOutRight;
3149 }
3150
3151 @-webkit-keyframes slideOutUp {
3152 0% {
3153 -webkit-transform: translate3d(0, 0, 0);
3154 transform: translate3d(0, 0, 0);
3155 }
3156
3157 100% {
3158 visibility: hidden;
3159 -webkit-transform: translate3d(0, -100%, 0);
3160 transform: translate3d(0, -100%, 0);
3161 }
3162 }
3163
3164 @keyframes slideOutUp {
3165 0% {
3166 -webkit-transform: translate3d(0, 0, 0);
3167 transform: translate3d(0, 0, 0);
3168 }
3169
3170 100% {
3171 visibility: hidden;
3172 -webkit-transform: translate3d(0, -100%, 0);
3173 transform: translate3d(0, -100%, 0);
3174 }
3175 }
3176
3177 .slideOutUp {
3178 -webkit-animation-name: slideOutUp;
3179 animation-name: slideOutUp;
3180 }
33 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
44 */
55
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,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);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:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.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,#d9534f 0,#c12e2a 100%);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:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.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,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', 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,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', 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,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', 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,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', 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)}
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)}
33 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
44 */
55
6 /*! normalize.css v3.0.0 | MIT License | git.io/normalize */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,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px 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{-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]{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;-moz-box-sizing:content-box;-webkit-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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-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}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>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;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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.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,.h4,h5,.h5,h6,.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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{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-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{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[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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 p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{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:0}.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:0}.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-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{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:0}.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:0}.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-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{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:0}.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:0}.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-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{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>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width: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;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=radio],input[type=checkbox]{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=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;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;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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.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}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{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;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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 .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;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:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{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:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{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:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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.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:"\2a"}.glyphicon-plus:before{content:"\2b"}.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"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.33;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}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].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}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control: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=radio],.input-group-addon input[type=checkbox]{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:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-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:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{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{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.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:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.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{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs-justified>.active>a:focus{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:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;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;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-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{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-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{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;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;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;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{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-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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 .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{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-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{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:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{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:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@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:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:hover,.pager li>a:focus{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:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right: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:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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:#428bca;-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;transition:width .6s ease}.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: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-size:40px 40px}.progress.active .progress-bar{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{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-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.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{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;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);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!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}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}
6 /*! normalize.css v3.0.0 | MIT License | git.io/normalize */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,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px 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{-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]{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;-moz-box-sizing:content-box;-webkit-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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-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}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2e97bd;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>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;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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.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,.h4,h5,.h5,h6,.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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#2e97bd}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#2e97bd}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{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-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{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[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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 p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{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:0}.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:0}.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-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{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:0}.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:0}.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-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{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:0}.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:0}.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-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{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>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width: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;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=radio],input[type=checkbox]{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=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;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;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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.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}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{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;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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 .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;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:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#2e97bd;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#2e97bd;border-color:#357ebd}.btn-primary .badge{color:#2e97bd;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{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:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{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:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#2e97bd;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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.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:"\2a"}.glyphicon-plus:before{content:"\2b"}.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"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#2e97bd}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.33;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}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].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}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control: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=radio],.input-group-addon input[type=checkbox]{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:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-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:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{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{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#2e97bd}.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:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#2e97bd}.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{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs-justified>.active>a:focus{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:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;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;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-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{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-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{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;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;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;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{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-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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 .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{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-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{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:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{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:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@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:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#2e97bd;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#2e97bd;border-color:#2e97bd;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:hover,.pager li>a:focus{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:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#2e97bd}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2e97bd;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right: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:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2e97bd}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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:#2e97bd;-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;transition:width .6s ease}.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: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-size:40px 40px}.progress.active .progress-bar{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#2e97bd;border-color:#2e97bd}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{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-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th: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 th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.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 td:first-child,.panel>.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 td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.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 td:last-child,.panel>.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 td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.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{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#2e97bd}.panel-primary>.panel-heading{color:#fff;background-color:#2e97bd;border-color:#2e97bd}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#2e97bd}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#2e97bd}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;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);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!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}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}
0 // Faraday Penetration Test IDE - Community Version
0 // Faraday Penetration Test IDE
11 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
22 // See the file 'doc/LICENSE' for the license information
33
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 function htmlentities(string, quote_style, charset, double_encode) {
15 var hash_map = translationtable('HTML_ENTITIES', quote_style), symbol = '';
26 string = string == null ? '' : string + '';
0 !function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function E(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function A(n){return ya(n,_a),n}function N(n){return"function"==typeof n?n:function(){return Ma(n,this)}}function C(n){return"function"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function q(n){return n.trim().replace(/\s+/g," ")}function L(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",q(u+" "+n))):e.setAttribute("class",q(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=$;a>0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n.toLowerCase()))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=sc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&cc!==jt,o=new(i?jt:cc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Xt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function $t(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Wt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Jt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function le(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function se(n,t){n&&dc.hasOwnProperty(n.type)&&dc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function _e(n,t){n*=Da;var e=Math.cos(t*=Da);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++xc,_c+=(n-_c)/xc,wc+=(t-wc)/xc,Sc+=(e-Sc)/xc}function Se(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);bc+=l,kc+=l*(t+(t=o)),Ec+=l*(e+(e=a)),Ac+=l*(r+(r=c)),we(t,e,r)}var t,e,r;qc.point=function(u,i){u*=Da;var o=Math.cos(i*=Da);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),qc.point=n,we(t,e,r)}}function ke(){qc.point=_e}function Ee(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Nc+=p*l,Cc+=p*s,zc+=p*f,bc+=v,kc+=v*(r+(r=o)),Ec+=v*(u+(u=a)),Ac+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;qc.point=function(o,a){t=o,e=a,qc.point=n,o*=Da;var c=Math.cos(a*=Da);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},qc.lineEnd=function(){n(t,e),qc.lineEnd=ke,qc.point=_e}}function Ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ne(){return!0}function Ce(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(be(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function qe(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Le(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+o)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-a)<Ca&&(i-=a*Ca),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return ga(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Fe(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;yc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)<Ca,C=N||Ca>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)<Ca?k:E):k<=b[1]&&b[1]<=E:A>qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c
1 },polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=qa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ar(n){return n[0]}function Nr(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),Xr(c);for(var l=o;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)o=l.N,a.push(l),Pr(l),l=o;a.push(l),Xr(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Yr(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}tl.insert(y,m),y||(nl=m)}}}}function Xr(n){var t=n.circle;t&&(t.P||(nl=t.N),tl.remove(t),rl.push(t),tu(t),n.circle=null)}function $r(n){for(var t,e=Gc,r=Oe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Wr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Jr(n,t,e,r){var u=new Wr(n,t);return Gc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Kc[n.i].edges.push(new Qr(u,n,t)),Kc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Wr(n,null);return r.a=t,r.b=e,Gc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Gc=[],Kc=new Array(n.length),Qc=new nu,tl=new nu;;)if(u=nl,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Kc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&($r(t),Ir(t));var o={cells:Kc,edges:Gc};return Qc=tl=Gc=Kc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function lu(n){return n.y}function su(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function Uu(n,t){return n[0]*t[0]+n[1]*t[1]}function ju(n){var t=Math.sqrt(Uu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Fu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:vu(a[0],c[0])},{i:3,x:vu(a[1],c[1])})):r.push(c[0]||c[1]?"translate("+c+")":""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Ou(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Yu(n){for(var t=n.source,e=n.target,r=Vu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Zu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Vu(n,t){if(n===t)return n;for(var e=Zu(n),r=Zu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Xu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Bu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Wu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Gu(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ri,n}function Ku(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ni(n){return n.children}function ti(n){return n.value}function ei(n,t){return t.value-n.value}function ri(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ui(n){return n.x}function ii(n){return n.y}function oi(n,t,e){n.y0=t,n.y=e}function ai(n){return ta.range(n.length)}function ci(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function li(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?mi(r,u=a):mi(r=c,u),o--):(di(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)_i(u[i],t,e,r)}function wi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Si(n,t){return n.parent==t.parent?1:2}function ki(n){var t=n.children;return t.length?t[0]:n.t}function Ei(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ai(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ni(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++o<a;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+a)|0;return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Pi(t.a[0])},e.copy=function(){return Qi(n,t)},e.domain(n)}function no(n,t){function i(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ta.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ta.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},o.range=function(n){return arguments.length?(t=n,i()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return no(n,t)},i()}function to(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ar,r=Nr,u=Ne,i=go,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=El.get(n)||go).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function go(n){return n.join("L")}function po(n){return go(n)+"Z"}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Mo(n,t){return n.length<4?go(n):n[1]+_o(n.slice(1,-1),wo(n,t))}function xo(n,t){return n.length<3?go(n):n[0]+_o((n.push(n[0]),n),wo([n[n.length-2]].concat(n,[n[1]]),t))}function bo(n,t){return n.length<3?go(n):n[0]+_o(n,wo(n,t))}function _o(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return go(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function wo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function So(n){if(n.length<3)return go(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",No(Cl,o),",",No(Cl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Co(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ko(n){if(n.length<4)return go(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(No(Cl,i)+","+No(Cl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Co(e,i,o);return e.join("")}function Eo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[No(Cl,o),",",No(Cl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Co(t,o,a);return t.join("")}function Ao(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return So(n)}function No(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Co(n,t,e){n.push("C",No(Al,t),",",No(Al,e),",",No(Nl,t),",",No(Nl,e),",",No(Cl,t),",",No(Cl,e))}function zo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=zo(u,i);++t<e;)r[t]=(o+(o=zo(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=qo(n),a=-1,c=n.length-1;++a<c;)t=zo(n[a],n[a+1]),ga(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Do(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ar,r=Ar,u=0,i=Nr,o=Ne,a=go,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r
2 },t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=El.get(n)||go).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Po(n){return n.radius}function Uo(n){return[n.x,n.y]}function jo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fo(){return 64}function Ho(){return"circle"}function Oo(n){var t=Math.sqrt(n/qa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yo(n,t,e){return ya(n,Pl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var a=u.time;o=i[r]={tween:new l,time:a,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]<Vl[i]/u?i-1:i]:[Bl,Vi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Pi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Fi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.5"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)u(e=+n[o])&&(r+=e);else for(;++o<i;)u(e=+t.call(n,n[o],o))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)u(e=r(n[a]))?i+=e:--c;else for(;++a<o;)u(e=r(t.call(n,n[a],a)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,o=[],a=n.length,c=-1;if(1===arguments.length)for(;++c<a;)u(i=r(n[c]))&&o.push(i);else for(;++c<a;)u(i=r(t.call(n,n[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,o=n.length,a=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<o;)u(e=r(n[l]))&&(i=e-a,a+=i/++s,c+=i*(e-a));else for(;++l<o;)u(e=r(t.call(n,n[l],l)))&&(i=e-a,a+=i/++s,c+=i*(e-a));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var pa="__proto__",va="\x00";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,o,a){if(a>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g<p;)(h=d.get(c=v(s=o[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,a))}):(s={},f=function(e,r){s[e]=n(t,r,a)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return A(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return A(r)};var wa={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var a=Z([]),c=A([]),s=A([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return c.enter=function(){return a},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return A(o)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return"string"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),A([e])},ta.selectAll=function(n){var t;return"string"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),A([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||n({type:"zoomend"}),d=null}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(v=e(d=m||ta.mouse(this)),Dl.call(this),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t
3 },reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)se(e[r].geometry,t)}},dc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)se(e[r],t)}};ta.geo.area=function(n){return mc=0,ta.geo.stream(n,Mc),mc};var mc,yc=new ce,Mc={sphere:function(){mc+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){yc.reset(),Mc.lineStart=ge},polygonEnd:function(){var n=2*yc;mc+=0>n?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Mc.polygonStart()},polygonEnd:function(){Mc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>yc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Ar,r=Nr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Jc),n};var Jc=ta.geom.polygon.prototype=[];Jc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Jc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Jc.clip=function(n){for(var t,e,r,u,i,o,a=Tr(n),c=-1,l=this.length-Tr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],qr(o,s,u)?(qr(i,s,u)||n.push(Lr(i,o,s,u)),n.push(o)):qr(i,s,u)&&n.push(Lr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Gc,Kc,Qc,nl,tl,el=[],rl=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Yr),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?ul:n,t):a===ul?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===ul?null:a&&a[1]},t)};var ul=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Ar,c=Nr;return(o=arguments.length)?(a=cu,c=lu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=gu,ta.interpolateObject=pu,ta.interpolateNumber=vu,ta.interpolateString=du;var il=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ol=new RegExp(il.source,"g");ta.interpolate=mu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ga.has(t)||/^(#|rgb\(|hsl\()/.test(t)?gu:du:t instanceof ot?gu:Array.isArray(t)?yu:"object"===e&&isNaN(t)?pu:vu)(n,t)}],ta.interpolateArray=yu;var al=function(){return y},cl=ta.map({linear:al,poly:ku,quad:function(){return _u},cubic:function(){return wu},sin:function(){return Eu},exp:function(){return Au},circle:function(){return Nu},elastic:Cu,back:zu,bounce:function(){return qu}}),ll=ta.map({"in":y,out:xu,"in-out":bu,"out-in":function(n){return bu(xu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(y-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Ju(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(M=n,a):M},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Gu(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Ri,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));
4 return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ri(t):Di(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Di(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ri:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Gu(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Yo(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Dl:Io(Xo(n)))};var Tl,Rl,Dl=Io(Xo()),Pl=[],Ul=0;Pl.call=_a.call,Pl.empty=_a.empty,Pl.node=_a.node,Pl.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Tl?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Pl,Pl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=N(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yo(o,i,u)},Pl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Yo(c,a,o)},Pl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),A&&m(n,l,0)&&(r(k),t=!0),N&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Ui(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}();
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 function treemap(workspace, design, view){
15 var margin = {top: 28, right: 10, bottom: 10, left: 10},
26 width = 160 - margin.left - margin.right,
229233 "med": "#DFBF35",
230234 "critical": "#8B00FF",
231235 "high": "#DF3936",
232 "info": "#858585"
236 "info": "#428BCA"
233237 };
234238
235239 // Total size of all segments; we set this later, after loading the data.
0 /*!
1 * jQuery JavaScript Library v1.11.2
2 * http://jquery.com/
3 *
4 * Includes Sizzle.js
5 * http://sizzlejs.com/
6 *
7 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
8 * Released under the MIT license
9 * http://jquery.org/license
10 *
11 * Date: 2014-12-17T15:27Z
12 */
13
14 (function( global, factory ) {
15
16 if ( typeof module === "object" && typeof module.exports === "object" ) {
17 // For CommonJS and CommonJS-like environments where a proper window is present,
18 // execute the factory and get jQuery
19 // For environments that do not inherently posses a window with a document
20 // (such as Node.js), expose a jQuery-making factory as module.exports
21 // This accentuates the need for the creation of a real window
22 // e.g. var jQuery = require("jquery")(window);
23 // See ticket #14549 for more info
24 module.exports = global.document ?
25 factory( global, true ) :
26 function( w ) {
27 if ( !w.document ) {
28 throw new Error( "jQuery requires a window with a document" );
29 }
30 return factory( w );
31 };
32 } else {
33 factory( global );
34 }
35
36 // Pass this if window is not defined yet
37 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
38
39 // Can't do this because several apps including ASP.NET trace
40 // the stack via arguments.caller.callee and Firefox dies if
41 // you try to trace through "use strict" call chains. (#13335)
42 // Support: Firefox 18+
43 //
44
45 var deletedIds = [];
46
47 var slice = deletedIds.slice;
48
49 var concat = deletedIds.concat;
50
51 var push = deletedIds.push;
52
53 var indexOf = deletedIds.indexOf;
54
55 var class2type = {};
56
57 var toString = class2type.toString;
58
59 var hasOwn = class2type.hasOwnProperty;
60
61 var support = {};
62
63
64
65 var
66 version = "1.11.2",
67
68 // Define a local copy of jQuery
69 jQuery = function( selector, context ) {
70 // The jQuery object is actually just the init constructor 'enhanced'
71 // Need init if jQuery is called (just allow error to be thrown if not included)
72 return new jQuery.fn.init( selector, context );
73 },
74
75 // Support: Android<4.1, IE<9
76 // Make sure we trim BOM and NBSP
77 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
78
79 // Matches dashed string for camelizing
80 rmsPrefix = /^-ms-/,
81 rdashAlpha = /-([\da-z])/gi,
82
83 // Used by jQuery.camelCase as callback to replace()
84 fcamelCase = function( all, letter ) {
85 return letter.toUpperCase();
86 };
87
88 jQuery.fn = jQuery.prototype = {
89 // The current version of jQuery being used
90 jquery: version,
91
92 constructor: jQuery,
93
94 // Start with an empty selector
95 selector: "",
96
97 // The default length of a jQuery object is 0
98 length: 0,
99
100 toArray: function() {
101 return slice.call( this );
102 },
103
104 // Get the Nth element in the matched element set OR
105 // Get the whole matched element set as a clean array
106 get: function( num ) {
107 return num != null ?
108
109 // Return just the one element from the set
110 ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
111
112 // Return all the elements in a clean array
113 slice.call( this );
114 },
115
116 // Take an array of elements and push it onto the stack
117 // (returning the new matched element set)
118 pushStack: function( elems ) {
119
120 // Build a new jQuery matched element set
121 var ret = jQuery.merge( this.constructor(), elems );
122
123 // Add the old object onto the stack (as a reference)
124 ret.prevObject = this;
125 ret.context = this.context;
126
127 // Return the newly-formed element set
128 return ret;
129 },
130
131 // Execute a callback for every element in the matched set.
132 // (You can seed the arguments with an array of args, but this is
133 // only used internally.)
134 each: function( callback, args ) {
135 return jQuery.each( this, callback, args );
136 },
137
138 map: function( callback ) {
139 return this.pushStack( jQuery.map(this, function( elem, i ) {
140 return callback.call( elem, i, elem );
141 }));
142 },
143
144 slice: function() {
145 return this.pushStack( slice.apply( this, arguments ) );
146 },
147
148 first: function() {
149 return this.eq( 0 );
150 },
151
152 last: function() {
153 return this.eq( -1 );
154 },
155
156 eq: function( i ) {
157 var len = this.length,
158 j = +i + ( i < 0 ? len : 0 );
159 return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
160 },
161
162 end: function() {
163 return this.prevObject || this.constructor(null);
164 },
165
166 // For internal use only.
167 // Behaves like an Array's method, not like a jQuery method.
168 push: push,
169 sort: deletedIds.sort,
170 splice: deletedIds.splice
171 };
172
173 jQuery.extend = jQuery.fn.extend = function() {
174 var src, copyIsArray, copy, name, options, clone,
175 target = arguments[0] || {},
176 i = 1,
177 length = arguments.length,
178 deep = false;
179
180 // Handle a deep copy situation
181 if ( typeof target === "boolean" ) {
182 deep = target;
183
184 // skip the boolean and the target
185 target = arguments[ i ] || {};
186 i++;
187 }
188
189 // Handle case when target is a string or something (possible in deep copy)
190 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
191 target = {};
192 }
193
194 // extend jQuery itself if only one argument is passed
195 if ( i === length ) {
196 target = this;
197 i--;
198 }
199
200 for ( ; i < length; i++ ) {
201 // Only deal with non-null/undefined values
202 if ( (options = arguments[ i ]) != null ) {
203 // Extend the base object
204 for ( name in options ) {
205 src = target[ name ];
206 copy = options[ name ];
207
208 // Prevent never-ending loop
209 if ( target === copy ) {
210 continue;
211 }
212
213 // Recurse if we're merging plain objects or arrays
214 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
215 if ( copyIsArray ) {
216 copyIsArray = false;
217 clone = src && jQuery.isArray(src) ? src : [];
218
219 } else {
220 clone = src && jQuery.isPlainObject(src) ? src : {};
221 }
222
223 // Never move original objects, clone them
224 target[ name ] = jQuery.extend( deep, clone, copy );
225
226 // Don't bring in undefined values
227 } else if ( copy !== undefined ) {
228 target[ name ] = copy;
229 }
230 }
231 }
232 }
233
234 // Return the modified object
235 return target;
236 };
237
238 jQuery.extend({
239 // Unique for each copy of jQuery on the page
240 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
241
242 // Assume jQuery is ready without the ready module
243 isReady: true,
244
245 error: function( msg ) {
246 throw new Error( msg );
247 },
248
249 noop: function() {},
250
251 // See test/unit/core.js for details concerning isFunction.
252 // Since version 1.3, DOM methods and functions like alert
253 // aren't supported. They return false on IE (#2968).
254 isFunction: function( obj ) {
255 return jQuery.type(obj) === "function";
256 },
257
258 isArray: Array.isArray || function( obj ) {
259 return jQuery.type(obj) === "array";
260 },
261
262 isWindow: function( obj ) {
263 /* jshint eqeqeq: false */
264 return obj != null && obj == obj.window;
265 },
266
267 isNumeric: function( obj ) {
268 // parseFloat NaNs numeric-cast false positives (null|true|false|"")
269 // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
270 // subtraction forces infinities to NaN
271 // adding 1 corrects loss of precision from parseFloat (#15100)
272 return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
273 },
274
275 isEmptyObject: function( obj ) {
276 var name;
277 for ( name in obj ) {
278 return false;
279 }
280 return true;
281 },
282
283 isPlainObject: function( obj ) {
284 var key;
285
286 // Must be an Object.
287 // Because of IE, we also have to check the presence of the constructor property.
288 // Make sure that DOM nodes and window objects don't pass through, as well
289 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
290 return false;
291 }
292
293 try {
294 // Not own constructor property must be Object
295 if ( obj.constructor &&
296 !hasOwn.call(obj, "constructor") &&
297 !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
298 return false;
299 }
300 } catch ( e ) {
301 // IE8,9 Will throw exceptions on certain host objects #9897
302 return false;
303 }
304
305 // Support: IE<9
306 // Handle iteration over inherited properties before own properties.
307 if ( support.ownLast ) {
308 for ( key in obj ) {
309 return hasOwn.call( obj, key );
310 }
311 }
312
313 // Own properties are enumerated firstly, so to speed up,
314 // if last one is own, then all properties are own.
315 for ( key in obj ) {}
316
317 return key === undefined || hasOwn.call( obj, key );
318 },
319
320 type: function( obj ) {
321 if ( obj == null ) {
322 return obj + "";
323 }
324 return typeof obj === "object" || typeof obj === "function" ?
325 class2type[ toString.call(obj) ] || "object" :
326 typeof obj;
327 },
328
329 // Evaluates a script in a global context
330 // Workarounds based on findings by Jim Driscoll
331 // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
332 globalEval: function( data ) {
333 if ( data && jQuery.trim( data ) ) {
334 // We use execScript on Internet Explorer
335 // We use an anonymous function so that context is window
336 // rather than jQuery in Firefox
337 ( window.execScript || function( data ) {
338 window[ "eval" ].call( window, data );
339 } )( data );
340 }
341 },
342
343 // Convert dashed to camelCase; used by the css and data modules
344 // Microsoft forgot to hump their vendor prefix (#9572)
345 camelCase: function( string ) {
346 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
347 },
348
349 nodeName: function( elem, name ) {
350 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
351 },
352
353 // args is for internal usage only
354 each: function( obj, callback, args ) {
355 var value,
356 i = 0,
357 length = obj.length,
358 isArray = isArraylike( obj );
359
360 if ( args ) {
361 if ( isArray ) {
362 for ( ; i < length; i++ ) {
363 value = callback.apply( obj[ i ], args );
364
365 if ( value === false ) {
366 break;
367 }
368 }
369 } else {
370 for ( i in obj ) {
371 value = callback.apply( obj[ i ], args );
372
373 if ( value === false ) {
374 break;
375 }
376 }
377 }
378
379 // A special, fast, case for the most common use of each
380 } else {
381 if ( isArray ) {
382 for ( ; i < length; i++ ) {
383 value = callback.call( obj[ i ], i, obj[ i ] );
384
385 if ( value === false ) {
386 break;
387 }
388 }
389 } else {
390 for ( i in obj ) {
391 value = callback.call( obj[ i ], i, obj[ i ] );
392
393 if ( value === false ) {
394 break;
395 }
396 }
397 }
398 }
399
400 return obj;
401 },
402
403 // Support: Android<4.1, IE<9
404 trim: function( text ) {
405 return text == null ?
406 "" :
407 ( text + "" ).replace( rtrim, "" );
408 },
409
410 // results is for internal usage only
411 makeArray: function( arr, results ) {
412 var ret = results || [];
413
414 if ( arr != null ) {
415 if ( isArraylike( Object(arr) ) ) {
416 jQuery.merge( ret,
417 typeof arr === "string" ?
418 [ arr ] : arr
419 );
420 } else {
421 push.call( ret, arr );
422 }
423 }
424
425 return ret;
426 },
427
428 inArray: function( elem, arr, i ) {
429 var len;
430
431 if ( arr ) {
432 if ( indexOf ) {
433 return indexOf.call( arr, elem, i );
434 }
435
436 len = arr.length;
437 i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
438
439 for ( ; i < len; i++ ) {
440 // Skip accessing in sparse arrays
441 if ( i in arr && arr[ i ] === elem ) {
442 return i;
443 }
444 }
445 }
446
447 return -1;
448 },
449
450 merge: function( first, second ) {
451 var len = +second.length,
452 j = 0,
453 i = first.length;
454
455 while ( j < len ) {
456 first[ i++ ] = second[ j++ ];
457 }
458
459 // Support: IE<9
460 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
461 if ( len !== len ) {
462 while ( second[j] !== undefined ) {
463 first[ i++ ] = second[ j++ ];
464 }
465 }
466
467 first.length = i;
468
469 return first;
470 },
471
472 grep: function( elems, callback, invert ) {
473 var callbackInverse,
474 matches = [],
475 i = 0,
476 length = elems.length,
477 callbackExpect = !invert;
478
479 // Go through the array, only saving the items
480 // that pass the validator function
481 for ( ; i < length; i++ ) {
482 callbackInverse = !callback( elems[ i ], i );
483 if ( callbackInverse !== callbackExpect ) {
484 matches.push( elems[ i ] );
485 }
486 }
487
488 return matches;
489 },
490
491 // arg is for internal usage only
492 map: function( elems, callback, arg ) {
493 var value,
494 i = 0,
495 length = elems.length,
496 isArray = isArraylike( elems ),
497 ret = [];
498
499 // Go through the array, translating each of the items to their new values
500 if ( isArray ) {
501 for ( ; i < length; i++ ) {
502 value = callback( elems[ i ], i, arg );
503
504 if ( value != null ) {
505 ret.push( value );
506 }
507 }
508
509 // Go through every key on the object,
510 } else {
511 for ( i in elems ) {
512 value = callback( elems[ i ], i, arg );
513
514 if ( value != null ) {
515 ret.push( value );
516 }
517 }
518 }
519
520 // Flatten any nested arrays
521 return concat.apply( [], ret );
522 },
523
524 // A global GUID counter for objects
525 guid: 1,
526
527 // Bind a function to a context, optionally partially applying any
528 // arguments.
529 proxy: function( fn, context ) {
530 var args, proxy, tmp;
531
532 if ( typeof context === "string" ) {
533 tmp = fn[ context ];
534 context = fn;
535 fn = tmp;
536 }
537
538 // Quick check to determine if target is callable, in the spec
539 // this throws a TypeError, but we will just return undefined.
540 if ( !jQuery.isFunction( fn ) ) {
541 return undefined;
542 }
543
544 // Simulated bind
545 args = slice.call( arguments, 2 );
546 proxy = function() {
547 return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
548 };
549
550 // Set the guid of unique handler to the same of original handler, so it can be removed
551 proxy.guid = fn.guid = fn.guid || jQuery.guid++;
552
553 return proxy;
554 },
555
556 now: function() {
557 return +( new Date() );
558 },
559
560 // jQuery.support is not used in Core but other projects attach their
561 // properties to it so it needs to exist.
562 support: support
563 });
564
565 // Populate the class2type map
566 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
567 class2type[ "[object " + name + "]" ] = name.toLowerCase();
568 });
569
570 function isArraylike( obj ) {
571 var length = obj.length,
572 type = jQuery.type( obj );
573
574 if ( type === "function" || jQuery.isWindow( obj ) ) {
575 return false;
576 }
577
578 if ( obj.nodeType === 1 && length ) {
579 return true;
580 }
581
582 return type === "array" || length === 0 ||
583 typeof length === "number" && length > 0 && ( length - 1 ) in obj;
584 }
585 var Sizzle =
586 /*!
587 * Sizzle CSS Selector Engine v2.2.0-pre
588 * http://sizzlejs.com/
589 *
590 * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
591 * Released under the MIT license
592 * http://jquery.org/license
593 *
594 * Date: 2014-12-16
595 */
596 (function( window ) {
597
598 var i,
599 support,
600 Expr,
601 getText,
602 isXML,
603 tokenize,
604 compile,
605 select,
606 outermostContext,
607 sortInput,
608 hasDuplicate,
609
610 // Local document vars
611 setDocument,
612 document,
613 docElem,
614 documentIsHTML,
615 rbuggyQSA,
616 rbuggyMatches,
617 matches,
618 contains,
619
620 // Instance-specific data
621 expando = "sizzle" + 1 * new Date(),
622 preferredDoc = window.document,
623 dirruns = 0,
624 done = 0,
625 classCache = createCache(),
626 tokenCache = createCache(),
627 compilerCache = createCache(),
628 sortOrder = function( a, b ) {
629 if ( a === b ) {
630 hasDuplicate = true;
631 }
632 return 0;
633 },
634
635 // General-purpose constants
636 MAX_NEGATIVE = 1 << 31,
637
638 // Instance methods
639 hasOwn = ({}).hasOwnProperty,
640 arr = [],
641 pop = arr.pop,
642 push_native = arr.push,
643 push = arr.push,
644 slice = arr.slice,
645 // Use a stripped-down indexOf as it's faster than native
646 // http://jsperf.com/thor-indexof-vs-for/5
647 indexOf = function( list, elem ) {
648 var i = 0,
649 len = list.length;
650 for ( ; i < len; i++ ) {
651 if ( list[i] === elem ) {
652 return i;
653 }
654 }
655 return -1;
656 },
657
658 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
659
660 // Regular expressions
661
662 // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
663 whitespace = "[\\x20\\t\\r\\n\\f]",
664 // http://www.w3.org/TR/css3-syntax/#characters
665 characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
666
667 // Loosely modeled on CSS identifier characters
668 // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
669 // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
670 identifier = characterEncoding.replace( "w", "w#" ),
671
672 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
673 attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
674 // Operator (capture 2)
675 "*([*^$|!~]?=)" + whitespace +
676 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
677 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
678 "*\\]",
679
680 pseudos = ":(" + characterEncoding + ")(?:\\((" +
681 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
682 // 1. quoted (capture 3; capture 4 or capture 5)
683 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
684 // 2. simple (capture 6)
685 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
686 // 3. anything else (capture 2)
687 ".*" +
688 ")\\)|)",
689
690 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
691 rwhitespace = new RegExp( whitespace + "+", "g" ),
692 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
693
694 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
695 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
696
697 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
698
699 rpseudo = new RegExp( pseudos ),
700 ridentifier = new RegExp( "^" + identifier + "$" ),
701
702 matchExpr = {
703 "ID": new RegExp( "^#(" + characterEncoding + ")" ),
704 "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
705 "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
706 "ATTR": new RegExp( "^" + attributes ),
707 "PSEUDO": new RegExp( "^" + pseudos ),
708 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
709 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
710 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
711 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
712 // For use in libraries implementing .is()
713 // We use this for POS matching in `select`
714 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
715 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
716 },
717
718 rinputs = /^(?:input|select|textarea|button)$/i,
719 rheader = /^h\d$/i,
720
721 rnative = /^[^{]+\{\s*\[native \w/,
722
723 // Easily-parseable/retrievable ID or TAG or CLASS selectors
724 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
725
726 rsibling = /[+~]/,
727 rescape = /'|\\/g,
728
729 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
730 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
731 funescape = function( _, escaped, escapedWhitespace ) {
732 var high = "0x" + escaped - 0x10000;
733 // NaN means non-codepoint
734 // Support: Firefox<24
735 // Workaround erroneous numeric interpretation of +"0x"
736 return high !== high || escapedWhitespace ?
737 escaped :
738 high < 0 ?
739 // BMP codepoint
740 String.fromCharCode( high + 0x10000 ) :
741 // Supplemental Plane codepoint (surrogate pair)
742 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
743 },
744
745 // Used for iframes
746 // See setDocument()
747 // Removing the function wrapper causes a "Permission Denied"
748 // error in IE
749 unloadHandler = function() {
750 setDocument();
751 };
752
753 // Optimize for push.apply( _, NodeList )
754 try {
755 push.apply(
756 (arr = slice.call( preferredDoc.childNodes )),
757 preferredDoc.childNodes
758 );
759 // Support: Android<4.0
760 // Detect silently failing push.apply
761 arr[ preferredDoc.childNodes.length ].nodeType;
762 } catch ( e ) {
763 push = { apply: arr.length ?
764
765 // Leverage slice if possible
766 function( target, els ) {
767 push_native.apply( target, slice.call(els) );
768 } :
769
770 // Support: IE<9
771 // Otherwise append directly
772 function( target, els ) {
773 var j = target.length,
774 i = 0;
775 // Can't trust NodeList.length
776 while ( (target[j++] = els[i++]) ) {}
777 target.length = j - 1;
778 }
779 };
780 }
781
782 function Sizzle( selector, context, results, seed ) {
783 var match, elem, m, nodeType,
784 // QSA vars
785 i, groups, old, nid, newContext, newSelector;
786
787 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
788 setDocument( context );
789 }
790
791 context = context || document;
792 results = results || [];
793 nodeType = context.nodeType;
794
795 if ( typeof selector !== "string" || !selector ||
796 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
797
798 return results;
799 }
800
801 if ( !seed && documentIsHTML ) {
802
803 // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
804 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
805 // Speed-up: Sizzle("#ID")
806 if ( (m = match[1]) ) {
807 if ( nodeType === 9 ) {
808 elem = context.getElementById( m );
809 // Check parentNode to catch when Blackberry 4.6 returns
810 // nodes that are no longer in the document (jQuery #6963)
811 if ( elem && elem.parentNode ) {
812 // Handle the case where IE, Opera, and Webkit return items
813 // by name instead of ID
814 if ( elem.id === m ) {
815 results.push( elem );
816 return results;
817 }
818 } else {
819 return results;
820 }
821 } else {
822 // Context is not a document
823 if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
824 contains( context, elem ) && elem.id === m ) {
825 results.push( elem );
826 return results;
827 }
828 }
829
830 // Speed-up: Sizzle("TAG")
831 } else if ( match[2] ) {
832 push.apply( results, context.getElementsByTagName( selector ) );
833 return results;
834
835 // Speed-up: Sizzle(".CLASS")
836 } else if ( (m = match[3]) && support.getElementsByClassName ) {
837 push.apply( results, context.getElementsByClassName( m ) );
838 return results;
839 }
840 }
841
842 // QSA path
843 if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
844 nid = old = expando;
845 newContext = context;
846 newSelector = nodeType !== 1 && selector;
847
848 // qSA works strangely on Element-rooted queries
849 // We can work around this by specifying an extra ID on the root
850 // and working up from there (Thanks to Andrew Dupont for the technique)
851 // IE 8 doesn't work on object elements
852 if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
853 groups = tokenize( selector );
854
855 if ( (old = context.getAttribute("id")) ) {
856 nid = old.replace( rescape, "\\$&" );
857 } else {
858 context.setAttribute( "id", nid );
859 }
860 nid = "[id='" + nid + "'] ";
861
862 i = groups.length;
863 while ( i-- ) {
864 groups[i] = nid + toSelector( groups[i] );
865 }
866 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
867 newSelector = groups.join(",");
868 }
869
870 if ( newSelector ) {
871 try {
872 push.apply( results,
873 newContext.querySelectorAll( newSelector )
874 );
875 return results;
876 } catch(qsaError) {
877 } finally {
878 if ( !old ) {
879 context.removeAttribute("id");
880 }
881 }
882 }
883 }
884 }
885
886 // All others
887 return select( selector.replace( rtrim, "$1" ), context, results, seed );
888 }
889
890 /**
891 * Create key-value caches of limited size
892 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
893 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
894 * deleting the oldest entry
895 */
896 function createCache() {
897 var keys = [];
898
899 function cache( key, value ) {
900 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
901 if ( keys.push( key + " " ) > Expr.cacheLength ) {
902 // Only keep the most recent entries
903 delete cache[ keys.shift() ];
904 }
905 return (cache[ key + " " ] = value);
906 }
907 return cache;
908 }
909
910 /**
911 * Mark a function for special use by Sizzle
912 * @param {Function} fn The function to mark
913 */
914 function markFunction( fn ) {
915 fn[ expando ] = true;
916 return fn;
917 }
918
919 /**
920 * Support testing using an element
921 * @param {Function} fn Passed the created div and expects a boolean result
922 */
923 function assert( fn ) {
924 var div = document.createElement("div");
925
926 try {
927 return !!fn( div );
928 } catch (e) {
929 return false;
930 } finally {
931 // Remove from its parent by default
932 if ( div.parentNode ) {
933 div.parentNode.removeChild( div );
934 }
935 // release memory in IE
936 div = null;
937 }
938 }
939
940 /**
941 * Adds the same handler for all of the specified attrs
942 * @param {String} attrs Pipe-separated list of attributes
943 * @param {Function} handler The method that will be applied
944 */
945 function addHandle( attrs, handler ) {
946 var arr = attrs.split("|"),
947 i = attrs.length;
948
949 while ( i-- ) {
950 Expr.attrHandle[ arr[i] ] = handler;
951 }
952 }
953
954 /**
955 * Checks document order of two siblings
956 * @param {Element} a
957 * @param {Element} b
958 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
959 */
960 function siblingCheck( a, b ) {
961 var cur = b && a,
962 diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
963 ( ~b.sourceIndex || MAX_NEGATIVE ) -
964 ( ~a.sourceIndex || MAX_NEGATIVE );
965
966 // Use IE sourceIndex if available on both nodes
967 if ( diff ) {
968 return diff;
969 }
970
971 // Check if b follows a
972 if ( cur ) {
973 while ( (cur = cur.nextSibling) ) {
974 if ( cur === b ) {
975 return -1;
976 }
977 }
978 }
979
980 return a ? 1 : -1;
981 }
982
983 /**
984 * Returns a function to use in pseudos for input types
985 * @param {String} type
986 */
987 function createInputPseudo( type ) {
988 return function( elem ) {
989 var name = elem.nodeName.toLowerCase();
990 return name === "input" && elem.type === type;
991 };
992 }
993
994 /**
995 * Returns a function to use in pseudos for buttons
996 * @param {String} type
997 */
998 function createButtonPseudo( type ) {
999 return function( elem ) {
1000 var name = elem.nodeName.toLowerCase();
1001 return (name === "input" || name === "button") && elem.type === type;
1002 };
1003 }
1004
1005 /**
1006 * Returns a function to use in pseudos for positionals
1007 * @param {Function} fn
1008 */
1009 function createPositionalPseudo( fn ) {
1010 return markFunction(function( argument ) {
1011 argument = +argument;
1012 return markFunction(function( seed, matches ) {
1013 var j,
1014 matchIndexes = fn( [], seed.length, argument ),
1015 i = matchIndexes.length;
1016
1017 // Match elements found at the specified indexes
1018 while ( i-- ) {
1019 if ( seed[ (j = matchIndexes[i]) ] ) {
1020 seed[j] = !(matches[j] = seed[j]);
1021 }
1022 }
1023 });
1024 });
1025 }
1026
1027 /**
1028 * Checks a node for validity as a Sizzle context
1029 * @param {Element|Object=} context
1030 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1031 */
1032 function testContext( context ) {
1033 return context && typeof context.getElementsByTagName !== "undefined" && context;
1034 }
1035
1036 // Expose support vars for convenience
1037 support = Sizzle.support = {};
1038
1039 /**
1040 * Detects XML nodes
1041 * @param {Element|Object} elem An element or a document
1042 * @returns {Boolean} True iff elem is a non-HTML XML node
1043 */
1044 isXML = Sizzle.isXML = function( elem ) {
1045 // documentElement is verified for cases where it doesn't yet exist
1046 // (such as loading iframes in IE - #4833)
1047 var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1048 return documentElement ? documentElement.nodeName !== "HTML" : false;
1049 };
1050
1051 /**
1052 * Sets document-related variables once based on the current document
1053 * @param {Element|Object} [doc] An element or document object to use to set the document
1054 * @returns {Object} Returns the current document
1055 */
1056 setDocument = Sizzle.setDocument = function( node ) {
1057 var hasCompare, parent,
1058 doc = node ? node.ownerDocument || node : preferredDoc;
1059
1060 // If no document and documentElement is available, return
1061 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1062 return document;
1063 }
1064
1065 // Set our document
1066 document = doc;
1067 docElem = doc.documentElement;
1068 parent = doc.defaultView;
1069
1070 // Support: IE>8
1071 // If iframe document is assigned to "document" variable and if iframe has been reloaded,
1072 // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1073 // IE6-8 do not support the defaultView property so parent will be undefined
1074 if ( parent && parent !== parent.top ) {
1075 // IE11 does not have attachEvent, so all must suffer
1076 if ( parent.addEventListener ) {
1077 parent.addEventListener( "unload", unloadHandler, false );
1078 } else if ( parent.attachEvent ) {
1079 parent.attachEvent( "onunload", unloadHandler );
1080 }
1081 }
1082
1083 /* Support tests
1084 ---------------------------------------------------------------------- */
1085 documentIsHTML = !isXML( doc );
1086
1087 /* Attributes
1088 ---------------------------------------------------------------------- */
1089
1090 // Support: IE<8
1091 // Verify that getAttribute really returns attributes and not properties
1092 // (excepting IE8 booleans)
1093 support.attributes = assert(function( div ) {
1094 div.className = "i";
1095 return !div.getAttribute("className");
1096 });
1097
1098 /* getElement(s)By*
1099 ---------------------------------------------------------------------- */
1100
1101 // Check if getElementsByTagName("*") returns only elements
1102 support.getElementsByTagName = assert(function( div ) {
1103 div.appendChild( doc.createComment("") );
1104 return !div.getElementsByTagName("*").length;
1105 });
1106
1107 // Support: IE<9
1108 support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
1109
1110 // Support: IE<10
1111 // Check if getElementById returns elements by name
1112 // The broken getElementById methods don't pick up programatically-set names,
1113 // so use a roundabout getElementsByName test
1114 support.getById = assert(function( div ) {
1115 docElem.appendChild( div ).id = expando;
1116 return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1117 });
1118
1119 // ID find and filter
1120 if ( support.getById ) {
1121 Expr.find["ID"] = function( id, context ) {
1122 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1123 var m = context.getElementById( id );
1124 // Check parentNode to catch when Blackberry 4.6 returns
1125 // nodes that are no longer in the document #6963
1126 return m && m.parentNode ? [ m ] : [];
1127 }
1128 };
1129 Expr.filter["ID"] = function( id ) {
1130 var attrId = id.replace( runescape, funescape );
1131 return function( elem ) {
1132 return elem.getAttribute("id") === attrId;
1133 };
1134 };
1135 } else {
1136 // Support: IE6/7
1137 // getElementById is not reliable as a find shortcut
1138 delete Expr.find["ID"];
1139
1140 Expr.filter["ID"] = function( id ) {
1141 var attrId = id.replace( runescape, funescape );
1142 return function( elem ) {
1143 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
1144 return node && node.value === attrId;
1145 };
1146 };
1147 }
1148
1149 // Tag
1150 Expr.find["TAG"] = support.getElementsByTagName ?
1151 function( tag, context ) {
1152 if ( typeof context.getElementsByTagName !== "undefined" ) {
1153 return context.getElementsByTagName( tag );
1154
1155 // DocumentFragment nodes don't have gEBTN
1156 } else if ( support.qsa ) {
1157 return context.querySelectorAll( tag );
1158 }
1159 } :
1160
1161 function( tag, context ) {
1162 var elem,
1163 tmp = [],
1164 i = 0,
1165 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1166 results = context.getElementsByTagName( tag );
1167
1168 // Filter out possible comments
1169 if ( tag === "*" ) {
1170 while ( (elem = results[i++]) ) {
1171 if ( elem.nodeType === 1 ) {
1172 tmp.push( elem );
1173 }
1174 }
1175
1176 return tmp;
1177 }
1178 return results;
1179 };
1180
1181 // Class
1182 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1183 if ( documentIsHTML ) {
1184 return context.getElementsByClassName( className );
1185 }
1186 };
1187
1188 /* QSA/matchesSelector
1189 ---------------------------------------------------------------------- */
1190
1191 // QSA and matchesSelector support
1192
1193 // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1194 rbuggyMatches = [];
1195
1196 // qSa(:focus) reports false when true (Chrome 21)
1197 // We allow this because of a bug in IE8/9 that throws an error
1198 // whenever `document.activeElement` is accessed on an iframe
1199 // So, we allow :focus to pass through QSA all the time to avoid the IE error
1200 // See http://bugs.jquery.com/ticket/13378
1201 rbuggyQSA = [];
1202
1203 if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1204 // Build QSA regex
1205 // Regex strategy adopted from Diego Perini
1206 assert(function( div ) {
1207 // Select is set to empty string on purpose
1208 // This is to test IE's treatment of not explicitly
1209 // setting a boolean content attribute,
1210 // since its presence should be enough
1211 // http://bugs.jquery.com/ticket/12359
1212 docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
1213 "<select id='" + expando + "-\f]' msallowcapture=''>" +
1214 "<option selected=''></option></select>";
1215
1216 // Support: IE8, Opera 11-12.16
1217 // Nothing should be selected when empty strings follow ^= or $= or *=
1218 // The test attribute must be unknown in Opera but "safe" for WinRT
1219 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1220 if ( div.querySelectorAll("[msallowcapture^='']").length ) {
1221 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1222 }
1223
1224 // Support: IE8
1225 // Boolean attributes and "value" are not treated correctly
1226 if ( !div.querySelectorAll("[selected]").length ) {
1227 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1228 }
1229
1230 // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
1231 if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1232 rbuggyQSA.push("~=");
1233 }
1234
1235 // Webkit/Opera - :checked should return selected option elements
1236 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1237 // IE8 throws error here and will not see later tests
1238 if ( !div.querySelectorAll(":checked").length ) {
1239 rbuggyQSA.push(":checked");
1240 }
1241
1242 // Support: Safari 8+, iOS 8+
1243 // https://bugs.webkit.org/show_bug.cgi?id=136851
1244 // In-page `selector#id sibing-combinator selector` fails
1245 if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
1246 rbuggyQSA.push(".#.+[+~]");
1247 }
1248 });
1249
1250 assert(function( div ) {
1251 // Support: Windows 8 Native Apps
1252 // The type and name attributes are restricted during .innerHTML assignment
1253 var input = doc.createElement("input");
1254 input.setAttribute( "type", "hidden" );
1255 div.appendChild( input ).setAttribute( "name", "D" );
1256
1257 // Support: IE8
1258 // Enforce case-sensitivity of name attribute
1259 if ( div.querySelectorAll("[name=d]").length ) {
1260 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1261 }
1262
1263 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1264 // IE8 throws error here and will not see later tests
1265 if ( !div.querySelectorAll(":enabled").length ) {
1266 rbuggyQSA.push( ":enabled", ":disabled" );
1267 }
1268
1269 // Opera 10-11 does not throw on post-comma invalid pseudos
1270 div.querySelectorAll("*,:x");
1271 rbuggyQSA.push(",.*:");
1272 });
1273 }
1274
1275 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1276 docElem.webkitMatchesSelector ||
1277 docElem.mozMatchesSelector ||
1278 docElem.oMatchesSelector ||
1279 docElem.msMatchesSelector) )) ) {
1280
1281 assert(function( div ) {
1282 // Check to see if it's possible to do matchesSelector
1283 // on a disconnected node (IE 9)
1284 support.disconnectedMatch = matches.call( div, "div" );
1285
1286 // This should fail with an exception
1287 // Gecko does not error, returns false instead
1288 matches.call( div, "[s!='']:x" );
1289 rbuggyMatches.push( "!=", pseudos );
1290 });
1291 }
1292
1293 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1294 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1295
1296 /* Contains
1297 ---------------------------------------------------------------------- */
1298 hasCompare = rnative.test( docElem.compareDocumentPosition );
1299
1300 // Element contains another
1301 // Purposefully does not implement inclusive descendent
1302 // As in, an element does not contain itself
1303 contains = hasCompare || rnative.test( docElem.contains ) ?
1304 function( a, b ) {
1305 var adown = a.nodeType === 9 ? a.documentElement : a,
1306 bup = b && b.parentNode;
1307 return a === bup || !!( bup && bup.nodeType === 1 && (
1308 adown.contains ?
1309 adown.contains( bup ) :
1310 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1311 ));
1312 } :
1313 function( a, b ) {
1314 if ( b ) {
1315 while ( (b = b.parentNode) ) {
1316 if ( b === a ) {
1317 return true;
1318 }
1319 }
1320 }
1321 return false;
1322 };
1323
1324 /* Sorting
1325 ---------------------------------------------------------------------- */
1326
1327 // Document order sorting
1328 sortOrder = hasCompare ?
1329 function( a, b ) {
1330
1331 // Flag for duplicate removal
1332 if ( a === b ) {
1333 hasDuplicate = true;
1334 return 0;
1335 }
1336
1337 // Sort on method existence if only one input has compareDocumentPosition
1338 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1339 if ( compare ) {
1340 return compare;
1341 }
1342
1343 // Calculate position if both inputs belong to the same document
1344 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1345 a.compareDocumentPosition( b ) :
1346
1347 // Otherwise we know they are disconnected
1348 1;
1349
1350 // Disconnected nodes
1351 if ( compare & 1 ||
1352 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1353
1354 // Choose the first element that is related to our preferred document
1355 if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1356 return -1;
1357 }
1358 if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1359 return 1;
1360 }
1361
1362 // Maintain original order
1363 return sortInput ?
1364 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1365 0;
1366 }
1367
1368 return compare & 4 ? -1 : 1;
1369 } :
1370 function( a, b ) {
1371 // Exit early if the nodes are identical
1372 if ( a === b ) {
1373 hasDuplicate = true;
1374 return 0;
1375 }
1376
1377 var cur,
1378 i = 0,
1379 aup = a.parentNode,
1380 bup = b.parentNode,
1381 ap = [ a ],
1382 bp = [ b ];
1383
1384 // Parentless nodes are either documents or disconnected
1385 if ( !aup || !bup ) {
1386 return a === doc ? -1 :
1387 b === doc ? 1 :
1388 aup ? -1 :
1389 bup ? 1 :
1390 sortInput ?
1391 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1392 0;
1393
1394 // If the nodes are siblings, we can do a quick check
1395 } else if ( aup === bup ) {
1396 return siblingCheck( a, b );
1397 }
1398
1399 // Otherwise we need full lists of their ancestors for comparison
1400 cur = a;
1401 while ( (cur = cur.parentNode) ) {
1402 ap.unshift( cur );
1403 }
1404 cur = b;
1405 while ( (cur = cur.parentNode) ) {
1406 bp.unshift( cur );
1407 }
1408
1409 // Walk down the tree looking for a discrepancy
1410 while ( ap[i] === bp[i] ) {
1411 i++;
1412 }
1413
1414 return i ?
1415 // Do a sibling check if the nodes have a common ancestor
1416 siblingCheck( ap[i], bp[i] ) :
1417
1418 // Otherwise nodes in our document sort first
1419 ap[i] === preferredDoc ? -1 :
1420 bp[i] === preferredDoc ? 1 :
1421 0;
1422 };
1423
1424 return doc;
1425 };
1426
1427 Sizzle.matches = function( expr, elements ) {
1428 return Sizzle( expr, null, null, elements );
1429 };
1430
1431 Sizzle.matchesSelector = function( elem, expr ) {
1432 // Set document vars if needed
1433 if ( ( elem.ownerDocument || elem ) !== document ) {
1434 setDocument( elem );
1435 }
1436
1437 // Make sure that attribute selectors are quoted
1438 expr = expr.replace( rattributeQuotes, "='$1']" );
1439
1440 if ( support.matchesSelector && documentIsHTML &&
1441 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1442 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1443
1444 try {
1445 var ret = matches.call( elem, expr );
1446
1447 // IE 9's matchesSelector returns false on disconnected nodes
1448 if ( ret || support.disconnectedMatch ||
1449 // As well, disconnected nodes are said to be in a document
1450 // fragment in IE 9
1451 elem.document && elem.document.nodeType !== 11 ) {
1452 return ret;
1453 }
1454 } catch (e) {}
1455 }
1456
1457 return Sizzle( expr, document, null, [ elem ] ).length > 0;
1458 };
1459
1460 Sizzle.contains = function( context, elem ) {
1461 // Set document vars if needed
1462 if ( ( context.ownerDocument || context ) !== document ) {
1463 setDocument( context );
1464 }
1465 return contains( context, elem );
1466 };
1467
1468 Sizzle.attr = function( elem, name ) {
1469 // Set document vars if needed
1470 if ( ( elem.ownerDocument || elem ) !== document ) {
1471 setDocument( elem );
1472 }
1473
1474 var fn = Expr.attrHandle[ name.toLowerCase() ],
1475 // Don't get fooled by Object.prototype properties (jQuery #13807)
1476 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1477 fn( elem, name, !documentIsHTML ) :
1478 undefined;
1479
1480 return val !== undefined ?
1481 val :
1482 support.attributes || !documentIsHTML ?
1483 elem.getAttribute( name ) :
1484 (val = elem.getAttributeNode(name)) && val.specified ?
1485 val.value :
1486 null;
1487 };
1488
1489 Sizzle.error = function( msg ) {
1490 throw new Error( "Syntax error, unrecognized expression: " + msg );
1491 };
1492
1493 /**
1494 * Document sorting and removing duplicates
1495 * @param {ArrayLike} results
1496 */
1497 Sizzle.uniqueSort = function( results ) {
1498 var elem,
1499 duplicates = [],
1500 j = 0,
1501 i = 0;
1502
1503 // Unless we *know* we can detect duplicates, assume their presence
1504 hasDuplicate = !support.detectDuplicates;
1505 sortInput = !support.sortStable && results.slice( 0 );
1506 results.sort( sortOrder );
1507
1508 if ( hasDuplicate ) {
1509 while ( (elem = results[i++]) ) {
1510 if ( elem === results[ i ] ) {
1511 j = duplicates.push( i );
1512 }
1513 }
1514 while ( j-- ) {
1515 results.splice( duplicates[ j ], 1 );
1516 }
1517 }
1518
1519 // Clear input after sorting to release objects
1520 // See https://github.com/jquery/sizzle/pull/225
1521 sortInput = null;
1522
1523 return results;
1524 };
1525
1526 /**
1527 * Utility function for retrieving the text value of an array of DOM nodes
1528 * @param {Array|Element} elem
1529 */
1530 getText = Sizzle.getText = function( elem ) {
1531 var node,
1532 ret = "",
1533 i = 0,
1534 nodeType = elem.nodeType;
1535
1536 if ( !nodeType ) {
1537 // If no nodeType, this is expected to be an array
1538 while ( (node = elem[i++]) ) {
1539 // Do not traverse comment nodes
1540 ret += getText( node );
1541 }
1542 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1543 // Use textContent for elements
1544 // innerText usage removed for consistency of new lines (jQuery #11153)
1545 if ( typeof elem.textContent === "string" ) {
1546 return elem.textContent;
1547 } else {
1548 // Traverse its children
1549 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1550 ret += getText( elem );
1551 }
1552 }
1553 } else if ( nodeType === 3 || nodeType === 4 ) {
1554 return elem.nodeValue;
1555 }
1556 // Do not include comment or processing instruction nodes
1557
1558 return ret;
1559 };
1560
1561 Expr = Sizzle.selectors = {
1562
1563 // Can be adjusted by the user
1564 cacheLength: 50,
1565
1566 createPseudo: markFunction,
1567
1568 match: matchExpr,
1569
1570 attrHandle: {},
1571
1572 find: {},
1573
1574 relative: {
1575 ">": { dir: "parentNode", first: true },
1576 " ": { dir: "parentNode" },
1577 "+": { dir: "previousSibling", first: true },
1578 "~": { dir: "previousSibling" }
1579 },
1580
1581 preFilter: {
1582 "ATTR": function( match ) {
1583 match[1] = match[1].replace( runescape, funescape );
1584
1585 // Move the given value to match[3] whether quoted or unquoted
1586 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1587
1588 if ( match[2] === "~=" ) {
1589 match[3] = " " + match[3] + " ";
1590 }
1591
1592 return match.slice( 0, 4 );
1593 },
1594
1595 "CHILD": function( match ) {
1596 /* matches from matchExpr["CHILD"]
1597 1 type (only|nth|...)
1598 2 what (child|of-type)
1599 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1600 4 xn-component of xn+y argument ([+-]?\d*n|)
1601 5 sign of xn-component
1602 6 x of xn-component
1603 7 sign of y-component
1604 8 y of y-component
1605 */
1606 match[1] = match[1].toLowerCase();
1607
1608 if ( match[1].slice( 0, 3 ) === "nth" ) {
1609 // nth-* requires argument
1610 if ( !match[3] ) {
1611 Sizzle.error( match[0] );
1612 }
1613
1614 // numeric x and y parameters for Expr.filter.CHILD
1615 // remember that false/true cast respectively to 0/1
1616 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1617 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1618
1619 // other types prohibit arguments
1620 } else if ( match[3] ) {
1621 Sizzle.error( match[0] );
1622 }
1623
1624 return match;
1625 },
1626
1627 "PSEUDO": function( match ) {
1628 var excess,
1629 unquoted = !match[6] && match[2];
1630
1631 if ( matchExpr["CHILD"].test( match[0] ) ) {
1632 return null;
1633 }
1634
1635 // Accept quoted arguments as-is
1636 if ( match[3] ) {
1637 match[2] = match[4] || match[5] || "";
1638
1639 // Strip excess characters from unquoted arguments
1640 } else if ( unquoted && rpseudo.test( unquoted ) &&
1641 // Get excess from tokenize (recursively)
1642 (excess = tokenize( unquoted, true )) &&
1643 // advance to the next closing parenthesis
1644 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1645
1646 // excess is a negative index
1647 match[0] = match[0].slice( 0, excess );
1648 match[2] = unquoted.slice( 0, excess );
1649 }
1650
1651 // Return only captures needed by the pseudo filter method (type and argument)
1652 return match.slice( 0, 3 );
1653 }
1654 },
1655
1656 filter: {
1657
1658 "TAG": function( nodeNameSelector ) {
1659 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1660 return nodeNameSelector === "*" ?
1661 function() { return true; } :
1662 function( elem ) {
1663 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1664 };
1665 },
1666
1667 "CLASS": function( className ) {
1668 var pattern = classCache[ className + " " ];
1669
1670 return pattern ||
1671 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1672 classCache( className, function( elem ) {
1673 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1674 });
1675 },
1676
1677 "ATTR": function( name, operator, check ) {
1678 return function( elem ) {
1679 var result = Sizzle.attr( elem, name );
1680
1681 if ( result == null ) {
1682 return operator === "!=";
1683 }
1684 if ( !operator ) {
1685 return true;
1686 }
1687
1688 result += "";
1689
1690 return operator === "=" ? result === check :
1691 operator === "!=" ? result !== check :
1692 operator === "^=" ? check && result.indexOf( check ) === 0 :
1693 operator === "*=" ? check && result.indexOf( check ) > -1 :
1694 operator === "$=" ? check && result.slice( -check.length ) === check :
1695 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1696 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1697 false;
1698 };
1699 },
1700
1701 "CHILD": function( type, what, argument, first, last ) {
1702 var simple = type.slice( 0, 3 ) !== "nth",
1703 forward = type.slice( -4 ) !== "last",
1704 ofType = what === "of-type";
1705
1706 return first === 1 && last === 0 ?
1707
1708 // Shortcut for :nth-*(n)
1709 function( elem ) {
1710 return !!elem.parentNode;
1711 } :
1712
1713 function( elem, context, xml ) {
1714 var cache, outerCache, node, diff, nodeIndex, start,
1715 dir = simple !== forward ? "nextSibling" : "previousSibling",
1716 parent = elem.parentNode,
1717 name = ofType && elem.nodeName.toLowerCase(),
1718 useCache = !xml && !ofType;
1719
1720 if ( parent ) {
1721
1722 // :(first|last|only)-(child|of-type)
1723 if ( simple ) {
1724 while ( dir ) {
1725 node = elem;
1726 while ( (node = node[ dir ]) ) {
1727 if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
1728 return false;
1729 }
1730 }
1731 // Reverse direction for :only-* (if we haven't yet done so)
1732 start = dir = type === "only" && !start && "nextSibling";
1733 }
1734 return true;
1735 }
1736
1737 start = [ forward ? parent.firstChild : parent.lastChild ];
1738
1739 // non-xml :nth-child(...) stores cache data on `parent`
1740 if ( forward && useCache ) {
1741 // Seek `elem` from a previously-cached index
1742 outerCache = parent[ expando ] || (parent[ expando ] = {});
1743 cache = outerCache[ type ] || [];
1744 nodeIndex = cache[0] === dirruns && cache[1];
1745 diff = cache[0] === dirruns && cache[2];
1746 node = nodeIndex && parent.childNodes[ nodeIndex ];
1747
1748 while ( (node = ++nodeIndex && node && node[ dir ] ||
1749
1750 // Fallback to seeking `elem` from the start
1751 (diff = nodeIndex = 0) || start.pop()) ) {
1752
1753 // When found, cache indexes on `parent` and break
1754 if ( node.nodeType === 1 && ++diff && node === elem ) {
1755 outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1756 break;
1757 }
1758 }
1759
1760 // Use previously-cached element index if available
1761 } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
1762 diff = cache[1];
1763
1764 // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
1765 } else {
1766 // Use the same loop as above to seek `elem` from the start
1767 while ( (node = ++nodeIndex && node && node[ dir ] ||
1768 (diff = nodeIndex = 0) || start.pop()) ) {
1769
1770 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
1771 // Cache the index of each encountered element
1772 if ( useCache ) {
1773 (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
1774 }
1775
1776 if ( node === elem ) {
1777 break;
1778 }
1779 }
1780 }
1781 }
1782
1783 // Incorporate the offset, then check against cycle size
1784 diff -= last;
1785 return diff === first || ( diff % first === 0 && diff / first >= 0 );
1786 }
1787 };
1788 },
1789
1790 "PSEUDO": function( pseudo, argument ) {
1791 // pseudo-class names are case-insensitive
1792 // http://www.w3.org/TR/selectors/#pseudo-classes
1793 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1794 // Remember that setFilters inherits from pseudos
1795 var args,
1796 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1797 Sizzle.error( "unsupported pseudo: " + pseudo );
1798
1799 // The user may use createPseudo to indicate that
1800 // arguments are needed to create the filter function
1801 // just as Sizzle does
1802 if ( fn[ expando ] ) {
1803 return fn( argument );
1804 }
1805
1806 // But maintain support for old signatures
1807 if ( fn.length > 1 ) {
1808 args = [ pseudo, pseudo, "", argument ];
1809 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1810 markFunction(function( seed, matches ) {
1811 var idx,
1812 matched = fn( seed, argument ),
1813 i = matched.length;
1814 while ( i-- ) {
1815 idx = indexOf( seed, matched[i] );
1816 seed[ idx ] = !( matches[ idx ] = matched[i] );
1817 }
1818 }) :
1819 function( elem ) {
1820 return fn( elem, 0, args );
1821 };
1822 }
1823
1824 return fn;
1825 }
1826 },
1827
1828 pseudos: {
1829 // Potentially complex pseudos
1830 "not": markFunction(function( selector ) {
1831 // Trim the selector passed to compile
1832 // to avoid treating leading and trailing
1833 // spaces as combinators
1834 var input = [],
1835 results = [],
1836 matcher = compile( selector.replace( rtrim, "$1" ) );
1837
1838 return matcher[ expando ] ?
1839 markFunction(function( seed, matches, context, xml ) {
1840 var elem,
1841 unmatched = matcher( seed, null, xml, [] ),
1842 i = seed.length;
1843
1844 // Match elements unmatched by `matcher`
1845 while ( i-- ) {
1846 if ( (elem = unmatched[i]) ) {
1847 seed[i] = !(matches[i] = elem);
1848 }
1849 }
1850 }) :
1851 function( elem, context, xml ) {
1852 input[0] = elem;
1853 matcher( input, null, xml, results );
1854 // Don't keep the element (issue #299)
1855 input[0] = null;
1856 return !results.pop();
1857 };
1858 }),
1859
1860 "has": markFunction(function( selector ) {
1861 return function( elem ) {
1862 return Sizzle( selector, elem ).length > 0;
1863 };
1864 }),
1865
1866 "contains": markFunction(function( text ) {
1867 text = text.replace( runescape, funescape );
1868 return function( elem ) {
1869 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1870 };
1871 }),
1872
1873 // "Whether an element is represented by a :lang() selector
1874 // is based solely on the element's language value
1875 // being equal to the identifier C,
1876 // or beginning with the identifier C immediately followed by "-".
1877 // The matching of C against the element's language value is performed case-insensitively.
1878 // The identifier C does not have to be a valid language name."
1879 // http://www.w3.org/TR/selectors/#lang-pseudo
1880 "lang": markFunction( function( lang ) {
1881 // lang value must be a valid identifier
1882 if ( !ridentifier.test(lang || "") ) {
1883 Sizzle.error( "unsupported lang: " + lang );
1884 }
1885 lang = lang.replace( runescape, funescape ).toLowerCase();
1886 return function( elem ) {
1887 var elemLang;
1888 do {
1889 if ( (elemLang = documentIsHTML ?
1890 elem.lang :
1891 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1892
1893 elemLang = elemLang.toLowerCase();
1894 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1895 }
1896 } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1897 return false;
1898 };
1899 }),
1900
1901 // Miscellaneous
1902 "target": function( elem ) {
1903 var hash = window.location && window.location.hash;
1904 return hash && hash.slice( 1 ) === elem.id;
1905 },
1906
1907 "root": function( elem ) {
1908 return elem === docElem;
1909 },
1910
1911 "focus": function( elem ) {
1912 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1913 },
1914
1915 // Boolean properties
1916 "enabled": function( elem ) {
1917 return elem.disabled === false;
1918 },
1919
1920 "disabled": function( elem ) {
1921 return elem.disabled === true;
1922 },
1923
1924 "checked": function( elem ) {
1925 // In CSS3, :checked should return both checked and selected elements
1926 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1927 var nodeName = elem.nodeName.toLowerCase();
1928 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1929 },
1930
1931 "selected": function( elem ) {
1932 // Accessing this property makes selected-by-default
1933 // options in Safari work properly
1934 if ( elem.parentNode ) {
1935 elem.parentNode.selectedIndex;
1936 }
1937
1938 return elem.selected === true;
1939 },
1940
1941 // Contents
1942 "empty": function( elem ) {
1943 // http://www.w3.org/TR/selectors/#empty-pseudo
1944 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1945 // but not by others (comment: 8; processing instruction: 7; etc.)
1946 // nodeType < 6 works because attributes (2) do not appear as children
1947 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1948 if ( elem.nodeType < 6 ) {
1949 return false;
1950 }
1951 }
1952 return true;
1953 },
1954
1955 "parent": function( elem ) {
1956 return !Expr.pseudos["empty"]( elem );
1957 },
1958
1959 // Element/input types
1960 "header": function( elem ) {
1961 return rheader.test( elem.nodeName );
1962 },
1963
1964 "input": function( elem ) {
1965 return rinputs.test( elem.nodeName );
1966 },
1967
1968 "button": function( elem ) {
1969 var name = elem.nodeName.toLowerCase();
1970 return name === "input" && elem.type === "button" || name === "button";
1971 },
1972
1973 "text": function( elem ) {
1974 var attr;
1975 return elem.nodeName.toLowerCase() === "input" &&
1976 elem.type === "text" &&
1977
1978 // Support: IE<8
1979 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1980 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1981 },
1982
1983 // Position-in-collection
1984 "first": createPositionalPseudo(function() {
1985 return [ 0 ];
1986 }),
1987
1988 "last": createPositionalPseudo(function( matchIndexes, length ) {
1989 return [ length - 1 ];
1990 }),
1991
1992 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1993 return [ argument < 0 ? argument + length : argument ];
1994 }),
1995
1996 "even": createPositionalPseudo(function( matchIndexes, length ) {
1997 var i = 0;
1998 for ( ; i < length; i += 2 ) {
1999 matchIndexes.push( i );
2000 }
2001 return matchIndexes;
2002 }),
2003
2004 "odd": createPositionalPseudo(function( matchIndexes, length ) {
2005 var i = 1;
2006 for ( ; i < length; i += 2 ) {
2007 matchIndexes.push( i );
2008 }
2009 return matchIndexes;
2010 }),
2011
2012 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2013 var i = argument < 0 ? argument + length : argument;
2014 for ( ; --i >= 0; ) {
2015 matchIndexes.push( i );
2016 }
2017 return matchIndexes;
2018 }),
2019
2020 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2021 var i = argument < 0 ? argument + length : argument;
2022 for ( ; ++i < length; ) {
2023 matchIndexes.push( i );
2024 }
2025 return matchIndexes;
2026 })
2027 }
2028 };
2029
2030 Expr.pseudos["nth"] = Expr.pseudos["eq"];
2031
2032 // Add button/input type pseudos
2033 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2034 Expr.pseudos[ i ] = createInputPseudo( i );
2035 }
2036 for ( i in { submit: true, reset: true } ) {
2037 Expr.pseudos[ i ] = createButtonPseudo( i );
2038 }
2039
2040 // Easy API for creating new setFilters
2041 function setFilters() {}
2042 setFilters.prototype = Expr.filters = Expr.pseudos;
2043 Expr.setFilters = new setFilters();
2044
2045 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2046 var matched, match, tokens, type,
2047 soFar, groups, preFilters,
2048 cached = tokenCache[ selector + " " ];
2049
2050 if ( cached ) {
2051 return parseOnly ? 0 : cached.slice( 0 );
2052 }
2053
2054 soFar = selector;
2055 groups = [];
2056 preFilters = Expr.preFilter;
2057
2058 while ( soFar ) {
2059
2060 // Comma and first run
2061 if ( !matched || (match = rcomma.exec( soFar )) ) {
2062 if ( match ) {
2063 // Don't consume trailing commas as valid
2064 soFar = soFar.slice( match[0].length ) || soFar;
2065 }
2066 groups.push( (tokens = []) );
2067 }
2068
2069 matched = false;
2070
2071 // Combinators
2072 if ( (match = rcombinators.exec( soFar )) ) {
2073 matched = match.shift();
2074 tokens.push({
2075 value: matched,
2076 // Cast descendant combinators to space
2077 type: match[0].replace( rtrim, " " )
2078 });
2079 soFar = soFar.slice( matched.length );
2080 }
2081
2082 // Filters
2083 for ( type in Expr.filter ) {
2084 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2085 (match = preFilters[ type ]( match ))) ) {
2086 matched = match.shift();
2087 tokens.push({
2088 value: matched,
2089 type: type,
2090 matches: match
2091 });
2092 soFar = soFar.slice( matched.length );
2093 }
2094 }
2095
2096 if ( !matched ) {
2097 break;
2098 }
2099 }
2100
2101 // Return the length of the invalid excess
2102 // if we're just parsing
2103 // Otherwise, throw an error or return tokens
2104 return parseOnly ?
2105 soFar.length :
2106 soFar ?
2107 Sizzle.error( selector ) :
2108 // Cache the tokens
2109 tokenCache( selector, groups ).slice( 0 );
2110 };
2111
2112 function toSelector( tokens ) {
2113 var i = 0,
2114 len = tokens.length,
2115 selector = "";
2116 for ( ; i < len; i++ ) {
2117 selector += tokens[i].value;
2118 }
2119 return selector;
2120 }
2121
2122 function addCombinator( matcher, combinator, base ) {
2123 var dir = combinator.dir,
2124 checkNonElements = base && dir === "parentNode",
2125 doneName = done++;
2126
2127 return combinator.first ?
2128 // Check against closest ancestor/preceding element
2129 function( elem, context, xml ) {
2130 while ( (elem = elem[ dir ]) ) {
2131 if ( elem.nodeType === 1 || checkNonElements ) {
2132 return matcher( elem, context, xml );
2133 }
2134 }
2135 } :
2136
2137 // Check against all ancestor/preceding elements
2138 function( elem, context, xml ) {
2139 var oldCache, outerCache,
2140 newCache = [ dirruns, doneName ];
2141
2142 // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2143 if ( xml ) {
2144 while ( (elem = elem[ dir ]) ) {
2145 if ( elem.nodeType === 1 || checkNonElements ) {
2146 if ( matcher( elem, context, xml ) ) {
2147 return true;
2148 }
2149 }
2150 }
2151 } else {
2152 while ( (elem = elem[ dir ]) ) {
2153 if ( elem.nodeType === 1 || checkNonElements ) {
2154 outerCache = elem[ expando ] || (elem[ expando ] = {});
2155 if ( (oldCache = outerCache[ dir ]) &&
2156 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2157
2158 // Assign to newCache so results back-propagate to previous elements
2159 return (newCache[ 2 ] = oldCache[ 2 ]);
2160 } else {
2161 // Reuse newcache so results back-propagate to previous elements
2162 outerCache[ dir ] = newCache;
2163
2164 // A match means we're done; a fail means we have to keep checking
2165 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2166 return true;
2167 }
2168 }
2169 }
2170 }
2171 }
2172 };
2173 }
2174
2175 function elementMatcher( matchers ) {
2176 return matchers.length > 1 ?
2177 function( elem, context, xml ) {
2178 var i = matchers.length;
2179 while ( i-- ) {
2180 if ( !matchers[i]( elem, context, xml ) ) {
2181 return false;
2182 }
2183 }
2184 return true;
2185 } :
2186 matchers[0];
2187 }
2188
2189 function multipleContexts( selector, contexts, results ) {
2190 var i = 0,
2191 len = contexts.length;
2192 for ( ; i < len; i++ ) {
2193 Sizzle( selector, contexts[i], results );
2194 }
2195 return results;
2196 }
2197
2198 function condense( unmatched, map, filter, context, xml ) {
2199 var elem,
2200 newUnmatched = [],
2201 i = 0,
2202 len = unmatched.length,
2203 mapped = map != null;
2204
2205 for ( ; i < len; i++ ) {
2206 if ( (elem = unmatched[i]) ) {
2207 if ( !filter || filter( elem, context, xml ) ) {
2208 newUnmatched.push( elem );
2209 if ( mapped ) {
2210 map.push( i );
2211 }
2212 }
2213 }
2214 }
2215
2216 return newUnmatched;
2217 }
2218
2219 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2220 if ( postFilter && !postFilter[ expando ] ) {
2221 postFilter = setMatcher( postFilter );
2222 }
2223 if ( postFinder && !postFinder[ expando ] ) {
2224 postFinder = setMatcher( postFinder, postSelector );
2225 }
2226 return markFunction(function( seed, results, context, xml ) {
2227 var temp, i, elem,
2228 preMap = [],
2229 postMap = [],
2230 preexisting = results.length,
2231
2232 // Get initial elements from seed or context
2233 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2234
2235 // Prefilter to get matcher input, preserving a map for seed-results synchronization
2236 matcherIn = preFilter && ( seed || !selector ) ?
2237 condense( elems, preMap, preFilter, context, xml ) :
2238 elems,
2239
2240 matcherOut = matcher ?
2241 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2242 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2243
2244 // ...intermediate processing is necessary
2245 [] :
2246
2247 // ...otherwise use results directly
2248 results :
2249 matcherIn;
2250
2251 // Find primary matches
2252 if ( matcher ) {
2253 matcher( matcherIn, matcherOut, context, xml );
2254 }
2255
2256 // Apply postFilter
2257 if ( postFilter ) {
2258 temp = condense( matcherOut, postMap );
2259 postFilter( temp, [], context, xml );
2260
2261 // Un-match failing elements by moving them back to matcherIn
2262 i = temp.length;
2263 while ( i-- ) {
2264 if ( (elem = temp[i]) ) {
2265 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2266 }
2267 }
2268 }
2269
2270 if ( seed ) {
2271 if ( postFinder || preFilter ) {
2272 if ( postFinder ) {
2273 // Get the final matcherOut by condensing this intermediate into postFinder contexts
2274 temp = [];
2275 i = matcherOut.length;
2276 while ( i-- ) {
2277 if ( (elem = matcherOut[i]) ) {
2278 // Restore matcherIn since elem is not yet a final match
2279 temp.push( (matcherIn[i] = elem) );
2280 }
2281 }
2282 postFinder( null, (matcherOut = []), temp, xml );
2283 }
2284
2285 // Move matched elements from seed to results to keep them synchronized
2286 i = matcherOut.length;
2287 while ( i-- ) {
2288 if ( (elem = matcherOut[i]) &&
2289 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2290
2291 seed[temp] = !(results[temp] = elem);
2292 }
2293 }
2294 }
2295
2296 // Add elements to results, through postFinder if defined
2297 } else {
2298 matcherOut = condense(
2299 matcherOut === results ?
2300 matcherOut.splice( preexisting, matcherOut.length ) :
2301 matcherOut
2302 );
2303 if ( postFinder ) {
2304 postFinder( null, results, matcherOut, xml );
2305 } else {
2306 push.apply( results, matcherOut );
2307 }
2308 }
2309 });
2310 }
2311
2312 function matcherFromTokens( tokens ) {
2313 var checkContext, matcher, j,
2314 len = tokens.length,
2315 leadingRelative = Expr.relative[ tokens[0].type ],
2316 implicitRelative = leadingRelative || Expr.relative[" "],
2317 i = leadingRelative ? 1 : 0,
2318
2319 // The foundational matcher ensures that elements are reachable from top-level context(s)
2320 matchContext = addCombinator( function( elem ) {
2321 return elem === checkContext;
2322 }, implicitRelative, true ),
2323 matchAnyContext = addCombinator( function( elem ) {
2324 return indexOf( checkContext, elem ) > -1;
2325 }, implicitRelative, true ),
2326 matchers = [ function( elem, context, xml ) {
2327 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2328 (checkContext = context).nodeType ?
2329 matchContext( elem, context, xml ) :
2330 matchAnyContext( elem, context, xml ) );
2331 // Avoid hanging onto element (issue #299)
2332 checkContext = null;
2333 return ret;
2334 } ];
2335
2336 for ( ; i < len; i++ ) {
2337 if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2338 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2339 } else {
2340 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2341
2342 // Return special upon seeing a positional matcher
2343 if ( matcher[ expando ] ) {
2344 // Find the next relative operator (if any) for proper handling
2345 j = ++i;
2346 for ( ; j < len; j++ ) {
2347 if ( Expr.relative[ tokens[j].type ] ) {
2348 break;
2349 }
2350 }
2351 return setMatcher(
2352 i > 1 && elementMatcher( matchers ),
2353 i > 1 && toSelector(
2354 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2355 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2356 ).replace( rtrim, "$1" ),
2357 matcher,
2358 i < j && matcherFromTokens( tokens.slice( i, j ) ),
2359 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2360 j < len && toSelector( tokens )
2361 );
2362 }
2363 matchers.push( matcher );
2364 }
2365 }
2366
2367 return elementMatcher( matchers );
2368 }
2369
2370 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2371 var bySet = setMatchers.length > 0,
2372 byElement = elementMatchers.length > 0,
2373 superMatcher = function( seed, context, xml, results, outermost ) {
2374 var elem, j, matcher,
2375 matchedCount = 0,
2376 i = "0",
2377 unmatched = seed && [],
2378 setMatched = [],
2379 contextBackup = outermostContext,
2380 // We must always have either seed elements or outermost context
2381 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2382 // Use integer dirruns iff this is the outermost matcher
2383 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2384 len = elems.length;
2385
2386 if ( outermost ) {
2387 outermostContext = context !== document && context;
2388 }
2389
2390 // Add elements passing elementMatchers directly to results
2391 // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2392 // Support: IE<9, Safari
2393 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2394 for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2395 if ( byElement && elem ) {
2396 j = 0;
2397 while ( (matcher = elementMatchers[j++]) ) {
2398 if ( matcher( elem, context, xml ) ) {
2399 results.push( elem );
2400 break;
2401 }
2402 }
2403 if ( outermost ) {
2404 dirruns = dirrunsUnique;
2405 }
2406 }
2407
2408 // Track unmatched elements for set filters
2409 if ( bySet ) {
2410 // They will have gone through all possible matchers
2411 if ( (elem = !matcher && elem) ) {
2412 matchedCount--;
2413 }
2414
2415 // Lengthen the array for every element, matched or not
2416 if ( seed ) {
2417 unmatched.push( elem );
2418 }
2419 }
2420 }
2421
2422 // Apply set filters to unmatched elements
2423 matchedCount += i;
2424 if ( bySet && i !== matchedCount ) {
2425 j = 0;
2426 while ( (matcher = setMatchers[j++]) ) {
2427 matcher( unmatched, setMatched, context, xml );
2428 }
2429
2430 if ( seed ) {
2431 // Reintegrate element matches to eliminate the need for sorting
2432 if ( matchedCount > 0 ) {
2433 while ( i-- ) {
2434 if ( !(unmatched[i] || setMatched[i]) ) {
2435 setMatched[i] = pop.call( results );
2436 }
2437 }
2438 }
2439
2440 // Discard index placeholder values to get only actual matches
2441 setMatched = condense( setMatched );
2442 }
2443
2444 // Add matches to results
2445 push.apply( results, setMatched );
2446
2447 // Seedless set matches succeeding multiple successful matchers stipulate sorting
2448 if ( outermost && !seed && setMatched.length > 0 &&
2449 ( matchedCount + setMatchers.length ) > 1 ) {
2450
2451 Sizzle.uniqueSort( results );
2452 }
2453 }
2454
2455 // Override manipulation of globals by nested matchers
2456 if ( outermost ) {
2457 dirruns = dirrunsUnique;
2458 outermostContext = contextBackup;
2459 }
2460
2461 return unmatched;
2462 };
2463
2464 return bySet ?
2465 markFunction( superMatcher ) :
2466 superMatcher;
2467 }
2468
2469 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2470 var i,
2471 setMatchers = [],
2472 elementMatchers = [],
2473 cached = compilerCache[ selector + " " ];
2474
2475 if ( !cached ) {
2476 // Generate a function of recursive functions that can be used to check each element
2477 if ( !match ) {
2478 match = tokenize( selector );
2479 }
2480 i = match.length;
2481 while ( i-- ) {
2482 cached = matcherFromTokens( match[i] );
2483 if ( cached[ expando ] ) {
2484 setMatchers.push( cached );
2485 } else {
2486 elementMatchers.push( cached );
2487 }
2488 }
2489
2490 // Cache the compiled function
2491 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2492
2493 // Save selector and tokenization
2494 cached.selector = selector;
2495 }
2496 return cached;
2497 };
2498
2499 /**
2500 * A low-level selection function that works with Sizzle's compiled
2501 * selector functions
2502 * @param {String|Function} selector A selector or a pre-compiled
2503 * selector function built with Sizzle.compile
2504 * @param {Element} context
2505 * @param {Array} [results]
2506 * @param {Array} [seed] A set of elements to match against
2507 */
2508 select = Sizzle.select = function( selector, context, results, seed ) {
2509 var i, tokens, token, type, find,
2510 compiled = typeof selector === "function" && selector,
2511 match = !seed && tokenize( (selector = compiled.selector || selector) );
2512
2513 results = results || [];
2514
2515 // Try to minimize operations if there is no seed and only one group
2516 if ( match.length === 1 ) {
2517
2518 // Take a shortcut and set the context if the root selector is an ID
2519 tokens = match[0] = match[0].slice( 0 );
2520 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2521 support.getById && context.nodeType === 9 && documentIsHTML &&
2522 Expr.relative[ tokens[1].type ] ) {
2523
2524 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2525 if ( !context ) {
2526 return results;
2527
2528 // Precompiled matchers will still verify ancestry, so step up a level
2529 } else if ( compiled ) {
2530 context = context.parentNode;
2531 }
2532
2533 selector = selector.slice( tokens.shift().value.length );
2534 }
2535
2536 // Fetch a seed set for right-to-left matching
2537 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2538 while ( i-- ) {
2539 token = tokens[i];
2540
2541 // Abort if we hit a combinator
2542 if ( Expr.relative[ (type = token.type) ] ) {
2543 break;
2544 }
2545 if ( (find = Expr.find[ type ]) ) {
2546 // Search, expanding context for leading sibling combinators
2547 if ( (seed = find(
2548 token.matches[0].replace( runescape, funescape ),
2549 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2550 )) ) {
2551
2552 // If seed is empty or no tokens remain, we can return early
2553 tokens.splice( i, 1 );
2554 selector = seed.length && toSelector( tokens );
2555 if ( !selector ) {
2556 push.apply( results, seed );
2557 return results;
2558 }
2559
2560 break;
2561 }
2562 }
2563 }
2564 }
2565
2566 // Compile and execute a filtering function if one is not provided
2567 // Provide `match` to avoid retokenization if we modified the selector above
2568 ( compiled || compile( selector, match ) )(
2569 seed,
2570 context,
2571 !documentIsHTML,
2572 results,
2573 rsibling.test( selector ) && testContext( context.parentNode ) || context
2574 );
2575 return results;
2576 };
2577
2578 // One-time assignments
2579
2580 // Sort stability
2581 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2582
2583 // Support: Chrome 14-35+
2584 // Always assume duplicates if they aren't passed to the comparison function
2585 support.detectDuplicates = !!hasDuplicate;
2586
2587 // Initialize against the default document
2588 setDocument();
2589
2590 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2591 // Detached nodes confoundingly follow *each other*
2592 support.sortDetached = assert(function( div1 ) {
2593 // Should return 1, but returns 4 (following)
2594 return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2595 });
2596
2597 // Support: IE<8
2598 // Prevent attribute/property "interpolation"
2599 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2600 if ( !assert(function( div ) {
2601 div.innerHTML = "<a href='#'></a>";
2602 return div.firstChild.getAttribute("href") === "#" ;
2603 }) ) {
2604 addHandle( "type|href|height|width", function( elem, name, isXML ) {
2605 if ( !isXML ) {
2606 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2607 }
2608 });
2609 }
2610
2611 // Support: IE<9
2612 // Use defaultValue in place of getAttribute("value")
2613 if ( !support.attributes || !assert(function( div ) {
2614 div.innerHTML = "<input/>";
2615 div.firstChild.setAttribute( "value", "" );
2616 return div.firstChild.getAttribute( "value" ) === "";
2617 }) ) {
2618 addHandle( "value", function( elem, name, isXML ) {
2619 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2620 return elem.defaultValue;
2621 }
2622 });
2623 }
2624
2625 // Support: IE<9
2626 // Use getAttributeNode to fetch booleans when getAttribute lies
2627 if ( !assert(function( div ) {
2628 return div.getAttribute("disabled") == null;
2629 }) ) {
2630 addHandle( booleans, function( elem, name, isXML ) {
2631 var val;
2632 if ( !isXML ) {
2633 return elem[ name ] === true ? name.toLowerCase() :
2634 (val = elem.getAttributeNode( name )) && val.specified ?
2635 val.value :
2636 null;
2637 }
2638 });
2639 }
2640
2641 return Sizzle;
2642
2643 })( window );
2644
2645
2646
2647 jQuery.find = Sizzle;
2648 jQuery.expr = Sizzle.selectors;
2649 jQuery.expr[":"] = jQuery.expr.pseudos;
2650 jQuery.unique = Sizzle.uniqueSort;
2651 jQuery.text = Sizzle.getText;
2652 jQuery.isXMLDoc = Sizzle.isXML;
2653 jQuery.contains = Sizzle.contains;
2654
2655
2656
2657 var rneedsContext = jQuery.expr.match.needsContext;
2658
2659 var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
2660
2661
2662
2663 var risSimple = /^.[^:#\[\.,]*$/;
2664
2665 // Implement the identical functionality for filter and not
2666 function winnow( elements, qualifier, not ) {
2667 if ( jQuery.isFunction( qualifier ) ) {
2668 return jQuery.grep( elements, function( elem, i ) {
2669 /* jshint -W018 */
2670 return !!qualifier.call( elem, i, elem ) !== not;
2671 });
2672
2673 }
2674
2675 if ( qualifier.nodeType ) {
2676 return jQuery.grep( elements, function( elem ) {
2677 return ( elem === qualifier ) !== not;
2678 });
2679
2680 }
2681
2682 if ( typeof qualifier === "string" ) {
2683 if ( risSimple.test( qualifier ) ) {
2684 return jQuery.filter( qualifier, elements, not );
2685 }
2686
2687 qualifier = jQuery.filter( qualifier, elements );
2688 }
2689
2690 return jQuery.grep( elements, function( elem ) {
2691 return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
2692 });
2693 }
2694
2695 jQuery.filter = function( expr, elems, not ) {
2696 var elem = elems[ 0 ];
2697
2698 if ( not ) {
2699 expr = ":not(" + expr + ")";
2700 }
2701
2702 return elems.length === 1 && elem.nodeType === 1 ?
2703 jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2704 jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2705 return elem.nodeType === 1;
2706 }));
2707 };
2708
2709 jQuery.fn.extend({
2710 find: function( selector ) {
2711 var i,
2712 ret = [],
2713 self = this,
2714 len = self.length;
2715
2716 if ( typeof selector !== "string" ) {
2717 return this.pushStack( jQuery( selector ).filter(function() {
2718 for ( i = 0; i < len; i++ ) {
2719 if ( jQuery.contains( self[ i ], this ) ) {
2720 return true;
2721 }
2722 }
2723 }) );
2724 }
2725
2726 for ( i = 0; i < len; i++ ) {
2727 jQuery.find( selector, self[ i ], ret );
2728 }
2729
2730 // Needed because $( selector, context ) becomes $( context ).find( selector )
2731 ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2732 ret.selector = this.selector ? this.selector + " " + selector : selector;
2733 return ret;
2734 },
2735 filter: function( selector ) {
2736 return this.pushStack( winnow(this, selector || [], false) );
2737 },
2738 not: function( selector ) {
2739 return this.pushStack( winnow(this, selector || [], true) );
2740 },
2741 is: function( selector ) {
2742 return !!winnow(
2743 this,
2744
2745 // If this is a positional/relative selector, check membership in the returned set
2746 // so $("p:first").is("p:last") won't return true for a doc with two "p".
2747 typeof selector === "string" && rneedsContext.test( selector ) ?
2748 jQuery( selector ) :
2749 selector || [],
2750 false
2751 ).length;
2752 }
2753 });
2754
2755
2756 // Initialize a jQuery object
2757
2758
2759 // A central reference to the root jQuery(document)
2760 var rootjQuery,
2761
2762 // Use the correct document accordingly with window argument (sandbox)
2763 document = window.document,
2764
2765 // A simple way to check for HTML strings
2766 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2767 // Strict HTML recognition (#11290: must start with <)
2768 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2769
2770 init = jQuery.fn.init = function( selector, context ) {
2771 var match, elem;
2772
2773 // HANDLE: $(""), $(null), $(undefined), $(false)
2774 if ( !selector ) {
2775 return this;
2776 }
2777
2778 // Handle HTML strings
2779 if ( typeof selector === "string" ) {
2780 if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
2781 // Assume that strings that start and end with <> are HTML and skip the regex check
2782 match = [ null, selector, null ];
2783
2784 } else {
2785 match = rquickExpr.exec( selector );
2786 }
2787
2788 // Match html or make sure no context is specified for #id
2789 if ( match && (match[1] || !context) ) {
2790
2791 // HANDLE: $(html) -> $(array)
2792 if ( match[1] ) {
2793 context = context instanceof jQuery ? context[0] : context;
2794
2795 // scripts is true for back-compat
2796 // Intentionally let the error be thrown if parseHTML is not present
2797 jQuery.merge( this, jQuery.parseHTML(
2798 match[1],
2799 context && context.nodeType ? context.ownerDocument || context : document,
2800 true
2801 ) );
2802
2803 // HANDLE: $(html, props)
2804 if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
2805 for ( match in context ) {
2806 // Properties of context are called as methods if possible
2807 if ( jQuery.isFunction( this[ match ] ) ) {
2808 this[ match ]( context[ match ] );
2809
2810 // ...and otherwise set as attributes
2811 } else {
2812 this.attr( match, context[ match ] );
2813 }
2814 }
2815 }
2816
2817 return this;
2818
2819 // HANDLE: $(#id)
2820 } else {
2821 elem = document.getElementById( match[2] );
2822
2823 // Check parentNode to catch when Blackberry 4.6 returns
2824 // nodes that are no longer in the document #6963
2825 if ( elem && elem.parentNode ) {
2826 // Handle the case where IE and Opera return items
2827 // by name instead of ID
2828 if ( elem.id !== match[2] ) {
2829 return rootjQuery.find( selector );
2830 }
2831
2832 // Otherwise, we inject the element directly into the jQuery object
2833 this.length = 1;
2834 this[0] = elem;
2835 }
2836
2837 this.context = document;
2838 this.selector = selector;
2839 return this;
2840 }
2841
2842 // HANDLE: $(expr, $(...))
2843 } else if ( !context || context.jquery ) {
2844 return ( context || rootjQuery ).find( selector );
2845
2846 // HANDLE: $(expr, context)
2847 // (which is just equivalent to: $(context).find(expr)
2848 } else {
2849 return this.constructor( context ).find( selector );
2850 }
2851
2852 // HANDLE: $(DOMElement)
2853 } else if ( selector.nodeType ) {
2854 this.context = this[0] = selector;
2855 this.length = 1;
2856 return this;
2857
2858 // HANDLE: $(function)
2859 // Shortcut for document ready
2860 } else if ( jQuery.isFunction( selector ) ) {
2861 return typeof rootjQuery.ready !== "undefined" ?
2862 rootjQuery.ready( selector ) :
2863 // Execute immediately if ready is not present
2864 selector( jQuery );
2865 }
2866
2867 if ( selector.selector !== undefined ) {
2868 this.selector = selector.selector;
2869 this.context = selector.context;
2870 }
2871
2872 return jQuery.makeArray( selector, this );
2873 };
2874
2875 // Give the init function the jQuery prototype for later instantiation
2876 init.prototype = jQuery.fn;
2877
2878 // Initialize central reference
2879 rootjQuery = jQuery( document );
2880
2881
2882 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2883 // methods guaranteed to produce a unique set when starting from a unique set
2884 guaranteedUnique = {
2885 children: true,
2886 contents: true,
2887 next: true,
2888 prev: true
2889 };
2890
2891 jQuery.extend({
2892 dir: function( elem, dir, until ) {
2893 var matched = [],
2894 cur = elem[ dir ];
2895
2896 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
2897 if ( cur.nodeType === 1 ) {
2898 matched.push( cur );
2899 }
2900 cur = cur[dir];
2901 }
2902 return matched;
2903 },
2904
2905 sibling: function( n, elem ) {
2906 var r = [];
2907
2908 for ( ; n; n = n.nextSibling ) {
2909 if ( n.nodeType === 1 && n !== elem ) {
2910 r.push( n );
2911 }
2912 }
2913
2914 return r;
2915 }
2916 });
2917
2918 jQuery.fn.extend({
2919 has: function( target ) {
2920 var i,
2921 targets = jQuery( target, this ),
2922 len = targets.length;
2923
2924 return this.filter(function() {
2925 for ( i = 0; i < len; i++ ) {
2926 if ( jQuery.contains( this, targets[i] ) ) {
2927 return true;
2928 }
2929 }
2930 });
2931 },
2932
2933 closest: function( selectors, context ) {
2934 var cur,
2935 i = 0,
2936 l = this.length,
2937 matched = [],
2938 pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
2939 jQuery( selectors, context || this.context ) :
2940 0;
2941
2942 for ( ; i < l; i++ ) {
2943 for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
2944 // Always skip document fragments
2945 if ( cur.nodeType < 11 && (pos ?
2946 pos.index(cur) > -1 :
2947
2948 // Don't pass non-elements to Sizzle
2949 cur.nodeType === 1 &&
2950 jQuery.find.matchesSelector(cur, selectors)) ) {
2951
2952 matched.push( cur );
2953 break;
2954 }
2955 }
2956 }
2957
2958 return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
2959 },
2960
2961 // Determine the position of an element within
2962 // the matched set of elements
2963 index: function( elem ) {
2964
2965 // No argument, return index in parent
2966 if ( !elem ) {
2967 return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
2968 }
2969
2970 // index in selector
2971 if ( typeof elem === "string" ) {
2972 return jQuery.inArray( this[0], jQuery( elem ) );
2973 }
2974
2975 // Locate the position of the desired element
2976 return jQuery.inArray(
2977 // If it receives a jQuery object, the first element is used
2978 elem.jquery ? elem[0] : elem, this );
2979 },
2980
2981 add: function( selector, context ) {
2982 return this.pushStack(
2983 jQuery.unique(
2984 jQuery.merge( this.get(), jQuery( selector, context ) )
2985 )
2986 );
2987 },
2988
2989 addBack: function( selector ) {
2990 return this.add( selector == null ?
2991 this.prevObject : this.prevObject.filter(selector)
2992 );
2993 }
2994 });
2995
2996 function sibling( cur, dir ) {
2997 do {
2998 cur = cur[ dir ];
2999 } while ( cur && cur.nodeType !== 1 );
3000
3001 return cur;
3002 }
3003
3004 jQuery.each({
3005 parent: function( elem ) {
3006 var parent = elem.parentNode;
3007 return parent && parent.nodeType !== 11 ? parent : null;
3008 },
3009 parents: function( elem ) {
3010 return jQuery.dir( elem, "parentNode" );
3011 },
3012 parentsUntil: function( elem, i, until ) {
3013 return jQuery.dir( elem, "parentNode", until );
3014 },
3015 next: function( elem ) {
3016 return sibling( elem, "nextSibling" );
3017 },
3018 prev: function( elem ) {
3019 return sibling( elem, "previousSibling" );
3020 },
3021 nextAll: function( elem ) {
3022 return jQuery.dir( elem, "nextSibling" );
3023 },
3024 prevAll: function( elem ) {
3025 return jQuery.dir( elem, "previousSibling" );
3026 },
3027 nextUntil: function( elem, i, until ) {
3028 return jQuery.dir( elem, "nextSibling", until );
3029 },
3030 prevUntil: function( elem, i, until ) {
3031 return jQuery.dir( elem, "previousSibling", until );
3032 },
3033 siblings: function( elem ) {
3034 return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
3035 },
3036 children: function( elem ) {
3037 return jQuery.sibling( elem.firstChild );
3038 },
3039 contents: function( elem ) {
3040 return jQuery.nodeName( elem, "iframe" ) ?
3041 elem.contentDocument || elem.contentWindow.document :
3042 jQuery.merge( [], elem.childNodes );
3043 }
3044 }, function( name, fn ) {
3045 jQuery.fn[ name ] = function( until, selector ) {
3046 var ret = jQuery.map( this, fn, until );
3047
3048 if ( name.slice( -5 ) !== "Until" ) {
3049 selector = until;
3050 }
3051
3052 if ( selector && typeof selector === "string" ) {
3053 ret = jQuery.filter( selector, ret );
3054 }
3055
3056 if ( this.length > 1 ) {
3057 // Remove duplicates
3058 if ( !guaranteedUnique[ name ] ) {
3059 ret = jQuery.unique( ret );
3060 }
3061
3062 // Reverse order for parents* and prev-derivatives
3063 if ( rparentsprev.test( name ) ) {
3064 ret = ret.reverse();
3065 }
3066 }
3067
3068 return this.pushStack( ret );
3069 };
3070 });
3071 var rnotwhite = (/\S+/g);
3072
3073
3074
3075 // String to Object options format cache
3076 var optionsCache = {};
3077
3078 // Convert String-formatted options into Object-formatted ones and store in cache
3079 function createOptions( options ) {
3080 var object = optionsCache[ options ] = {};
3081 jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
3082 object[ flag ] = true;
3083 });
3084 return object;
3085 }
3086
3087 /*
3088 * Create a callback list using the following parameters:
3089 *
3090 * options: an optional list of space-separated options that will change how
3091 * the callback list behaves or a more traditional option object
3092 *
3093 * By default a callback list will act like an event callback list and can be
3094 * "fired" multiple times.
3095 *
3096 * Possible options:
3097 *
3098 * once: will ensure the callback list can only be fired once (like a Deferred)
3099 *
3100 * memory: will keep track of previous values and will call any callback added
3101 * after the list has been fired right away with the latest "memorized"
3102 * values (like a Deferred)
3103 *
3104 * unique: will ensure a callback can only be added once (no duplicate in the list)
3105 *
3106 * stopOnFalse: interrupt callings when a callback returns false
3107 *
3108 */
3109 jQuery.Callbacks = function( options ) {
3110
3111 // Convert options from String-formatted to Object-formatted if needed
3112 // (we check in cache first)
3113 options = typeof options === "string" ?
3114 ( optionsCache[ options ] || createOptions( options ) ) :
3115 jQuery.extend( {}, options );
3116
3117 var // Flag to know if list is currently firing
3118 firing,
3119 // Last fire value (for non-forgettable lists)
3120 memory,
3121 // Flag to know if list was already fired
3122 fired,
3123 // End of the loop when firing
3124 firingLength,
3125 // Index of currently firing callback (modified by remove if needed)
3126 firingIndex,
3127 // First callback to fire (used internally by add and fireWith)
3128 firingStart,
3129 // Actual callback list
3130 list = [],
3131 // Stack of fire calls for repeatable lists
3132 stack = !options.once && [],
3133 // Fire callbacks
3134 fire = function( data ) {
3135 memory = options.memory && data;
3136 fired = true;
3137 firingIndex = firingStart || 0;
3138 firingStart = 0;
3139 firingLength = list.length;
3140 firing = true;
3141 for ( ; list && firingIndex < firingLength; firingIndex++ ) {
3142 if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3143 memory = false; // To prevent further calls using add
3144 break;
3145 }
3146 }
3147 firing = false;
3148 if ( list ) {
3149 if ( stack ) {
3150 if ( stack.length ) {
3151 fire( stack.shift() );
3152 }
3153 } else if ( memory ) {
3154 list = [];
3155 } else {
3156 self.disable();
3157 }
3158 }
3159 },
3160 // Actual Callbacks object
3161 self = {
3162 // Add a callback or a collection of callbacks to the list
3163 add: function() {
3164 if ( list ) {
3165 // First, we save the current length
3166 var start = list.length;
3167 (function add( args ) {
3168 jQuery.each( args, function( _, arg ) {
3169 var type = jQuery.type( arg );
3170 if ( type === "function" ) {
3171 if ( !options.unique || !self.has( arg ) ) {
3172 list.push( arg );
3173 }
3174 } else if ( arg && arg.length && type !== "string" ) {
3175 // Inspect recursively
3176 add( arg );
3177 }
3178 });
3179 })( arguments );
3180 // Do we need to add the callbacks to the
3181 // current firing batch?
3182 if ( firing ) {
3183 firingLength = list.length;
3184 // With memory, if we're not firing then
3185 // we should call right away
3186 } else if ( memory ) {
3187 firingStart = start;
3188 fire( memory );
3189 }
3190 }
3191 return this;
3192 },
3193 // Remove a callback from the list
3194 remove: function() {
3195 if ( list ) {
3196 jQuery.each( arguments, function( _, arg ) {
3197 var index;
3198 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3199 list.splice( index, 1 );
3200 // Handle firing indexes
3201 if ( firing ) {
3202 if ( index <= firingLength ) {
3203 firingLength--;
3204 }
3205 if ( index <= firingIndex ) {
3206 firingIndex--;
3207 }
3208 }
3209 }
3210 });
3211 }
3212 return this;
3213 },
3214 // Check if a given callback is in the list.
3215 // If no argument is given, return whether or not list has callbacks attached.
3216 has: function( fn ) {
3217 return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3218 },
3219 // Remove all callbacks from the list
3220 empty: function() {
3221 list = [];
3222 firingLength = 0;
3223 return this;
3224 },
3225 // Have the list do nothing anymore
3226 disable: function() {
3227 list = stack = memory = undefined;
3228 return this;
3229 },
3230 // Is it disabled?
3231 disabled: function() {
3232 return !list;
3233 },
3234 // Lock the list in its current state
3235 lock: function() {
3236 stack = undefined;
3237 if ( !memory ) {
3238 self.disable();
3239 }
3240 return this;
3241 },
3242 // Is it locked?
3243 locked: function() {
3244 return !stack;
3245 },
3246 // Call all callbacks with the given context and arguments
3247 fireWith: function( context, args ) {
3248 if ( list && ( !fired || stack ) ) {
3249 args = args || [];
3250 args = [ context, args.slice ? args.slice() : args ];
3251 if ( firing ) {
3252 stack.push( args );
3253 } else {
3254 fire( args );
3255 }
3256 }
3257 return this;
3258 },
3259 // Call all the callbacks with the given arguments
3260 fire: function() {
3261 self.fireWith( this, arguments );
3262 return this;
3263 },
3264 // To know if the callbacks have already been called at least once
3265 fired: function() {
3266 return !!fired;
3267 }
3268 };
3269
3270 return self;
3271 };
3272
3273
3274 jQuery.extend({
3275
3276 Deferred: function( func ) {
3277 var tuples = [
3278 // action, add listener, listener list, final state
3279 [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3280 [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3281 [ "notify", "progress", jQuery.Callbacks("memory") ]
3282 ],
3283 state = "pending",
3284 promise = {
3285 state: function() {
3286 return state;
3287 },
3288 always: function() {
3289 deferred.done( arguments ).fail( arguments );
3290 return this;
3291 },
3292 then: function( /* fnDone, fnFail, fnProgress */ ) {
3293 var fns = arguments;
3294 return jQuery.Deferred(function( newDefer ) {
3295 jQuery.each( tuples, function( i, tuple ) {
3296 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3297 // deferred[ done | fail | progress ] for forwarding actions to newDefer
3298 deferred[ tuple[1] ](function() {
3299 var returned = fn && fn.apply( this, arguments );
3300 if ( returned && jQuery.isFunction( returned.promise ) ) {
3301 returned.promise()
3302 .done( newDefer.resolve )
3303 .fail( newDefer.reject )
3304 .progress( newDefer.notify );
3305 } else {
3306 newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3307 }
3308 });
3309 });
3310 fns = null;
3311 }).promise();
3312 },
3313 // Get a promise for this deferred
3314 // If obj is provided, the promise aspect is added to the object
3315 promise: function( obj ) {
3316 return obj != null ? jQuery.extend( obj, promise ) : promise;
3317 }
3318 },
3319 deferred = {};
3320
3321 // Keep pipe for back-compat
3322 promise.pipe = promise.then;
3323
3324 // Add list-specific methods
3325 jQuery.each( tuples, function( i, tuple ) {
3326 var list = tuple[ 2 ],
3327 stateString = tuple[ 3 ];
3328
3329 // promise[ done | fail | progress ] = list.add
3330 promise[ tuple[1] ] = list.add;
3331
3332 // Handle state
3333 if ( stateString ) {
3334 list.add(function() {
3335 // state = [ resolved | rejected ]
3336 state = stateString;
3337
3338 // [ reject_list | resolve_list ].disable; progress_list.lock
3339 }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3340 }
3341
3342 // deferred[ resolve | reject | notify ]
3343 deferred[ tuple[0] ] = function() {
3344 deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3345 return this;
3346 };
3347 deferred[ tuple[0] + "With" ] = list.fireWith;
3348 });
3349
3350 // Make the deferred a promise
3351 promise.promise( deferred );
3352
3353 // Call given func if any
3354 if ( func ) {
3355 func.call( deferred, deferred );
3356 }
3357
3358 // All done!
3359 return deferred;
3360 },
3361
3362 // Deferred helper
3363 when: function( subordinate /* , ..., subordinateN */ ) {
3364 var i = 0,
3365 resolveValues = slice.call( arguments ),
3366 length = resolveValues.length,
3367
3368 // the count of uncompleted subordinates
3369 remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3370
3371 // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3372 deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3373
3374 // Update function for both resolve and progress values
3375 updateFunc = function( i, contexts, values ) {
3376 return function( value ) {
3377 contexts[ i ] = this;
3378 values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3379 if ( values === progressValues ) {
3380 deferred.notifyWith( contexts, values );
3381
3382 } else if ( !(--remaining) ) {
3383 deferred.resolveWith( contexts, values );
3384 }
3385 };
3386 },
3387
3388 progressValues, progressContexts, resolveContexts;
3389
3390 // add listeners to Deferred subordinates; treat others as resolved
3391 if ( length > 1 ) {
3392 progressValues = new Array( length );
3393 progressContexts = new Array( length );
3394 resolveContexts = new Array( length );
3395 for ( ; i < length; i++ ) {
3396 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3397 resolveValues[ i ].promise()
3398 .done( updateFunc( i, resolveContexts, resolveValues ) )
3399 .fail( deferred.reject )
3400 .progress( updateFunc( i, progressContexts, progressValues ) );
3401 } else {
3402 --remaining;
3403 }
3404 }
3405 }
3406
3407 // if we're not waiting on anything, resolve the master
3408 if ( !remaining ) {
3409 deferred.resolveWith( resolveContexts, resolveValues );
3410 }
3411
3412 return deferred.promise();
3413 }
3414 });
3415
3416
3417 // The deferred used on DOM ready
3418 var readyList;
3419
3420 jQuery.fn.ready = function( fn ) {
3421 // Add the callback
3422 jQuery.ready.promise().done( fn );
3423
3424 return this;
3425 };
3426
3427 jQuery.extend({
3428 // Is the DOM ready to be used? Set to true once it occurs.
3429 isReady: false,
3430
3431 // A counter to track how many items to wait for before
3432 // the ready event fires. See #6781
3433 readyWait: 1,
3434
3435 // Hold (or release) the ready event
3436 holdReady: function( hold ) {
3437 if ( hold ) {
3438 jQuery.readyWait++;
3439 } else {
3440 jQuery.ready( true );
3441 }
3442 },
3443
3444 // Handle when the DOM is ready
3445 ready: function( wait ) {
3446
3447 // Abort if there are pending holds or we're already ready
3448 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3449 return;
3450 }
3451
3452 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
3453 if ( !document.body ) {
3454 return setTimeout( jQuery.ready );
3455 }
3456
3457 // Remember that the DOM is ready
3458 jQuery.isReady = true;
3459
3460 // If a normal DOM Ready event fired, decrement, and wait if need be
3461 if ( wait !== true && --jQuery.readyWait > 0 ) {
3462 return;
3463 }
3464
3465 // If there are functions bound, to execute
3466 readyList.resolveWith( document, [ jQuery ] );
3467
3468 // Trigger any bound ready events
3469 if ( jQuery.fn.triggerHandler ) {
3470 jQuery( document ).triggerHandler( "ready" );
3471 jQuery( document ).off( "ready" );
3472 }
3473 }
3474 });
3475
3476 /**
3477 * Clean-up method for dom ready events
3478 */
3479 function detach() {
3480 if ( document.addEventListener ) {
3481 document.removeEventListener( "DOMContentLoaded", completed, false );
3482 window.removeEventListener( "load", completed, false );
3483
3484 } else {
3485 document.detachEvent( "onreadystatechange", completed );
3486 window.detachEvent( "onload", completed );
3487 }
3488 }
3489
3490 /**
3491 * The ready event handler and self cleanup method
3492 */
3493 function completed() {
3494 // readyState === "complete" is good enough for us to call the dom ready in oldIE
3495 if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
3496 detach();
3497 jQuery.ready();
3498 }
3499 }
3500
3501 jQuery.ready.promise = function( obj ) {
3502 if ( !readyList ) {
3503
3504 readyList = jQuery.Deferred();
3505
3506 // Catch cases where $(document).ready() is called after the browser event has already occurred.
3507 // we once tried to use readyState "interactive" here, but it caused issues like the one
3508 // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
3509 if ( document.readyState === "complete" ) {
3510 // Handle it asynchronously to allow scripts the opportunity to delay ready
3511 setTimeout( jQuery.ready );
3512
3513 // Standards-based browsers support DOMContentLoaded
3514 } else if ( document.addEventListener ) {
3515 // Use the handy event callback
3516 document.addEventListener( "DOMContentLoaded", completed, false );
3517
3518 // A fallback to window.onload, that will always work
3519 window.addEventListener( "load", completed, false );
3520
3521 // If IE event model is used
3522 } else {
3523 // Ensure firing before onload, maybe late but safe also for iframes
3524 document.attachEvent( "onreadystatechange", completed );
3525
3526 // A fallback to window.onload, that will always work
3527 window.attachEvent( "onload", completed );
3528
3529 // If IE and not a frame
3530 // continually check to see if the document is ready
3531 var top = false;
3532
3533 try {
3534 top = window.frameElement == null && document.documentElement;
3535 } catch(e) {}
3536
3537 if ( top && top.doScroll ) {
3538 (function doScrollCheck() {
3539 if ( !jQuery.isReady ) {
3540
3541 try {
3542 // Use the trick by Diego Perini
3543 // http://javascript.nwbox.com/IEContentLoaded/
3544 top.doScroll("left");
3545 } catch(e) {
3546 return setTimeout( doScrollCheck, 50 );
3547 }
3548
3549 // detach all dom ready events
3550 detach();
3551
3552 // and execute any waiting functions
3553 jQuery.ready();
3554 }
3555 })();
3556 }
3557 }
3558 }
3559 return readyList.promise( obj );
3560 };
3561
3562
3563 var strundefined = typeof undefined;
3564
3565
3566
3567 // Support: IE<9
3568 // Iteration over object's inherited properties before its own
3569 var i;
3570 for ( i in jQuery( support ) ) {
3571 break;
3572 }
3573 support.ownLast = i !== "0";
3574
3575 // Note: most support tests are defined in their respective modules.
3576 // false until the test is run
3577 support.inlineBlockNeedsLayout = false;
3578
3579 // Execute ASAP in case we need to set body.style.zoom
3580 jQuery(function() {
3581 // Minified: var a,b,c,d
3582 var val, div, body, container;
3583
3584 body = document.getElementsByTagName( "body" )[ 0 ];
3585 if ( !body || !body.style ) {
3586 // Return for frameset docs that don't have a body
3587 return;
3588 }
3589
3590 // Setup
3591 div = document.createElement( "div" );
3592 container = document.createElement( "div" );
3593 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3594 body.appendChild( container ).appendChild( div );
3595
3596 if ( typeof div.style.zoom !== strundefined ) {
3597 // Support: IE<8
3598 // Check if natively block-level elements act like inline-block
3599 // elements when setting their display to 'inline' and giving
3600 // them layout
3601 div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3602
3603 support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3604 if ( val ) {
3605 // Prevent IE 6 from affecting layout for positioned elements #11048
3606 // Prevent IE from shrinking the body in IE 7 mode #12869
3607 // Support: IE<8
3608 body.style.zoom = 1;
3609 }
3610 }
3611
3612 body.removeChild( container );
3613 });
3614
3615
3616
3617
3618 (function() {
3619 var div = document.createElement( "div" );
3620
3621 // Execute the test only if not already executed in another module.
3622 if (support.deleteExpando == null) {
3623 // Support: IE<9
3624 support.deleteExpando = true;
3625 try {
3626 delete div.test;
3627 } catch( e ) {
3628 support.deleteExpando = false;
3629 }
3630 }
3631
3632 // Null elements to avoid leaks in IE.
3633 div = null;
3634 })();
3635
3636
3637 /**
3638 * Determines whether an object can have data
3639 */
3640 jQuery.acceptData = function( elem ) {
3641 var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
3642 nodeType = +elem.nodeType || 1;
3643
3644 // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3645 return nodeType !== 1 && nodeType !== 9 ?
3646 false :
3647
3648 // Nodes accept data unless otherwise specified; rejection can be conditional
3649 !noData || noData !== true && elem.getAttribute("classid") === noData;
3650 };
3651
3652
3653 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3654 rmultiDash = /([A-Z])/g;
3655
3656 function dataAttr( elem, key, data ) {
3657 // If nothing was found internally, try to fetch any
3658 // data from the HTML5 data-* attribute
3659 if ( data === undefined && elem.nodeType === 1 ) {
3660
3661 var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3662
3663 data = elem.getAttribute( name );
3664
3665 if ( typeof data === "string" ) {
3666 try {
3667 data = data === "true" ? true :
3668 data === "false" ? false :
3669 data === "null" ? null :
3670 // Only convert to a number if it doesn't change the string
3671 +data + "" === data ? +data :
3672 rbrace.test( data ) ? jQuery.parseJSON( data ) :
3673 data;
3674 } catch( e ) {}
3675
3676 // Make sure we set the data so it isn't changed later
3677 jQuery.data( elem, key, data );
3678
3679 } else {
3680 data = undefined;
3681 }
3682 }
3683
3684 return data;
3685 }
3686
3687 // checks a cache object for emptiness
3688 function isEmptyDataObject( obj ) {
3689 var name;
3690 for ( name in obj ) {
3691
3692 // if the public data object is empty, the private is still empty
3693 if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3694 continue;
3695 }
3696 if ( name !== "toJSON" ) {
3697 return false;
3698 }
3699 }
3700
3701 return true;
3702 }
3703
3704 function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
3705 if ( !jQuery.acceptData( elem ) ) {
3706 return;
3707 }
3708
3709 var ret, thisCache,
3710 internalKey = jQuery.expando,
3711
3712 // We have to handle DOM nodes and JS objects differently because IE6-7
3713 // can't GC object references properly across the DOM-JS boundary
3714 isNode = elem.nodeType,
3715
3716 // Only DOM nodes need the global jQuery cache; JS object data is
3717 // attached directly to the object so GC can occur automatically
3718 cache = isNode ? jQuery.cache : elem,
3719
3720 // Only defining an ID for JS objects if its cache already exists allows
3721 // the code to shortcut on the same path as a DOM node with no cache
3722 id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3723
3724 // Avoid doing any more work than we need to when trying to get data on an
3725 // object that has no data at all
3726 if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
3727 return;
3728 }
3729
3730 if ( !id ) {
3731 // Only DOM nodes need a new unique ID for each element since their data
3732 // ends up in the global cache
3733 if ( isNode ) {
3734 id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
3735 } else {
3736 id = internalKey;
3737 }
3738 }
3739
3740 if ( !cache[ id ] ) {
3741 // Avoid exposing jQuery metadata on plain JS objects when the object
3742 // is serialized using JSON.stringify
3743 cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3744 }
3745
3746 // An object can be passed to jQuery.data instead of a key/value pair; this gets
3747 // shallow copied over onto the existing cache
3748 if ( typeof name === "object" || typeof name === "function" ) {
3749 if ( pvt ) {
3750 cache[ id ] = jQuery.extend( cache[ id ], name );
3751 } else {
3752 cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3753 }
3754 }
3755
3756 thisCache = cache[ id ];
3757
3758 // jQuery data() is stored in a separate object inside the object's internal data
3759 // cache in order to avoid key collisions between internal data and user-defined
3760 // data.
3761 if ( !pvt ) {
3762 if ( !thisCache.data ) {
3763 thisCache.data = {};
3764 }
3765
3766 thisCache = thisCache.data;
3767 }
3768
3769 if ( data !== undefined ) {
3770 thisCache[ jQuery.camelCase( name ) ] = data;
3771 }
3772
3773 // Check for both converted-to-camel and non-converted data property names
3774 // If a data property was specified
3775 if ( typeof name === "string" ) {
3776
3777 // First Try to find as-is property data
3778 ret = thisCache[ name ];
3779
3780 // Test for null|undefined property data
3781 if ( ret == null ) {
3782
3783 // Try to find the camelCased property
3784 ret = thisCache[ jQuery.camelCase( name ) ];
3785 }
3786 } else {
3787 ret = thisCache;
3788 }
3789
3790 return ret;
3791 }
3792
3793 function internalRemoveData( elem, name, pvt ) {
3794 if ( !jQuery.acceptData( elem ) ) {
3795 return;
3796 }
3797
3798 var thisCache, i,
3799 isNode = elem.nodeType,
3800
3801 // See jQuery.data for more information
3802 cache = isNode ? jQuery.cache : elem,
3803 id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3804
3805 // If there is already no cache entry for this object, there is no
3806 // purpose in continuing
3807 if ( !cache[ id ] ) {
3808 return;
3809 }
3810
3811 if ( name ) {
3812
3813 thisCache = pvt ? cache[ id ] : cache[ id ].data;
3814
3815 if ( thisCache ) {
3816
3817 // Support array or space separated string names for data keys
3818 if ( !jQuery.isArray( name ) ) {
3819
3820 // try the string as a key before any manipulation
3821 if ( name in thisCache ) {
3822 name = [ name ];
3823 } else {
3824
3825 // split the camel cased version by spaces unless a key with the spaces exists
3826 name = jQuery.camelCase( name );
3827 if ( name in thisCache ) {
3828 name = [ name ];
3829 } else {
3830 name = name.split(" ");
3831 }
3832 }
3833 } else {
3834 // If "name" is an array of keys...
3835 // When data is initially created, via ("key", "val") signature,
3836 // keys will be converted to camelCase.
3837 // Since there is no way to tell _how_ a key was added, remove
3838 // both plain key and camelCase key. #12786
3839 // This will only penalize the array argument path.
3840 name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3841 }
3842
3843 i = name.length;
3844 while ( i-- ) {
3845 delete thisCache[ name[i] ];
3846 }
3847
3848 // If there is no data left in the cache, we want to continue
3849 // and let the cache object itself get destroyed
3850 if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
3851 return;
3852 }
3853 }
3854 }
3855
3856 // See jQuery.data for more information
3857 if ( !pvt ) {
3858 delete cache[ id ].data;
3859
3860 // Don't destroy the parent cache unless the internal data object
3861 // had been the only thing left in it
3862 if ( !isEmptyDataObject( cache[ id ] ) ) {
3863 return;
3864 }
3865 }
3866
3867 // Destroy the cache
3868 if ( isNode ) {
3869 jQuery.cleanData( [ elem ], true );
3870
3871 // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3872 /* jshint eqeqeq: false */
3873 } else if ( support.deleteExpando || cache != cache.window ) {
3874 /* jshint eqeqeq: true */
3875 delete cache[ id ];
3876
3877 // When all else fails, null
3878 } else {
3879 cache[ id ] = null;
3880 }
3881 }
3882
3883 jQuery.extend({
3884 cache: {},
3885
3886 // The following elements (space-suffixed to avoid Object.prototype collisions)
3887 // throw uncatchable exceptions if you attempt to set expando properties
3888 noData: {
3889 "applet ": true,
3890 "embed ": true,
3891 // ...but Flash objects (which have this classid) *can* handle expandos
3892 "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3893 },
3894
3895 hasData: function( elem ) {
3896 elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
3897 return !!elem && !isEmptyDataObject( elem );
3898 },
3899
3900 data: function( elem, name, data ) {
3901 return internalData( elem, name, data );
3902 },
3903
3904 removeData: function( elem, name ) {
3905 return internalRemoveData( elem, name );
3906 },
3907
3908 // For internal use only.
3909 _data: function( elem, name, data ) {
3910 return internalData( elem, name, data, true );
3911 },
3912
3913 _removeData: function( elem, name ) {
3914 return internalRemoveData( elem, name, true );
3915 }
3916 });
3917
3918 jQuery.fn.extend({
3919 data: function( key, value ) {
3920 var i, name, data,
3921 elem = this[0],
3922 attrs = elem && elem.attributes;
3923
3924 // Special expections of .data basically thwart jQuery.access,
3925 // so implement the relevant behavior ourselves
3926
3927 // Gets all values
3928 if ( key === undefined ) {
3929 if ( this.length ) {
3930 data = jQuery.data( elem );
3931
3932 if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
3933 i = attrs.length;
3934 while ( i-- ) {
3935
3936 // Support: IE11+
3937 // The attrs elements can be null (#14894)
3938 if ( attrs[ i ] ) {
3939 name = attrs[ i ].name;
3940 if ( name.indexOf( "data-" ) === 0 ) {
3941 name = jQuery.camelCase( name.slice(5) );
3942 dataAttr( elem, name, data[ name ] );
3943 }
3944 }
3945 }
3946 jQuery._data( elem, "parsedAttrs", true );
3947 }
3948 }
3949
3950 return data;
3951 }
3952
3953 // Sets multiple values
3954 if ( typeof key === "object" ) {
3955 return this.each(function() {
3956 jQuery.data( this, key );
3957 });
3958 }
3959
3960 return arguments.length > 1 ?
3961
3962 // Sets one value
3963 this.each(function() {
3964 jQuery.data( this, key, value );
3965 }) :
3966
3967 // Gets one value
3968 // Try to fetch any internally stored data first
3969 elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
3970 },
3971
3972 removeData: function( key ) {
3973 return this.each(function() {
3974 jQuery.removeData( this, key );
3975 });
3976 }
3977 });
3978
3979
3980 jQuery.extend({
3981 queue: function( elem, type, data ) {
3982 var queue;
3983
3984 if ( elem ) {
3985 type = ( type || "fx" ) + "queue";
3986 queue = jQuery._data( elem, type );
3987
3988 // Speed up dequeue by getting out quickly if this is just a lookup
3989 if ( data ) {
3990 if ( !queue || jQuery.isArray(data) ) {
3991 queue = jQuery._data( elem, type, jQuery.makeArray(data) );
3992 } else {
3993 queue.push( data );
3994 }
3995 }
3996 return queue || [];
3997 }
3998 },
3999
4000 dequeue: function( elem, type ) {
4001 type = type || "fx";
4002
4003 var queue = jQuery.queue( elem, type ),
4004 startLength = queue.length,
4005 fn = queue.shift(),
4006 hooks = jQuery._queueHooks( elem, type ),
4007 next = function() {
4008 jQuery.dequeue( elem, type );
4009 };
4010
4011 // If the fx queue is dequeued, always remove the progress sentinel
4012 if ( fn === "inprogress" ) {
4013 fn = queue.shift();
4014 startLength--;
4015 }
4016
4017 if ( fn ) {
4018
4019 // Add a progress sentinel to prevent the fx queue from being
4020 // automatically dequeued
4021 if ( type === "fx" ) {
4022 queue.unshift( "inprogress" );
4023 }
4024
4025 // clear up the last queue stop function
4026 delete hooks.stop;
4027 fn.call( elem, next, hooks );
4028 }
4029
4030 if ( !startLength && hooks ) {
4031 hooks.empty.fire();
4032 }
4033 },
4034
4035 // not intended for public consumption - generates a queueHooks object, or returns the current one
4036 _queueHooks: function( elem, type ) {
4037 var key = type + "queueHooks";
4038 return jQuery._data( elem, key ) || jQuery._data( elem, key, {
4039 empty: jQuery.Callbacks("once memory").add(function() {
4040 jQuery._removeData( elem, type + "queue" );
4041 jQuery._removeData( elem, key );
4042 })
4043 });
4044 }
4045 });
4046
4047 jQuery.fn.extend({
4048 queue: function( type, data ) {
4049 var setter = 2;
4050
4051 if ( typeof type !== "string" ) {
4052 data = type;
4053 type = "fx";
4054 setter--;
4055 }
4056
4057 if ( arguments.length < setter ) {
4058 return jQuery.queue( this[0], type );
4059 }
4060
4061 return data === undefined ?
4062 this :
4063 this.each(function() {
4064 var queue = jQuery.queue( this, type, data );
4065
4066 // ensure a hooks for this queue
4067 jQuery._queueHooks( this, type );
4068
4069 if ( type === "fx" && queue[0] !== "inprogress" ) {
4070 jQuery.dequeue( this, type );
4071 }
4072 });
4073 },
4074 dequeue: function( type ) {
4075 return this.each(function() {
4076 jQuery.dequeue( this, type );
4077 });
4078 },
4079 clearQueue: function( type ) {
4080 return this.queue( type || "fx", [] );
4081 },
4082 // Get a promise resolved when queues of a certain type
4083 // are emptied (fx is the type by default)
4084 promise: function( type, obj ) {
4085 var tmp,
4086 count = 1,
4087 defer = jQuery.Deferred(),
4088 elements = this,
4089 i = this.length,
4090 resolve = function() {
4091 if ( !( --count ) ) {
4092 defer.resolveWith( elements, [ elements ] );
4093 }
4094 };
4095
4096 if ( typeof type !== "string" ) {
4097 obj = type;
4098 type = undefined;
4099 }
4100 type = type || "fx";
4101
4102 while ( i-- ) {
4103 tmp = jQuery._data( elements[ i ], type + "queueHooks" );
4104 if ( tmp && tmp.empty ) {
4105 count++;
4106 tmp.empty.add( resolve );
4107 }
4108 }
4109 resolve();
4110 return defer.promise( obj );
4111 }
4112 });
4113 var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
4114
4115 var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4116
4117 var isHidden = function( elem, el ) {
4118 // isHidden might be called from jQuery#filter function;
4119 // in that case, element will be second argument
4120 elem = el || elem;
4121 return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
4122 };
4123
4124
4125
4126 // Multifunctional method to get and set values of a collection
4127 // The value/s can optionally be executed if it's a function
4128 var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4129 var i = 0,
4130 length = elems.length,
4131 bulk = key == null;
4132
4133 // Sets many values
4134 if ( jQuery.type( key ) === "object" ) {
4135 chainable = true;
4136 for ( i in key ) {
4137 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
4138 }
4139
4140 // Sets one value
4141 } else if ( value !== undefined ) {
4142 chainable = true;
4143
4144 if ( !jQuery.isFunction( value ) ) {
4145 raw = true;
4146 }
4147
4148 if ( bulk ) {
4149 // Bulk operations run against the entire set
4150 if ( raw ) {
4151 fn.call( elems, value );
4152 fn = null;
4153
4154 // ...except when executing function values
4155 } else {
4156 bulk = fn;
4157 fn = function( elem, key, value ) {
4158 return bulk.call( jQuery( elem ), value );
4159 };
4160 }
4161 }
4162
4163 if ( fn ) {
4164 for ( ; i < length; i++ ) {
4165 fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
4166 }
4167 }
4168 }
4169
4170 return chainable ?
4171 elems :
4172
4173 // Gets
4174 bulk ?
4175 fn.call( elems ) :
4176 length ? fn( elems[0], key ) : emptyGet;
4177 };
4178 var rcheckableType = (/^(?:checkbox|radio)$/i);
4179
4180
4181
4182 (function() {
4183 // Minified: var a,b,c
4184 var input = document.createElement( "input" ),
4185 div = document.createElement( "div" ),
4186 fragment = document.createDocumentFragment();
4187
4188 // Setup
4189 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4190
4191 // IE strips leading whitespace when .innerHTML is used
4192 support.leadingWhitespace = div.firstChild.nodeType === 3;
4193
4194 // Make sure that tbody elements aren't automatically inserted
4195 // IE will insert them into empty tables
4196 support.tbody = !div.getElementsByTagName( "tbody" ).length;
4197
4198 // Make sure that link elements get serialized correctly by innerHTML
4199 // This requires a wrapper element in IE
4200 support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
4201
4202 // Makes sure cloning an html5 element does not cause problems
4203 // Where outerHTML is undefined, this still works
4204 support.html5Clone =
4205 document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
4206
4207 // Check if a disconnected checkbox will retain its checked
4208 // value of true after appended to the DOM (IE6/7)
4209 input.type = "checkbox";
4210 input.checked = true;
4211 fragment.appendChild( input );
4212 support.appendChecked = input.checked;
4213
4214 // Make sure textarea (and checkbox) defaultValue is properly cloned
4215 // Support: IE6-IE11+
4216 div.innerHTML = "<textarea>x</textarea>";
4217 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4218
4219 // #11217 - WebKit loses check when the name is after the checked attribute
4220 fragment.appendChild( div );
4221 div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
4222
4223 // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4224 // old WebKit doesn't clone checked state correctly in fragments
4225 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4226
4227 // Support: IE<9
4228 // Opera does not clone events (and typeof div.attachEvent === undefined).
4229 // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
4230 support.noCloneEvent = true;
4231 if ( div.attachEvent ) {
4232 div.attachEvent( "onclick", function() {
4233 support.noCloneEvent = false;
4234 });
4235
4236 div.cloneNode( true ).click();
4237 }
4238
4239 // Execute the test only if not already executed in another module.
4240 if (support.deleteExpando == null) {
4241 // Support: IE<9
4242 support.deleteExpando = true;
4243 try {
4244 delete div.test;
4245 } catch( e ) {
4246 support.deleteExpando = false;
4247 }
4248 }
4249 })();
4250
4251
4252 (function() {
4253 var i, eventName,
4254 div = document.createElement( "div" );
4255
4256 // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
4257 for ( i in { submit: true, change: true, focusin: true }) {
4258 eventName = "on" + i;
4259
4260 if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
4261 // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4262 div.setAttribute( eventName, "t" );
4263 support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
4264 }
4265 }
4266
4267 // Null elements to avoid leaks in IE.
4268 div = null;
4269 })();
4270
4271
4272 var rformElems = /^(?:input|select|textarea)$/i,
4273 rkeyEvent = /^key/,
4274 rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
4275 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4276 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4277
4278 function returnTrue() {
4279 return true;
4280 }
4281
4282 function returnFalse() {
4283 return false;
4284 }
4285
4286 function safeActiveElement() {
4287 try {
4288 return document.activeElement;
4289 } catch ( err ) { }
4290 }
4291
4292 /*
4293 * Helper functions for managing events -- not part of the public interface.
4294 * Props to Dean Edwards' addEvent library for many of the ideas.
4295 */
4296 jQuery.event = {
4297
4298 global: {},
4299
4300 add: function( elem, types, handler, data, selector ) {
4301 var tmp, events, t, handleObjIn,
4302 special, eventHandle, handleObj,
4303 handlers, type, namespaces, origType,
4304 elemData = jQuery._data( elem );
4305
4306 // Don't attach events to noData or text/comment nodes (but allow plain objects)
4307 if ( !elemData ) {
4308 return;
4309 }
4310
4311 // Caller can pass in an object of custom data in lieu of the handler
4312 if ( handler.handler ) {
4313 handleObjIn = handler;
4314 handler = handleObjIn.handler;
4315 selector = handleObjIn.selector;
4316 }
4317
4318 // Make sure that the handler has a unique ID, used to find/remove it later
4319 if ( !handler.guid ) {
4320 handler.guid = jQuery.guid++;
4321 }
4322
4323 // Init the element's event structure and main handler, if this is the first
4324 if ( !(events = elemData.events) ) {
4325 events = elemData.events = {};
4326 }
4327 if ( !(eventHandle = elemData.handle) ) {
4328 eventHandle = elemData.handle = function( e ) {
4329 // Discard the second event of a jQuery.event.trigger() and
4330 // when an event is called after a page has unloaded
4331 return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
4332 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
4333 undefined;
4334 };
4335 // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
4336 eventHandle.elem = elem;
4337 }
4338
4339 // Handle multiple events separated by a space
4340 types = ( types || "" ).match( rnotwhite ) || [ "" ];
4341 t = types.length;
4342 while ( t-- ) {
4343 tmp = rtypenamespace.exec( types[t] ) || [];
4344 type = origType = tmp[1];
4345 namespaces = ( tmp[2] || "" ).split( "." ).sort();
4346
4347 // There *must* be a type, no attaching namespace-only handlers
4348 if ( !type ) {
4349 continue;
4350 }
4351
4352 // If event changes its type, use the special event handlers for the changed type
4353 special = jQuery.event.special[ type ] || {};
4354
4355 // If selector defined, determine special event api type, otherwise given type
4356 type = ( selector ? special.delegateType : special.bindType ) || type;
4357
4358 // Update special based on newly reset type
4359 special = jQuery.event.special[ type ] || {};
4360
4361 // handleObj is passed to all event handlers
4362 handleObj = jQuery.extend({
4363 type: type,
4364 origType: origType,
4365 data: data,
4366 handler: handler,
4367 guid: handler.guid,
4368 selector: selector,
4369 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4370 namespace: namespaces.join(".")
4371 }, handleObjIn );
4372
4373 // Init the event handler queue if we're the first
4374 if ( !(handlers = events[ type ]) ) {
4375 handlers = events[ type ] = [];
4376 handlers.delegateCount = 0;
4377
4378 // Only use addEventListener/attachEvent if the special events handler returns false
4379 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4380 // Bind the global event handler to the element
4381 if ( elem.addEventListener ) {
4382 elem.addEventListener( type, eventHandle, false );
4383
4384 } else if ( elem.attachEvent ) {
4385 elem.attachEvent( "on" + type, eventHandle );
4386 }
4387 }
4388 }
4389
4390 if ( special.add ) {
4391 special.add.call( elem, handleObj );
4392
4393 if ( !handleObj.handler.guid ) {
4394 handleObj.handler.guid = handler.guid;
4395 }
4396 }
4397
4398 // Add to the element's handler list, delegates in front
4399 if ( selector ) {
4400 handlers.splice( handlers.delegateCount++, 0, handleObj );
4401 } else {
4402 handlers.push( handleObj );
4403 }
4404
4405 // Keep track of which events have ever been used, for event optimization
4406 jQuery.event.global[ type ] = true;
4407 }
4408
4409 // Nullify elem to prevent memory leaks in IE
4410 elem = null;
4411 },
4412
4413 // Detach an event or set of events from an element
4414 remove: function( elem, types, handler, selector, mappedTypes ) {
4415 var j, handleObj, tmp,
4416 origCount, t, events,
4417 special, handlers, type,
4418 namespaces, origType,
4419 elemData = jQuery.hasData( elem ) && jQuery._data( elem );
4420
4421 if ( !elemData || !(events = elemData.events) ) {
4422 return;
4423 }
4424
4425 // Once for each type.namespace in types; type may be omitted
4426 types = ( types || "" ).match( rnotwhite ) || [ "" ];
4427 t = types.length;
4428 while ( t-- ) {
4429 tmp = rtypenamespace.exec( types[t] ) || [];
4430 type = origType = tmp[1];
4431 namespaces = ( tmp[2] || "" ).split( "." ).sort();
4432
4433 // Unbind all events (on this namespace, if provided) for the element
4434 if ( !type ) {
4435 for ( type in events ) {
4436 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4437 }
4438 continue;
4439 }
4440
4441 special = jQuery.event.special[ type ] || {};
4442 type = ( selector ? special.delegateType : special.bindType ) || type;
4443 handlers = events[ type ] || [];
4444 tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4445
4446 // Remove matching events
4447 origCount = j = handlers.length;
4448 while ( j-- ) {
4449 handleObj = handlers[ j ];
4450
4451 if ( ( mappedTypes || origType === handleObj.origType ) &&
4452 ( !handler || handler.guid === handleObj.guid ) &&
4453 ( !tmp || tmp.test( handleObj.namespace ) ) &&
4454 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4455 handlers.splice( j, 1 );
4456
4457 if ( handleObj.selector ) {
4458 handlers.delegateCount--;
4459 }
4460 if ( special.remove ) {
4461 special.remove.call( elem, handleObj );
4462 }
4463 }
4464 }
4465
4466 // Remove generic event handler if we removed something and no more handlers exist
4467 // (avoids potential for endless recursion during removal of special event handlers)
4468 if ( origCount && !handlers.length ) {
4469 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4470 jQuery.removeEvent( elem, type, elemData.handle );
4471 }
4472
4473 delete events[ type ];
4474 }
4475 }
4476
4477 // Remove the expando if it's no longer used
4478 if ( jQuery.isEmptyObject( events ) ) {
4479 delete elemData.handle;
4480
4481 // removeData also checks for emptiness and clears the expando if empty
4482 // so use it instead of delete
4483 jQuery._removeData( elem, "events" );
4484 }
4485 },
4486
4487 trigger: function( event, data, elem, onlyHandlers ) {
4488 var handle, ontype, cur,
4489 bubbleType, special, tmp, i,
4490 eventPath = [ elem || document ],
4491 type = hasOwn.call( event, "type" ) ? event.type : event,
4492 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4493
4494 cur = tmp = elem = elem || document;
4495
4496 // Don't do events on text and comment nodes
4497 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4498 return;
4499 }
4500
4501 // focus/blur morphs to focusin/out; ensure we're not firing them right now
4502 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4503 return;
4504 }
4505
4506 if ( type.indexOf(".") >= 0 ) {
4507 // Namespaced trigger; create a regexp to match event type in handle()
4508 namespaces = type.split(".");
4509 type = namespaces.shift();
4510 namespaces.sort();
4511 }
4512 ontype = type.indexOf(":") < 0 && "on" + type;
4513
4514 // Caller can pass in a jQuery.Event object, Object, or just an event type string
4515 event = event[ jQuery.expando ] ?
4516 event :
4517 new jQuery.Event( type, typeof event === "object" && event );
4518
4519 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4520 event.isTrigger = onlyHandlers ? 2 : 3;
4521 event.namespace = namespaces.join(".");
4522 event.namespace_re = event.namespace ?
4523 new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4524 null;
4525
4526 // Clean up the event in case it is being reused
4527 event.result = undefined;
4528 if ( !event.target ) {
4529 event.target = elem;
4530 }
4531
4532 // Clone any incoming data and prepend the event, creating the handler arg list
4533 data = data == null ?
4534 [ event ] :
4535 jQuery.makeArray( data, [ event ] );
4536
4537 // Allow special events to draw outside the lines
4538 special = jQuery.event.special[ type ] || {};
4539 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4540 return;
4541 }
4542
4543 // Determine event propagation path in advance, per W3C events spec (#9951)
4544 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4545 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4546
4547 bubbleType = special.delegateType || type;
4548 if ( !rfocusMorph.test( bubbleType + type ) ) {
4549 cur = cur.parentNode;
4550 }
4551 for ( ; cur; cur = cur.parentNode ) {
4552 eventPath.push( cur );
4553 tmp = cur;
4554 }
4555
4556 // Only add window if we got to document (e.g., not plain obj or detached DOM)
4557 if ( tmp === (elem.ownerDocument || document) ) {
4558 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4559 }
4560 }
4561
4562 // Fire handlers on the event path
4563 i = 0;
4564 while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4565
4566 event.type = i > 1 ?
4567 bubbleType :
4568 special.bindType || type;
4569
4570 // jQuery handler
4571 handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
4572 if ( handle ) {
4573 handle.apply( cur, data );
4574 }
4575
4576 // Native handler
4577 handle = ontype && cur[ ontype ];
4578 if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
4579 event.result = handle.apply( cur, data );
4580 if ( event.result === false ) {
4581 event.preventDefault();
4582 }
4583 }
4584 }
4585 event.type = type;
4586
4587 // If nobody prevented the default action, do it now
4588 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
4589
4590 if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
4591 jQuery.acceptData( elem ) ) {
4592
4593 // Call a native DOM method on the target with the same name name as the event.
4594 // Can't use an .isFunction() check here because IE6/7 fails that test.
4595 // Don't do default actions on window, that's where global variables be (#6170)
4596 if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
4597
4598 // Don't re-trigger an onFOO event when we call its FOO() method
4599 tmp = elem[ ontype ];
4600
4601 if ( tmp ) {
4602 elem[ ontype ] = null;
4603 }
4604
4605 // Prevent re-triggering of the same event, since we already bubbled it above
4606 jQuery.event.triggered = type;
4607 try {
4608 elem[ type ]();
4609 } catch ( e ) {
4610 // IE<9 dies on focus/blur to hidden element (#1486,#12518)
4611 // only reproducible on winXP IE8 native, not IE9 in IE8 mode
4612 }
4613 jQuery.event.triggered = undefined;
4614
4615 if ( tmp ) {
4616 elem[ ontype ] = tmp;
4617 }
4618 }
4619 }
4620 }
4621
4622 return event.result;
4623 },
4624
4625 dispatch: function( event ) {
4626
4627 // Make a writable jQuery.Event from the native event object
4628 event = jQuery.event.fix( event );
4629
4630 var i, ret, handleObj, matched, j,
4631 handlerQueue = [],
4632 args = slice.call( arguments ),
4633 handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
4634 special = jQuery.event.special[ event.type ] || {};
4635
4636 // Use the fix-ed jQuery.Event rather than the (read-only) native event
4637 args[0] = event;
4638 event.delegateTarget = this;
4639
4640 // Call the preDispatch hook for the mapped type, and let it bail if desired
4641 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
4642 return;
4643 }
4644
4645 // Determine handlers
4646 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
4647
4648 // Run delegates first; they may want to stop propagation beneath us
4649 i = 0;
4650 while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
4651 event.currentTarget = matched.elem;
4652
4653 j = 0;
4654 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
4655
4656 // Triggered event must either 1) have no namespace, or
4657 // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4658 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
4659
4660 event.handleObj = handleObj;
4661 event.data = handleObj.data;
4662
4663 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4664 .apply( matched.elem, args );
4665
4666 if ( ret !== undefined ) {
4667 if ( (event.result = ret) === false ) {
4668 event.preventDefault();
4669 event.stopPropagation();
4670 }
4671 }
4672 }
4673 }
4674 }
4675
4676 // Call the postDispatch hook for the mapped type
4677 if ( special.postDispatch ) {
4678 special.postDispatch.call( this, event );
4679 }
4680
4681 return event.result;
4682 },
4683
4684 handlers: function( event, handlers ) {
4685 var sel, handleObj, matches, i,
4686 handlerQueue = [],
4687 delegateCount = handlers.delegateCount,
4688 cur = event.target;
4689
4690 // Find delegate handlers
4691 // Black-hole SVG <use> instance trees (#13180)
4692 // Avoid non-left-click bubbling in Firefox (#3861)
4693 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
4694
4695 /* jshint eqeqeq: false */
4696 for ( ; cur != this; cur = cur.parentNode || this ) {
4697 /* jshint eqeqeq: true */
4698
4699 // Don't check non-elements (#13208)
4700 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
4701 if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
4702 matches = [];
4703 for ( i = 0; i < delegateCount; i++ ) {
4704 handleObj = handlers[ i ];
4705
4706 // Don't conflict with Object.prototype properties (#13203)
4707 sel = handleObj.selector + " ";
4708
4709 if ( matches[ sel ] === undefined ) {
4710 matches[ sel ] = handleObj.needsContext ?
4711 jQuery( sel, this ).index( cur ) >= 0 :
4712 jQuery.find( sel, this, null, [ cur ] ).length;
4713 }
4714 if ( matches[ sel ] ) {
4715 matches.push( handleObj );
4716 }
4717 }
4718 if ( matches.length ) {
4719 handlerQueue.push({ elem: cur, handlers: matches });
4720 }
4721 }
4722 }
4723 }
4724
4725 // Add the remaining (directly-bound) handlers
4726 if ( delegateCount < handlers.length ) {
4727 handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
4728 }
4729
4730 return handlerQueue;
4731 },
4732
4733 fix: function( event ) {
4734 if ( event[ jQuery.expando ] ) {
4735 return event;
4736 }
4737
4738 // Create a writable copy of the event object and normalize some properties
4739 var i, prop, copy,
4740 type = event.type,
4741 originalEvent = event,
4742 fixHook = this.fixHooks[ type ];
4743
4744 if ( !fixHook ) {
4745 this.fixHooks[ type ] = fixHook =
4746 rmouseEvent.test( type ) ? this.mouseHooks :
4747 rkeyEvent.test( type ) ? this.keyHooks :
4748 {};
4749 }
4750 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4751
4752 event = new jQuery.Event( originalEvent );
4753
4754 i = copy.length;
4755 while ( i-- ) {
4756 prop = copy[ i ];
4757 event[ prop ] = originalEvent[ prop ];
4758 }
4759
4760 // Support: IE<9
4761 // Fix target property (#1925)
4762 if ( !event.target ) {
4763 event.target = originalEvent.srcElement || document;
4764 }
4765
4766 // Support: Chrome 23+, Safari?
4767 // Target should not be a text node (#504, #13143)
4768 if ( event.target.nodeType === 3 ) {
4769 event.target = event.target.parentNode;
4770 }
4771
4772 // Support: IE<9
4773 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
4774 event.metaKey = !!event.metaKey;
4775
4776 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
4777 },
4778
4779 // Includes some event props shared by KeyEvent and MouseEvent
4780 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4781
4782 fixHooks: {},
4783
4784 keyHooks: {
4785 props: "char charCode key keyCode".split(" "),
4786 filter: function( event, original ) {
4787
4788 // Add which for key events
4789 if ( event.which == null ) {
4790 event.which = original.charCode != null ? original.charCode : original.keyCode;
4791 }
4792
4793 return event;
4794 }
4795 },
4796
4797 mouseHooks: {
4798 props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
4799 filter: function( event, original ) {
4800 var body, eventDoc, doc,
4801 button = original.button,
4802 fromElement = original.fromElement;
4803
4804 // Calculate pageX/Y if missing and clientX/Y available
4805 if ( event.pageX == null && original.clientX != null ) {
4806 eventDoc = event.target.ownerDocument || document;
4807 doc = eventDoc.documentElement;
4808 body = eventDoc.body;
4809
4810 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
4811 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
4812 }
4813
4814 // Add relatedTarget, if necessary
4815 if ( !event.relatedTarget && fromElement ) {
4816 event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
4817 }
4818
4819 // Add which for click: 1 === left; 2 === middle; 3 === right
4820 // Note: button is not normalized, so don't use it
4821 if ( !event.which && button !== undefined ) {
4822 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
4823 }
4824
4825 return event;
4826 }
4827 },
4828
4829 special: {
4830 load: {
4831 // Prevent triggered image.load events from bubbling to window.load
4832 noBubble: true
4833 },
4834 focus: {
4835 // Fire native event if possible so blur/focus sequence is correct
4836 trigger: function() {
4837 if ( this !== safeActiveElement() && this.focus ) {
4838 try {
4839 this.focus();
4840 return false;
4841 } catch ( e ) {
4842 // Support: IE<9
4843 // If we error on focus to hidden element (#1486, #12518),
4844 // let .trigger() run the handlers
4845 }
4846 }
4847 },
4848 delegateType: "focusin"
4849 },
4850 blur: {
4851 trigger: function() {
4852 if ( this === safeActiveElement() && this.blur ) {
4853 this.blur();
4854 return false;
4855 }
4856 },
4857 delegateType: "focusout"
4858 },
4859 click: {
4860 // For checkbox, fire native event so checked state will be right
4861 trigger: function() {
4862 if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
4863 this.click();
4864 return false;
4865 }
4866 },
4867
4868 // For cross-browser consistency, don't fire native .click() on links
4869 _default: function( event ) {
4870 return jQuery.nodeName( event.target, "a" );
4871 }
4872 },
4873
4874 beforeunload: {
4875 postDispatch: function( event ) {
4876
4877 // Support: Firefox 20+
4878 // Firefox doesn't alert if the returnValue field is not set.
4879 if ( event.result !== undefined && event.originalEvent ) {
4880 event.originalEvent.returnValue = event.result;
4881 }
4882 }
4883 }
4884 },
4885
4886 simulate: function( type, elem, event, bubble ) {
4887 // Piggyback on a donor event to simulate a different one.
4888 // Fake originalEvent to avoid donor's stopPropagation, but if the
4889 // simulated event prevents default then we do the same on the donor.
4890 var e = jQuery.extend(
4891 new jQuery.Event(),
4892 event,
4893 {
4894 type: type,
4895 isSimulated: true,
4896 originalEvent: {}
4897 }
4898 );
4899 if ( bubble ) {
4900 jQuery.event.trigger( e, null, elem );
4901 } else {
4902 jQuery.event.dispatch.call( elem, e );
4903 }
4904 if ( e.isDefaultPrevented() ) {
4905 event.preventDefault();
4906 }
4907 }
4908 };
4909
4910 jQuery.removeEvent = document.removeEventListener ?
4911 function( elem, type, handle ) {
4912 if ( elem.removeEventListener ) {
4913 elem.removeEventListener( type, handle, false );
4914 }
4915 } :
4916 function( elem, type, handle ) {
4917 var name = "on" + type;
4918
4919 if ( elem.detachEvent ) {
4920
4921 // #8545, #7054, preventing memory leaks for custom events in IE6-8
4922 // detachEvent needed property on element, by name of that event, to properly expose it to GC
4923 if ( typeof elem[ name ] === strundefined ) {
4924 elem[ name ] = null;
4925 }
4926
4927 elem.detachEvent( name, handle );
4928 }
4929 };
4930
4931 jQuery.Event = function( src, props ) {
4932 // Allow instantiation without the 'new' keyword
4933 if ( !(this instanceof jQuery.Event) ) {
4934 return new jQuery.Event( src, props );
4935 }
4936
4937 // Event object
4938 if ( src && src.type ) {
4939 this.originalEvent = src;
4940 this.type = src.type;
4941
4942 // Events bubbling up the document may have been marked as prevented
4943 // by a handler lower down the tree; reflect the correct value.
4944 this.isDefaultPrevented = src.defaultPrevented ||
4945 src.defaultPrevented === undefined &&
4946 // Support: IE < 9, Android < 4.0
4947 src.returnValue === false ?
4948 returnTrue :
4949 returnFalse;
4950
4951 // Event type
4952 } else {
4953 this.type = src;
4954 }
4955
4956 // Put explicitly provided properties onto the event object
4957 if ( props ) {
4958 jQuery.extend( this, props );
4959 }
4960
4961 // Create a timestamp if incoming event doesn't have one
4962 this.timeStamp = src && src.timeStamp || jQuery.now();
4963
4964 // Mark it as fixed
4965 this[ jQuery.expando ] = true;
4966 };
4967
4968 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
4969 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
4970 jQuery.Event.prototype = {
4971 isDefaultPrevented: returnFalse,
4972 isPropagationStopped: returnFalse,
4973 isImmediatePropagationStopped: returnFalse,
4974
4975 preventDefault: function() {
4976 var e = this.originalEvent;
4977
4978 this.isDefaultPrevented = returnTrue;
4979 if ( !e ) {
4980 return;
4981 }
4982
4983 // If preventDefault exists, run it on the original event
4984 if ( e.preventDefault ) {
4985 e.preventDefault();
4986
4987 // Support: IE
4988 // Otherwise set the returnValue property of the original event to false
4989 } else {
4990 e.returnValue = false;
4991 }
4992 },
4993 stopPropagation: function() {
4994 var e = this.originalEvent;
4995
4996 this.isPropagationStopped = returnTrue;
4997 if ( !e ) {
4998 return;
4999 }
5000 // If stopPropagation exists, run it on the original event
5001 if ( e.stopPropagation ) {
5002 e.stopPropagation();
5003 }
5004
5005 // Support: IE
5006 // Set the cancelBubble property of the original event to true
5007 e.cancelBubble = true;
5008 },
5009 stopImmediatePropagation: function() {
5010 var e = this.originalEvent;
5011
5012 this.isImmediatePropagationStopped = returnTrue;
5013
5014 if ( e && e.stopImmediatePropagation ) {
5015 e.stopImmediatePropagation();
5016 }
5017
5018 this.stopPropagation();
5019 }
5020 };
5021
5022 // Create mouseenter/leave events using mouseover/out and event-time checks
5023 jQuery.each({
5024 mouseenter: "mouseover",
5025 mouseleave: "mouseout",
5026 pointerenter: "pointerover",
5027 pointerleave: "pointerout"
5028 }, function( orig, fix ) {
5029 jQuery.event.special[ orig ] = {
5030 delegateType: fix,
5031 bindType: fix,
5032
5033 handle: function( event ) {
5034 var ret,
5035 target = this,
5036 related = event.relatedTarget,
5037 handleObj = event.handleObj;
5038
5039 // For mousenter/leave call the handler if related is outside the target.
5040 // NB: No relatedTarget if the mouse left/entered the browser window
5041 if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
5042 event.type = handleObj.origType;
5043 ret = handleObj.handler.apply( this, arguments );
5044 event.type = fix;
5045 }
5046 return ret;
5047 }
5048 };
5049 });
5050
5051 // IE submit delegation
5052 if ( !support.submitBubbles ) {
5053
5054 jQuery.event.special.submit = {
5055 setup: function() {
5056 // Only need this for delegated form submit events
5057 if ( jQuery.nodeName( this, "form" ) ) {
5058 return false;
5059 }
5060
5061 // Lazy-add a submit handler when a descendant form may potentially be submitted
5062 jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
5063 // Node name check avoids a VML-related crash in IE (#9807)
5064 var elem = e.target,
5065 form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
5066 if ( form && !jQuery._data( form, "submitBubbles" ) ) {
5067 jQuery.event.add( form, "submit._submit", function( event ) {
5068 event._submit_bubble = true;
5069 });
5070 jQuery._data( form, "submitBubbles", true );
5071 }
5072 });
5073 // return undefined since we don't need an event listener
5074 },
5075
5076 postDispatch: function( event ) {
5077 // If form was submitted by the user, bubble the event up the tree
5078 if ( event._submit_bubble ) {
5079 delete event._submit_bubble;
5080 if ( this.parentNode && !event.isTrigger ) {
5081 jQuery.event.simulate( "submit", this.parentNode, event, true );
5082 }
5083 }
5084 },
5085
5086 teardown: function() {
5087 // Only need this for delegated form submit events
5088 if ( jQuery.nodeName( this, "form" ) ) {
5089 return false;
5090 }
5091
5092 // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5093 jQuery.event.remove( this, "._submit" );
5094 }
5095 };
5096 }
5097
5098 // IE change delegation and checkbox/radio fix
5099 if ( !support.changeBubbles ) {
5100
5101 jQuery.event.special.change = {
5102
5103 setup: function() {
5104
5105 if ( rformElems.test( this.nodeName ) ) {
5106 // IE doesn't fire change on a check/radio until blur; trigger it on click
5107 // after a propertychange. Eat the blur-change in special.change.handle.
5108 // This still fires onchange a second time for check/radio after blur.
5109 if ( this.type === "checkbox" || this.type === "radio" ) {
5110 jQuery.event.add( this, "propertychange._change", function( event ) {
5111 if ( event.originalEvent.propertyName === "checked" ) {
5112 this._just_changed = true;
5113 }
5114 });
5115 jQuery.event.add( this, "click._change", function( event ) {
5116 if ( this._just_changed && !event.isTrigger ) {
5117 this._just_changed = false;
5118 }
5119 // Allow triggered, simulated change events (#11500)
5120 jQuery.event.simulate( "change", this, event, true );
5121 });
5122 }
5123 return false;
5124 }
5125 // Delegated event; lazy-add a change handler on descendant inputs
5126 jQuery.event.add( this, "beforeactivate._change", function( e ) {
5127 var elem = e.target;
5128
5129 if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
5130 jQuery.event.add( elem, "change._change", function( event ) {
5131 if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
5132 jQuery.event.simulate( "change", this.parentNode, event, true );
5133 }
5134 });
5135 jQuery._data( elem, "changeBubbles", true );
5136 }
5137 });
5138 },
5139
5140 handle: function( event ) {
5141 var elem = event.target;
5142
5143 // Swallow native change events from checkbox/radio, we already triggered them above
5144 if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
5145 return event.handleObj.handler.apply( this, arguments );
5146 }
5147 },
5148
5149 teardown: function() {
5150 jQuery.event.remove( this, "._change" );
5151
5152 return !rformElems.test( this.nodeName );
5153 }
5154 };
5155 }
5156
5157 // Create "bubbling" focus and blur events
5158 if ( !support.focusinBubbles ) {
5159 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
5160
5161 // Attach a single capturing handler on the document while someone wants focusin/focusout
5162 var handler = function( event ) {
5163 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
5164 };
5165
5166 jQuery.event.special[ fix ] = {
5167 setup: function() {
5168 var doc = this.ownerDocument || this,
5169 attaches = jQuery._data( doc, fix );
5170
5171 if ( !attaches ) {
5172 doc.addEventListener( orig, handler, true );
5173 }
5174 jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
5175 },
5176 teardown: function() {
5177 var doc = this.ownerDocument || this,
5178 attaches = jQuery._data( doc, fix ) - 1;
5179
5180 if ( !attaches ) {
5181 doc.removeEventListener( orig, handler, true );
5182 jQuery._removeData( doc, fix );
5183 } else {
5184 jQuery._data( doc, fix, attaches );
5185 }
5186 }
5187 };
5188 });
5189 }
5190
5191 jQuery.fn.extend({
5192
5193 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
5194 var type, origFn;
5195
5196 // Types can be a map of types/handlers
5197 if ( typeof types === "object" ) {
5198 // ( types-Object, selector, data )
5199 if ( typeof selector !== "string" ) {
5200 // ( types-Object, data )
5201 data = data || selector;
5202 selector = undefined;
5203 }
5204 for ( type in types ) {
5205 this.on( type, selector, data, types[ type ], one );
5206 }
5207 return this;
5208 }
5209
5210 if ( data == null && fn == null ) {
5211 // ( types, fn )
5212 fn = selector;
5213 data = selector = undefined;
5214 } else if ( fn == null ) {
5215 if ( typeof selector === "string" ) {
5216 // ( types, selector, fn )
5217 fn = data;
5218 data = undefined;
5219 } else {
5220 // ( types, data, fn )
5221 fn = data;
5222 data = selector;
5223 selector = undefined;
5224 }
5225 }
5226 if ( fn === false ) {
5227 fn = returnFalse;
5228 } else if ( !fn ) {
5229 return this;
5230 }
5231
5232 if ( one === 1 ) {
5233 origFn = fn;
5234 fn = function( event ) {
5235 // Can use an empty set, since event contains the info
5236 jQuery().off( event );
5237 return origFn.apply( this, arguments );
5238 };
5239 // Use same guid so caller can remove using origFn
5240 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5241 }
5242 return this.each( function() {
5243 jQuery.event.add( this, types, fn, data, selector );
5244 });
5245 },
5246 one: function( types, selector, data, fn ) {
5247 return this.on( types, selector, data, fn, 1 );
5248 },
5249 off: function( types, selector, fn ) {
5250 var handleObj, type;
5251 if ( types && types.preventDefault && types.handleObj ) {
5252 // ( event ) dispatched jQuery.Event
5253 handleObj = types.handleObj;
5254 jQuery( types.delegateTarget ).off(
5255 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
5256 handleObj.selector,
5257 handleObj.handler
5258 );
5259 return this;
5260 }
5261 if ( typeof types === "object" ) {
5262 // ( types-object [, selector] )
5263 for ( type in types ) {
5264 this.off( type, selector, types[ type ] );
5265 }
5266 return this;
5267 }
5268 if ( selector === false || typeof selector === "function" ) {
5269 // ( types [, fn] )
5270 fn = selector;
5271 selector = undefined;
5272 }
5273 if ( fn === false ) {
5274 fn = returnFalse;
5275 }
5276 return this.each(function() {
5277 jQuery.event.remove( this, types, fn, selector );
5278 });
5279 },
5280
5281 trigger: function( type, data ) {
5282 return this.each(function() {
5283 jQuery.event.trigger( type, data, this );
5284 });
5285 },
5286 triggerHandler: function( type, data ) {
5287 var elem = this[0];
5288 if ( elem ) {
5289 return jQuery.event.trigger( type, data, elem, true );
5290 }
5291 }
5292 });
5293
5294
5295 function createSafeFragment( document ) {
5296 var list = nodeNames.split( "|" ),
5297 safeFrag = document.createDocumentFragment();
5298
5299 if ( safeFrag.createElement ) {
5300 while ( list.length ) {
5301 safeFrag.createElement(
5302 list.pop()
5303 );
5304 }
5305 }
5306 return safeFrag;
5307 }
5308
5309 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5310 "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5311 rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5312 rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5313 rleadingWhitespace = /^\s+/,
5314 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
5315 rtagName = /<([\w:]+)/,
5316 rtbody = /<tbody/i,
5317 rhtml = /<|&#?\w+;/,
5318 rnoInnerhtml = /<(?:script|style|link)/i,
5319 // checked="checked" or checked
5320 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5321 rscriptType = /^$|\/(?:java|ecma)script/i,
5322 rscriptTypeMasked = /^true\/(.*)/,
5323 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5324
5325 // We have to close these tags to support XHTML (#13200)
5326 wrapMap = {
5327 option: [ 1, "<select multiple='multiple'>", "</select>" ],
5328 legend: [ 1, "<fieldset>", "</fieldset>" ],
5329 area: [ 1, "<map>", "</map>" ],
5330 param: [ 1, "<object>", "</object>" ],
5331 thead: [ 1, "<table>", "</table>" ],
5332 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5333 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5334 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5335
5336 // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
5337 // unless wrapped in a div with non-breaking characters in front of it.
5338 _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
5339 },
5340 safeFragment = createSafeFragment( document ),
5341 fragmentDiv = safeFragment.appendChild( document.createElement("div") );
5342
5343 wrapMap.optgroup = wrapMap.option;
5344 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5345 wrapMap.th = wrapMap.td;
5346
5347 function getAll( context, tag ) {
5348 var elems, elem,
5349 i = 0,
5350 found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
5351 typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
5352 undefined;
5353
5354 if ( !found ) {
5355 for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
5356 if ( !tag || jQuery.nodeName( elem, tag ) ) {
5357 found.push( elem );
5358 } else {
5359 jQuery.merge( found, getAll( elem, tag ) );
5360 }
5361 }
5362 }
5363
5364 return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
5365 jQuery.merge( [ context ], found ) :
5366 found;
5367 }
5368
5369 // Used in buildFragment, fixes the defaultChecked property
5370 function fixDefaultChecked( elem ) {
5371 if ( rcheckableType.test( elem.type ) ) {
5372 elem.defaultChecked = elem.checked;
5373 }
5374 }
5375
5376 // Support: IE<8
5377 // Manipulating tables requires a tbody
5378 function manipulationTarget( elem, content ) {
5379 return jQuery.nodeName( elem, "table" ) &&
5380 jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
5381
5382 elem.getElementsByTagName("tbody")[0] ||
5383 elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
5384 elem;
5385 }
5386
5387 // Replace/restore the type attribute of script elements for safe DOM manipulation
5388 function disableScript( elem ) {
5389 elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
5390 return elem;
5391 }
5392 function restoreScript( elem ) {
5393 var match = rscriptTypeMasked.exec( elem.type );
5394 if ( match ) {
5395 elem.type = match[1];
5396 } else {
5397 elem.removeAttribute("type");
5398 }
5399 return elem;
5400 }
5401
5402 // Mark scripts as having already been evaluated
5403 function setGlobalEval( elems, refElements ) {
5404 var elem,
5405 i = 0;
5406 for ( ; (elem = elems[i]) != null; i++ ) {
5407 jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
5408 }
5409 }
5410
5411 function cloneCopyEvent( src, dest ) {
5412
5413 if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5414 return;
5415 }
5416
5417 var type, i, l,
5418 oldData = jQuery._data( src ),
5419 curData = jQuery._data( dest, oldData ),
5420 events = oldData.events;
5421
5422 if ( events ) {
5423 delete curData.handle;
5424 curData.events = {};
5425
5426 for ( type in events ) {
5427 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5428 jQuery.event.add( dest, type, events[ type ][ i ] );
5429 }
5430 }
5431 }
5432
5433 // make the cloned public data object a copy from the original
5434 if ( curData.data ) {
5435 curData.data = jQuery.extend( {}, curData.data );
5436 }
5437 }
5438
5439 function fixCloneNodeIssues( src, dest ) {
5440 var nodeName, e, data;
5441
5442 // We do not need to do anything for non-Elements
5443 if ( dest.nodeType !== 1 ) {
5444 return;
5445 }
5446
5447 nodeName = dest.nodeName.toLowerCase();
5448
5449 // IE6-8 copies events bound via attachEvent when using cloneNode.
5450 if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
5451 data = jQuery._data( dest );
5452
5453 for ( e in data.events ) {
5454 jQuery.removeEvent( dest, e, data.handle );
5455 }
5456
5457 // Event data gets referenced instead of copied if the expando gets copied too
5458 dest.removeAttribute( jQuery.expando );
5459 }
5460
5461 // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5462 if ( nodeName === "script" && dest.text !== src.text ) {
5463 disableScript( dest ).text = src.text;
5464 restoreScript( dest );
5465
5466 // IE6-10 improperly clones children of object elements using classid.
5467 // IE10 throws NoModificationAllowedError if parent is null, #12132.
5468 } else if ( nodeName === "object" ) {
5469 if ( dest.parentNode ) {
5470 dest.outerHTML = src.outerHTML;
5471 }
5472
5473 // This path appears unavoidable for IE9. When cloning an object
5474 // element in IE9, the outerHTML strategy above is not sufficient.
5475 // If the src has innerHTML and the destination does not,
5476 // copy the src.innerHTML into the dest.innerHTML. #10324
5477 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
5478 dest.innerHTML = src.innerHTML;
5479 }
5480
5481 } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5482 // IE6-8 fails to persist the checked state of a cloned checkbox
5483 // or radio button. Worse, IE6-7 fail to give the cloned element
5484 // a checked appearance if the defaultChecked value isn't also set
5485
5486 dest.defaultChecked = dest.checked = src.checked;
5487
5488 // IE6-7 get confused and end up setting the value of a cloned
5489 // checkbox/radio button to an empty string instead of "on"
5490 if ( dest.value !== src.value ) {
5491 dest.value = src.value;
5492 }
5493
5494 // IE6-8 fails to return the selected option to the default selected
5495 // state when cloning options
5496 } else if ( nodeName === "option" ) {
5497 dest.defaultSelected = dest.selected = src.defaultSelected;
5498
5499 // IE6-8 fails to set the defaultValue to the correct value when
5500 // cloning other types of input fields
5501 } else if ( nodeName === "input" || nodeName === "textarea" ) {
5502 dest.defaultValue = src.defaultValue;
5503 }
5504 }
5505
5506 jQuery.extend({
5507 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5508 var destElements, node, clone, i, srcElements,
5509 inPage = jQuery.contains( elem.ownerDocument, elem );
5510
5511 if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
5512 clone = elem.cloneNode( true );
5513
5514 // IE<=8 does not properly clone detached, unknown element nodes
5515 } else {
5516 fragmentDiv.innerHTML = elem.outerHTML;
5517 fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
5518 }
5519
5520 if ( (!support.noCloneEvent || !support.noCloneChecked) &&
5521 (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5522
5523 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5524 destElements = getAll( clone );
5525 srcElements = getAll( elem );
5526
5527 // Fix all IE cloning issues
5528 for ( i = 0; (node = srcElements[i]) != null; ++i ) {
5529 // Ensure that the destination node is not null; Fixes #9587
5530 if ( destElements[i] ) {
5531 fixCloneNodeIssues( node, destElements[i] );
5532 }
5533 }
5534 }
5535
5536 // Copy the events from the original to the clone
5537 if ( dataAndEvents ) {
5538 if ( deepDataAndEvents ) {
5539 srcElements = srcElements || getAll( elem );
5540 destElements = destElements || getAll( clone );
5541
5542 for ( i = 0; (node = srcElements[i]) != null; i++ ) {
5543 cloneCopyEvent( node, destElements[i] );
5544 }
5545 } else {
5546 cloneCopyEvent( elem, clone );
5547 }
5548 }
5549
5550 // Preserve script evaluation history
5551 destElements = getAll( clone, "script" );
5552 if ( destElements.length > 0 ) {
5553 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5554 }
5555
5556 destElements = srcElements = node = null;
5557
5558 // Return the cloned set
5559 return clone;
5560 },
5561
5562 buildFragment: function( elems, context, scripts, selection ) {
5563 var j, elem, contains,
5564 tmp, tag, tbody, wrap,
5565 l = elems.length,
5566
5567 // Ensure a safe fragment
5568 safe = createSafeFragment( context ),
5569
5570 nodes = [],
5571 i = 0;
5572
5573 for ( ; i < l; i++ ) {
5574 elem = elems[ i ];
5575
5576 if ( elem || elem === 0 ) {
5577
5578 // Add nodes directly
5579 if ( jQuery.type( elem ) === "object" ) {
5580 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5581
5582 // Convert non-html into a text node
5583 } else if ( !rhtml.test( elem ) ) {
5584 nodes.push( context.createTextNode( elem ) );
5585
5586 // Convert html into DOM nodes
5587 } else {
5588 tmp = tmp || safe.appendChild( context.createElement("div") );
5589
5590 // Deserialize a standard representation
5591 tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
5592 wrap = wrapMap[ tag ] || wrapMap._default;
5593
5594 tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
5595
5596 // Descend through wrappers to the right content
5597 j = wrap[0];
5598 while ( j-- ) {
5599 tmp = tmp.lastChild;
5600 }
5601
5602 // Manually add leading whitespace removed by IE
5603 if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5604 nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
5605 }
5606
5607 // Remove IE's autoinserted <tbody> from table fragments
5608 if ( !support.tbody ) {
5609
5610 // String was a <table>, *may* have spurious <tbody>
5611 elem = tag === "table" && !rtbody.test( elem ) ?
5612 tmp.firstChild :
5613
5614 // String was a bare <thead> or <tfoot>
5615 wrap[1] === "<table>" && !rtbody.test( elem ) ?
5616 tmp :
5617 0;
5618
5619 j = elem && elem.childNodes.length;
5620 while ( j-- ) {
5621 if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
5622 elem.removeChild( tbody );
5623 }
5624 }
5625 }
5626
5627 jQuery.merge( nodes, tmp.childNodes );
5628
5629 // Fix #12392 for WebKit and IE > 9
5630 tmp.textContent = "";
5631
5632 // Fix #12392 for oldIE
5633 while ( tmp.firstChild ) {
5634 tmp.removeChild( tmp.firstChild );
5635 }
5636
5637 // Remember the top-level container for proper cleanup
5638 tmp = safe.lastChild;
5639 }
5640 }
5641 }
5642
5643 // Fix #11356: Clear elements from fragment
5644 if ( tmp ) {
5645 safe.removeChild( tmp );
5646 }
5647
5648 // Reset defaultChecked for any radios and checkboxes
5649 // about to be appended to the DOM in IE 6/7 (#8060)
5650 if ( !support.appendChecked ) {
5651 jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
5652 }
5653
5654 i = 0;
5655 while ( (elem = nodes[ i++ ]) ) {
5656
5657 // #4087 - If origin and destination elements are the same, and this is
5658 // that element, do not do anything
5659 if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
5660 continue;
5661 }
5662
5663 contains = jQuery.contains( elem.ownerDocument, elem );
5664
5665 // Append to fragment
5666 tmp = getAll( safe.appendChild( elem ), "script" );
5667
5668 // Preserve script evaluation history
5669 if ( contains ) {
5670 setGlobalEval( tmp );
5671 }
5672
5673 // Capture executables
5674 if ( scripts ) {
5675 j = 0;
5676 while ( (elem = tmp[ j++ ]) ) {
5677 if ( rscriptType.test( elem.type || "" ) ) {
5678 scripts.push( elem );
5679 }
5680 }
5681 }
5682 }
5683
5684 tmp = null;
5685
5686 return safe;
5687 },
5688
5689 cleanData: function( elems, /* internal */ acceptData ) {
5690 var elem, type, id, data,
5691 i = 0,
5692 internalKey = jQuery.expando,
5693 cache = jQuery.cache,
5694 deleteExpando = support.deleteExpando,
5695 special = jQuery.event.special;
5696
5697 for ( ; (elem = elems[i]) != null; i++ ) {
5698 if ( acceptData || jQuery.acceptData( elem ) ) {
5699
5700 id = elem[ internalKey ];
5701 data = id && cache[ id ];
5702
5703 if ( data ) {
5704 if ( data.events ) {
5705 for ( type in data.events ) {
5706 if ( special[ type ] ) {
5707 jQuery.event.remove( elem, type );
5708
5709 // This is a shortcut to avoid jQuery.event.remove's overhead
5710 } else {
5711 jQuery.removeEvent( elem, type, data.handle );
5712 }
5713 }
5714 }
5715
5716 // Remove cache only if it was not already removed by jQuery.event.remove
5717 if ( cache[ id ] ) {
5718
5719 delete cache[ id ];
5720
5721 // IE does not allow us to delete expando properties from nodes,
5722 // nor does it have a removeAttribute function on Document nodes;
5723 // we must handle all of these cases
5724 if ( deleteExpando ) {
5725 delete elem[ internalKey ];
5726
5727 } else if ( typeof elem.removeAttribute !== strundefined ) {
5728 elem.removeAttribute( internalKey );
5729
5730 } else {
5731 elem[ internalKey ] = null;
5732 }
5733
5734 deletedIds.push( id );
5735 }
5736 }
5737 }
5738 }
5739 }
5740 });
5741
5742 jQuery.fn.extend({
5743 text: function( value ) {
5744 return access( this, function( value ) {
5745 return value === undefined ?
5746 jQuery.text( this ) :
5747 this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
5748 }, null, value, arguments.length );
5749 },
5750
5751 append: function() {
5752 return this.domManip( arguments, function( elem ) {
5753 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5754 var target = manipulationTarget( this, elem );
5755 target.appendChild( elem );
5756 }
5757 });
5758 },
5759
5760 prepend: function() {
5761 return this.domManip( arguments, function( elem ) {
5762 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5763 var target = manipulationTarget( this, elem );
5764 target.insertBefore( elem, target.firstChild );
5765 }
5766 });
5767 },
5768
5769 before: function() {
5770 return this.domManip( arguments, function( elem ) {
5771 if ( this.parentNode ) {
5772 this.parentNode.insertBefore( elem, this );
5773 }
5774 });
5775 },
5776
5777 after: function() {
5778 return this.domManip( arguments, function( elem ) {
5779 if ( this.parentNode ) {
5780 this.parentNode.insertBefore( elem, this.nextSibling );
5781 }
5782 });
5783 },
5784
5785 remove: function( selector, keepData /* Internal Use Only */ ) {
5786 var elem,
5787 elems = selector ? jQuery.filter( selector, this ) : this,
5788 i = 0;
5789
5790 for ( ; (elem = elems[i]) != null; i++ ) {
5791
5792 if ( !keepData && elem.nodeType === 1 ) {
5793 jQuery.cleanData( getAll( elem ) );
5794 }
5795
5796 if ( elem.parentNode ) {
5797 if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5798 setGlobalEval( getAll( elem, "script" ) );
5799 }
5800 elem.parentNode.removeChild( elem );
5801 }
5802 }
5803
5804 return this;
5805 },
5806
5807 empty: function() {
5808 var elem,
5809 i = 0;
5810
5811 for ( ; (elem = this[i]) != null; i++ ) {
5812 // Remove element nodes and prevent memory leaks
5813 if ( elem.nodeType === 1 ) {
5814 jQuery.cleanData( getAll( elem, false ) );
5815 }
5816
5817 // Remove any remaining nodes
5818 while ( elem.firstChild ) {
5819 elem.removeChild( elem.firstChild );
5820 }
5821
5822 // If this is a select, ensure that it displays empty (#12336)
5823 // Support: IE<9
5824 if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
5825 elem.options.length = 0;
5826 }
5827 }
5828
5829 return this;
5830 },
5831
5832 clone: function( dataAndEvents, deepDataAndEvents ) {
5833 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5834 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5835
5836 return this.map(function() {
5837 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5838 });
5839 },
5840
5841 html: function( value ) {
5842 return access( this, function( value ) {
5843 var elem = this[ 0 ] || {},
5844 i = 0,
5845 l = this.length;
5846
5847 if ( value === undefined ) {
5848 return elem.nodeType === 1 ?
5849 elem.innerHTML.replace( rinlinejQuery, "" ) :
5850 undefined;
5851 }
5852
5853 // See if we can take a shortcut and just use innerHTML
5854 if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5855 ( support.htmlSerialize || !rnoshimcache.test( value ) ) &&
5856 ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
5857 !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
5858
5859 value = value.replace( rxhtmlTag, "<$1></$2>" );
5860
5861 try {
5862 for (; i < l; i++ ) {
5863 // Remove element nodes and prevent memory leaks
5864 elem = this[i] || {};
5865 if ( elem.nodeType === 1 ) {
5866 jQuery.cleanData( getAll( elem, false ) );
5867 elem.innerHTML = value;
5868 }
5869 }
5870
5871 elem = 0;
5872
5873 // If using innerHTML throws an exception, use the fallback method
5874 } catch(e) {}
5875 }
5876
5877 if ( elem ) {
5878 this.empty().append( value );
5879 }
5880 }, null, value, arguments.length );
5881 },
5882
5883 replaceWith: function() {
5884 var arg = arguments[ 0 ];
5885
5886 // Make the changes, replacing each context element with the new content
5887 this.domManip( arguments, function( elem ) {
5888 arg = this.parentNode;
5889
5890 jQuery.cleanData( getAll( this ) );
5891
5892 if ( arg ) {
5893 arg.replaceChild( elem, this );
5894 }
5895 });
5896
5897 // Force removal if there was no new content (e.g., from empty arguments)
5898 return arg && (arg.length || arg.nodeType) ? this : this.remove();
5899 },
5900
5901 detach: function( selector ) {
5902 return this.remove( selector, true );
5903 },
5904
5905 domManip: function( args, callback ) {
5906
5907 // Flatten any nested arrays
5908 args = concat.apply( [], args );
5909
5910 var first, node, hasScripts,
5911 scripts, doc, fragment,
5912 i = 0,
5913 l = this.length,
5914 set = this,
5915 iNoClone = l - 1,
5916 value = args[0],
5917 isFunction = jQuery.isFunction( value );
5918
5919 // We can't cloneNode fragments that contain checked, in WebKit
5920 if ( isFunction ||
5921 ( l > 1 && typeof value === "string" &&
5922 !support.checkClone && rchecked.test( value ) ) ) {
5923 return this.each(function( index ) {
5924 var self = set.eq( index );
5925 if ( isFunction ) {
5926 args[0] = value.call( this, index, self.html() );
5927 }
5928 self.domManip( args, callback );
5929 });
5930 }
5931
5932 if ( l ) {
5933 fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
5934 first = fragment.firstChild;
5935
5936 if ( fragment.childNodes.length === 1 ) {
5937 fragment = first;
5938 }
5939
5940 if ( first ) {
5941 scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5942 hasScripts = scripts.length;
5943
5944 // Use the original fragment for the last item instead of the first because it can end up
5945 // being emptied incorrectly in certain situations (#8070).
5946 for ( ; i < l; i++ ) {
5947 node = fragment;
5948
5949 if ( i !== iNoClone ) {
5950 node = jQuery.clone( node, true, true );
5951
5952 // Keep references to cloned scripts for later restoration
5953 if ( hasScripts ) {
5954 jQuery.merge( scripts, getAll( node, "script" ) );
5955 }
5956 }
5957
5958 callback.call( this[i], node, i );
5959 }
5960
5961 if ( hasScripts ) {
5962 doc = scripts[ scripts.length - 1 ].ownerDocument;
5963
5964 // Reenable scripts
5965 jQuery.map( scripts, restoreScript );
5966
5967 // Evaluate executable scripts on first document insertion
5968 for ( i = 0; i < hasScripts; i++ ) {
5969 node = scripts[ i ];
5970 if ( rscriptType.test( node.type || "" ) &&
5971 !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
5972
5973 if ( node.src ) {
5974 // Optional AJAX dependency, but won't run scripts if not present
5975 if ( jQuery._evalUrl ) {
5976 jQuery._evalUrl( node.src );
5977 }
5978 } else {
5979 jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
5980 }
5981 }
5982 }
5983 }
5984
5985 // Fix #11809: Avoid leaking memory
5986 fragment = first = null;
5987 }
5988 }
5989
5990 return this;
5991 }
5992 });
5993
5994 jQuery.each({
5995 appendTo: "append",
5996 prependTo: "prepend",
5997 insertBefore: "before",
5998 insertAfter: "after",
5999 replaceAll: "replaceWith"
6000 }, function( name, original ) {
6001 jQuery.fn[ name ] = function( selector ) {
6002 var elems,
6003 i = 0,
6004 ret = [],
6005 insert = jQuery( selector ),
6006 last = insert.length - 1;
6007
6008 for ( ; i <= last; i++ ) {
6009 elems = i === last ? this : this.clone(true);
6010 jQuery( insert[i] )[ original ]( elems );
6011
6012 // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6013 push.apply( ret, elems.get() );
6014 }
6015
6016 return this.pushStack( ret );
6017 };
6018 });
6019
6020
6021 var iframe,
6022 elemdisplay = {};
6023
6024 /**
6025 * Retrieve the actual display of a element
6026 * @param {String} name nodeName of the element
6027 * @param {Object} doc Document object
6028 */
6029 // Called only from within defaultDisplay
6030 function actualDisplay( name, doc ) {
6031 var style,
6032 elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
6033
6034 // getDefaultComputedStyle might be reliably used only on attached element
6035 display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
6036
6037 // Use of this method is a temporary fix (more like optmization) until something better comes along,
6038 // since it was removed from specification and supported only in FF
6039 style.display : jQuery.css( elem[ 0 ], "display" );
6040
6041 // We don't have any data stored on the element,
6042 // so use "detach" method as fast way to get rid of the element
6043 elem.detach();
6044
6045 return display;
6046 }
6047
6048 /**
6049 * Try to determine the default display value of an element
6050 * @param {String} nodeName
6051 */
6052 function defaultDisplay( nodeName ) {
6053 var doc = document,
6054 display = elemdisplay[ nodeName ];
6055
6056 if ( !display ) {
6057 display = actualDisplay( nodeName, doc );
6058
6059 // If the simple way fails, read from inside an iframe
6060 if ( display === "none" || !display ) {
6061
6062 // Use the already-created iframe if possible
6063 iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
6064
6065 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6066 doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
6067
6068 // Support: IE
6069 doc.write();
6070 doc.close();
6071
6072 display = actualDisplay( nodeName, doc );
6073 iframe.detach();
6074 }
6075
6076 // Store the correct default display
6077 elemdisplay[ nodeName ] = display;
6078 }
6079
6080 return display;
6081 }
6082
6083
6084 (function() {
6085 var shrinkWrapBlocksVal;
6086
6087 support.shrinkWrapBlocks = function() {
6088 if ( shrinkWrapBlocksVal != null ) {
6089 return shrinkWrapBlocksVal;
6090 }
6091
6092 // Will be changed later if needed.
6093 shrinkWrapBlocksVal = false;
6094
6095 // Minified: var b,c,d
6096 var div, body, container;
6097
6098 body = document.getElementsByTagName( "body" )[ 0 ];
6099 if ( !body || !body.style ) {
6100 // Test fired too early or in an unsupported environment, exit.
6101 return;
6102 }
6103
6104 // Setup
6105 div = document.createElement( "div" );
6106 container = document.createElement( "div" );
6107 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6108 body.appendChild( container ).appendChild( div );
6109
6110 // Support: IE6
6111 // Check if elements with layout shrink-wrap their children
6112 if ( typeof div.style.zoom !== strundefined ) {
6113 // Reset CSS: box-sizing; display; margin; border
6114 div.style.cssText =
6115 // Support: Firefox<29, Android 2.3
6116 // Vendor-prefix box-sizing
6117 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6118 "box-sizing:content-box;display:block;margin:0;border:0;" +
6119 "padding:1px;width:1px;zoom:1";
6120 div.appendChild( document.createElement( "div" ) ).style.width = "5px";
6121 shrinkWrapBlocksVal = div.offsetWidth !== 3;
6122 }
6123
6124 body.removeChild( container );
6125
6126 return shrinkWrapBlocksVal;
6127 };
6128
6129 })();
6130 var rmargin = (/^margin/);
6131
6132 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6133
6134
6135
6136 var getStyles, curCSS,
6137 rposition = /^(top|right|bottom|left)$/;
6138
6139 if ( window.getComputedStyle ) {
6140 getStyles = function( elem ) {
6141 // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
6142 // IE throws on elements created in popups
6143 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6144 if ( elem.ownerDocument.defaultView.opener ) {
6145 return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
6146 }
6147
6148 return window.getComputedStyle( elem, null );
6149 };
6150
6151 curCSS = function( elem, name, computed ) {
6152 var width, minWidth, maxWidth, ret,
6153 style = elem.style;
6154
6155 computed = computed || getStyles( elem );
6156
6157 // getPropertyValue is only needed for .css('filter') in IE9, see #12537
6158 ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
6159
6160 if ( computed ) {
6161
6162 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6163 ret = jQuery.style( elem, name );
6164 }
6165
6166 // A tribute to the "awesome hack by Dean Edwards"
6167 // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
6168 // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
6169 // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6170 if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6171
6172 // Remember the original values
6173 width = style.width;
6174 minWidth = style.minWidth;
6175 maxWidth = style.maxWidth;
6176
6177 // Put in the new values to get a computed value out
6178 style.minWidth = style.maxWidth = style.width = ret;
6179 ret = computed.width;
6180
6181 // Revert the changed values
6182 style.width = width;
6183 style.minWidth = minWidth;
6184 style.maxWidth = maxWidth;
6185 }
6186 }
6187
6188 // Support: IE
6189 // IE returns zIndex value as an integer.
6190 return ret === undefined ?
6191 ret :
6192 ret + "";
6193 };
6194 } else if ( document.documentElement.currentStyle ) {
6195 getStyles = function( elem ) {
6196 return elem.currentStyle;
6197 };
6198
6199 curCSS = function( elem, name, computed ) {
6200 var left, rs, rsLeft, ret,
6201 style = elem.style;
6202
6203 computed = computed || getStyles( elem );
6204 ret = computed ? computed[ name ] : undefined;
6205
6206 // Avoid setting ret to empty string here
6207 // so we don't default to auto
6208 if ( ret == null && style && style[ name ] ) {
6209 ret = style[ name ];
6210 }
6211
6212 // From the awesome hack by Dean Edwards
6213 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6214
6215 // If we're not dealing with a regular pixel number
6216 // but a number that has a weird ending, we need to convert it to pixels
6217 // but not position css attributes, as those are proportional to the parent element instead
6218 // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
6219 if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6220
6221 // Remember the original values
6222 left = style.left;
6223 rs = elem.runtimeStyle;
6224 rsLeft = rs && rs.left;
6225
6226 // Put in the new values to get a computed value out
6227 if ( rsLeft ) {
6228 rs.left = elem.currentStyle.left;
6229 }
6230 style.left = name === "fontSize" ? "1em" : ret;
6231 ret = style.pixelLeft + "px";
6232
6233 // Revert the changed values
6234 style.left = left;
6235 if ( rsLeft ) {
6236 rs.left = rsLeft;
6237 }
6238 }
6239
6240 // Support: IE
6241 // IE returns zIndex value as an integer.
6242 return ret === undefined ?
6243 ret :
6244 ret + "" || "auto";
6245 };
6246 }
6247
6248
6249
6250
6251 function addGetHookIf( conditionFn, hookFn ) {
6252 // Define the hook, we'll check on the first run if it's really needed.
6253 return {
6254 get: function() {
6255 var condition = conditionFn();
6256
6257 if ( condition == null ) {
6258 // The test was not ready at this point; screw the hook this time
6259 // but check again when needed next time.
6260 return;
6261 }
6262
6263 if ( condition ) {
6264 // Hook not needed (or it's not possible to use it due to missing dependency),
6265 // remove it.
6266 // Since there are no other hooks for marginRight, remove the whole object.
6267 delete this.get;
6268 return;
6269 }
6270
6271 // Hook needed; redefine it so that the support test is not executed again.
6272
6273 return (this.get = hookFn).apply( this, arguments );
6274 }
6275 };
6276 }
6277
6278
6279 (function() {
6280 // Minified: var b,c,d,e,f,g, h,i
6281 var div, style, a, pixelPositionVal, boxSizingReliableVal,
6282 reliableHiddenOffsetsVal, reliableMarginRightVal;
6283
6284 // Setup
6285 div = document.createElement( "div" );
6286 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
6287 a = div.getElementsByTagName( "a" )[ 0 ];
6288 style = a && a.style;
6289
6290 // Finish early in limited (non-browser) environments
6291 if ( !style ) {
6292 return;
6293 }
6294
6295 style.cssText = "float:left;opacity:.5";
6296
6297 // Support: IE<9
6298 // Make sure that element opacity exists (as opposed to filter)
6299 support.opacity = style.opacity === "0.5";
6300
6301 // Verify style float existence
6302 // (IE uses styleFloat instead of cssFloat)
6303 support.cssFloat = !!style.cssFloat;
6304
6305 div.style.backgroundClip = "content-box";
6306 div.cloneNode( true ).style.backgroundClip = "";
6307 support.clearCloneStyle = div.style.backgroundClip === "content-box";
6308
6309 // Support: Firefox<29, Android 2.3
6310 // Vendor-prefix box-sizing
6311 support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
6312 style.WebkitBoxSizing === "";
6313
6314 jQuery.extend(support, {
6315 reliableHiddenOffsets: function() {
6316 if ( reliableHiddenOffsetsVal == null ) {
6317 computeStyleTests();
6318 }
6319 return reliableHiddenOffsetsVal;
6320 },
6321
6322 boxSizingReliable: function() {
6323 if ( boxSizingReliableVal == null ) {
6324 computeStyleTests();
6325 }
6326 return boxSizingReliableVal;
6327 },
6328
6329 pixelPosition: function() {
6330 if ( pixelPositionVal == null ) {
6331 computeStyleTests();
6332 }
6333 return pixelPositionVal;
6334 },
6335
6336 // Support: Android 2.3
6337 reliableMarginRight: function() {
6338 if ( reliableMarginRightVal == null ) {
6339 computeStyleTests();
6340 }
6341 return reliableMarginRightVal;
6342 }
6343 });
6344
6345 function computeStyleTests() {
6346 // Minified: var b,c,d,j
6347 var div, body, container, contents;
6348
6349 body = document.getElementsByTagName( "body" )[ 0 ];
6350 if ( !body || !body.style ) {
6351 // Test fired too early or in an unsupported environment, exit.
6352 return;
6353 }
6354
6355 // Setup
6356 div = document.createElement( "div" );
6357 container = document.createElement( "div" );
6358 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6359 body.appendChild( container ).appendChild( div );
6360
6361 div.style.cssText =
6362 // Support: Firefox<29, Android 2.3
6363 // Vendor-prefix box-sizing
6364 "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
6365 "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
6366 "border:1px;padding:1px;width:4px;position:absolute";
6367
6368 // Support: IE<9
6369 // Assume reasonable values in the absence of getComputedStyle
6370 pixelPositionVal = boxSizingReliableVal = false;
6371 reliableMarginRightVal = true;
6372
6373 // Check for getComputedStyle so that this code is not run in IE<9.
6374 if ( window.getComputedStyle ) {
6375 pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
6376 boxSizingReliableVal =
6377 ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
6378
6379 // Support: Android 2.3
6380 // Div with explicit width and no margin-right incorrectly
6381 // gets computed margin-right based on width of container (#3333)
6382 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6383 contents = div.appendChild( document.createElement( "div" ) );
6384
6385 // Reset CSS: box-sizing; display; margin; border; padding
6386 contents.style.cssText = div.style.cssText =
6387 // Support: Firefox<29, Android 2.3
6388 // Vendor-prefix box-sizing
6389 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6390 "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6391 contents.style.marginRight = contents.style.width = "0";
6392 div.style.width = "1px";
6393
6394 reliableMarginRightVal =
6395 !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
6396
6397 div.removeChild( contents );
6398 }
6399
6400 // Support: IE8
6401 // Check if table cells still have offsetWidth/Height when they are set
6402 // to display:none and there are still other visible table cells in a
6403 // table row; if so, offsetWidth/Height are not reliable for use when
6404 // determining if an element has been hidden directly using
6405 // display:none (it is still safe to use offsets if a parent element is
6406 // hidden; don safety goggles and see bug #4512 for more information).
6407 div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6408 contents = div.getElementsByTagName( "td" );
6409 contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
6410 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6411 if ( reliableHiddenOffsetsVal ) {
6412 contents[ 0 ].style.display = "";
6413 contents[ 1 ].style.display = "none";
6414 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6415 }
6416
6417 body.removeChild( container );
6418 }
6419
6420 })();
6421
6422
6423 // A method for quickly swapping in/out CSS properties to get correct calculations.
6424 jQuery.swap = function( elem, options, callback, args ) {
6425 var ret, name,
6426 old = {};
6427
6428 // Remember the old values, and insert the new ones
6429 for ( name in options ) {
6430 old[ name ] = elem.style[ name ];
6431 elem.style[ name ] = options[ name ];
6432 }
6433
6434 ret = callback.apply( elem, args || [] );
6435
6436 // Revert the old values
6437 for ( name in options ) {
6438 elem.style[ name ] = old[ name ];
6439 }
6440
6441 return ret;
6442 };
6443
6444
6445 var
6446 ralpha = /alpha\([^)]*\)/i,
6447 ropacity = /opacity\s*=\s*([^)]*)/,
6448
6449 // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6450 // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6451 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6452 rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
6453 rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
6454
6455 cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6456 cssNormalTransform = {
6457 letterSpacing: "0",
6458 fontWeight: "400"
6459 },
6460
6461 cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6462
6463
6464 // return a css property mapped to a potentially vendor prefixed property
6465 function vendorPropName( style, name ) {
6466
6467 // shortcut for names that are not vendor prefixed
6468 if ( name in style ) {
6469 return name;
6470 }
6471
6472 // check for vendor prefixed names
6473 var capName = name.charAt(0).toUpperCase() + name.slice(1),
6474 origName = name,
6475 i = cssPrefixes.length;
6476
6477 while ( i-- ) {
6478 name = cssPrefixes[ i ] + capName;
6479 if ( name in style ) {
6480 return name;
6481 }
6482 }
6483
6484 return origName;
6485 }
6486
6487 function showHide( elements, show ) {
6488 var display, elem, hidden,
6489 values = [],
6490 index = 0,
6491 length = elements.length;
6492
6493 for ( ; index < length; index++ ) {
6494 elem = elements[ index ];
6495 if ( !elem.style ) {
6496 continue;
6497 }
6498
6499 values[ index ] = jQuery._data( elem, "olddisplay" );
6500 display = elem.style.display;
6501 if ( show ) {
6502 // Reset the inline display of this element to learn if it is
6503 // being hidden by cascaded rules or not
6504 if ( !values[ index ] && display === "none" ) {
6505 elem.style.display = "";
6506 }
6507
6508 // Set elements which have been overridden with display: none
6509 // in a stylesheet to whatever the default browser style is
6510 // for such an element
6511 if ( elem.style.display === "" && isHidden( elem ) ) {
6512 values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
6513 }
6514 } else {
6515 hidden = isHidden( elem );
6516
6517 if ( display && display !== "none" || !hidden ) {
6518 jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6519 }
6520 }
6521 }
6522
6523 // Set the display of most of the elements in a second loop
6524 // to avoid the constant reflow
6525 for ( index = 0; index < length; index++ ) {
6526 elem = elements[ index ];
6527 if ( !elem.style ) {
6528 continue;
6529 }
6530 if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6531 elem.style.display = show ? values[ index ] || "" : "none";
6532 }
6533 }
6534
6535 return elements;
6536 }
6537
6538 function setPositiveNumber( elem, value, subtract ) {
6539 var matches = rnumsplit.exec( value );
6540 return matches ?
6541 // Guard against undefined "subtract", e.g., when used as in cssHooks
6542 Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
6543 value;
6544 }
6545
6546 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6547 var i = extra === ( isBorderBox ? "border" : "content" ) ?
6548 // If we already have the right measurement, avoid augmentation
6549 4 :
6550 // Otherwise initialize for horizontal or vertical properties
6551 name === "width" ? 1 : 0,
6552
6553 val = 0;
6554
6555 for ( ; i < 4; i += 2 ) {
6556 // both box models exclude margin, so add it if we want it
6557 if ( extra === "margin" ) {
6558 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6559 }
6560
6561 if ( isBorderBox ) {
6562 // border-box includes padding, so remove it if we want content
6563 if ( extra === "content" ) {
6564 val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6565 }
6566
6567 // at this point, extra isn't border nor margin, so remove border
6568 if ( extra !== "margin" ) {
6569 val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6570 }
6571 } else {
6572 // at this point, extra isn't content, so add padding
6573 val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6574
6575 // at this point, extra isn't content nor padding, so add border
6576 if ( extra !== "padding" ) {
6577 val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6578 }
6579 }
6580 }
6581
6582 return val;
6583 }
6584
6585 function getWidthOrHeight( elem, name, extra ) {
6586
6587 // Start with offset property, which is equivalent to the border-box value
6588 var valueIsBorderBox = true,
6589 val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6590 styles = getStyles( elem ),
6591 isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6592
6593 // some non-html elements return undefined for offsetWidth, so check for null/undefined
6594 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
6595 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
6596 if ( val <= 0 || val == null ) {
6597 // Fall back to computed then uncomputed css if necessary
6598 val = curCSS( elem, name, styles );
6599 if ( val < 0 || val == null ) {
6600 val = elem.style[ name ];
6601 }
6602
6603 // Computed unit is not pixels. Stop here and return.
6604 if ( rnumnonpx.test(val) ) {
6605 return val;
6606 }
6607
6608 // we need the check for style in case a browser which returns unreliable values
6609 // for getComputedStyle silently falls back to the reliable elem.style
6610 valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
6611
6612 // Normalize "", auto, and prepare for extra
6613 val = parseFloat( val ) || 0;
6614 }
6615
6616 // use the active box-sizing model to add/subtract irrelevant styles
6617 return ( val +
6618 augmentWidthOrHeight(
6619 elem,
6620 name,
6621 extra || ( isBorderBox ? "border" : "content" ),
6622 valueIsBorderBox,
6623 styles
6624 )
6625 ) + "px";
6626 }
6627
6628 jQuery.extend({
6629 // Add in style property hooks for overriding the default
6630 // behavior of getting and setting a style property
6631 cssHooks: {
6632 opacity: {
6633 get: function( elem, computed ) {
6634 if ( computed ) {
6635 // We should always get a number back from opacity
6636 var ret = curCSS( elem, "opacity" );
6637 return ret === "" ? "1" : ret;
6638 }
6639 }
6640 }
6641 },
6642
6643 // Don't automatically add "px" to these possibly-unitless properties
6644 cssNumber: {
6645 "columnCount": true,
6646 "fillOpacity": true,
6647 "flexGrow": true,
6648 "flexShrink": true,
6649 "fontWeight": true,
6650 "lineHeight": true,
6651 "opacity": true,
6652 "order": true,
6653 "orphans": true,
6654 "widows": true,
6655 "zIndex": true,
6656 "zoom": true
6657 },
6658
6659 // Add in properties whose names you wish to fix before
6660 // setting or getting the value
6661 cssProps: {
6662 // normalize float css property
6663 "float": support.cssFloat ? "cssFloat" : "styleFloat"
6664 },
6665
6666 // Get and set the style property on a DOM Node
6667 style: function( elem, name, value, extra ) {
6668 // Don't set styles on text and comment nodes
6669 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6670 return;
6671 }
6672
6673 // Make sure that we're working with the right name
6674 var ret, type, hooks,
6675 origName = jQuery.camelCase( name ),
6676 style = elem.style;
6677
6678 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6679
6680 // gets hook for the prefixed version
6681 // followed by the unprefixed version
6682 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6683
6684 // Check if we're setting a value
6685 if ( value !== undefined ) {
6686 type = typeof value;
6687
6688 // convert relative number strings (+= or -=) to relative numbers. #7345
6689 if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6690 value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
6691 // Fixes bug #9237
6692 type = "number";
6693 }
6694
6695 // Make sure that null and NaN values aren't set. See: #7116
6696 if ( value == null || value !== value ) {
6697 return;
6698 }
6699
6700 // If a number was passed in, add 'px' to the (except for certain CSS properties)
6701 if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6702 value += "px";
6703 }
6704
6705 // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6706 // but it would mean to define eight (for every problematic property) identical functions
6707 if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
6708 style[ name ] = "inherit";
6709 }
6710
6711 // If a hook was provided, use that value, otherwise just set the specified value
6712 if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
6713
6714 // Support: IE
6715 // Swallow errors from 'invalid' CSS values (#5509)
6716 try {
6717 style[ name ] = value;
6718 } catch(e) {}
6719 }
6720
6721 } else {
6722 // If a hook was provided get the non-computed value from there
6723 if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6724 return ret;
6725 }
6726
6727 // Otherwise just get the value from the style object
6728 return style[ name ];
6729 }
6730 },
6731
6732 css: function( elem, name, extra, styles ) {
6733 var num, val, hooks,
6734 origName = jQuery.camelCase( name );
6735
6736 // Make sure that we're working with the right name
6737 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6738
6739 // gets hook for the prefixed version
6740 // followed by the unprefixed version
6741 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6742
6743 // If a hook was provided get the computed value from there
6744 if ( hooks && "get" in hooks ) {
6745 val = hooks.get( elem, true, extra );
6746 }
6747
6748 // Otherwise, if a way to get the computed value exists, use that
6749 if ( val === undefined ) {
6750 val = curCSS( elem, name, styles );
6751 }
6752
6753 //convert "normal" to computed value
6754 if ( val === "normal" && name in cssNormalTransform ) {
6755 val = cssNormalTransform[ name ];
6756 }
6757
6758 // Return, converting to number if forced or a qualifier was provided and val looks numeric
6759 if ( extra === "" || extra ) {
6760 num = parseFloat( val );
6761 return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6762 }
6763 return val;
6764 }
6765 });
6766
6767 jQuery.each([ "height", "width" ], function( i, name ) {
6768 jQuery.cssHooks[ name ] = {
6769 get: function( elem, computed, extra ) {
6770 if ( computed ) {
6771 // certain elements can have dimension info if we invisibly show them
6772 // however, it must have a current display style that would benefit from this
6773 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
6774 jQuery.swap( elem, cssShow, function() {
6775 return getWidthOrHeight( elem, name, extra );
6776 }) :
6777 getWidthOrHeight( elem, name, extra );
6778 }
6779 },
6780
6781 set: function( elem, value, extra ) {
6782 var styles = extra && getStyles( elem );
6783 return setPositiveNumber( elem, value, extra ?
6784 augmentWidthOrHeight(
6785 elem,
6786 name,
6787 extra,
6788 support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6789 styles
6790 ) : 0
6791 );
6792 }
6793 };
6794 });
6795
6796 if ( !support.opacity ) {
6797 jQuery.cssHooks.opacity = {
6798 get: function( elem, computed ) {
6799 // IE uses filters for opacity
6800 return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6801 ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
6802 computed ? "1" : "";
6803 },
6804
6805 set: function( elem, value ) {
6806 var style = elem.style,
6807 currentStyle = elem.currentStyle,
6808 opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6809 filter = currentStyle && currentStyle.filter || style.filter || "";
6810
6811 // IE has trouble with opacity if it does not have layout
6812 // Force it by setting the zoom level
6813 style.zoom = 1;
6814
6815 // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6816 // if value === "", then remove inline opacity #12685
6817 if ( ( value >= 1 || value === "" ) &&
6818 jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
6819 style.removeAttribute ) {
6820
6821 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6822 // if "filter:" is present at all, clearType is disabled, we want to avoid this
6823 // style.removeAttribute is IE Only, but so apparently is this code path...
6824 style.removeAttribute( "filter" );
6825
6826 // if there is no filter style applied in a css rule or unset inline opacity, we are done
6827 if ( value === "" || currentStyle && !currentStyle.filter ) {
6828 return;
6829 }
6830 }
6831
6832 // otherwise, set new filter values
6833 style.filter = ralpha.test( filter ) ?
6834 filter.replace( ralpha, opacity ) :
6835 filter + " " + opacity;
6836 }
6837 };
6838 }
6839
6840 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
6841 function( elem, computed ) {
6842 if ( computed ) {
6843 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6844 // Work around by temporarily setting element display to inline-block
6845 return jQuery.swap( elem, { "display": "inline-block" },
6846 curCSS, [ elem, "marginRight" ] );
6847 }
6848 }
6849 );
6850
6851 // These hooks are used by animate to expand properties
6852 jQuery.each({
6853 margin: "",
6854 padding: "",
6855 border: "Width"
6856 }, function( prefix, suffix ) {
6857 jQuery.cssHooks[ prefix + suffix ] = {
6858 expand: function( value ) {
6859 var i = 0,
6860 expanded = {},
6861
6862 // assumes a single number if not a string
6863 parts = typeof value === "string" ? value.split(" ") : [ value ];
6864
6865 for ( ; i < 4; i++ ) {
6866 expanded[ prefix + cssExpand[ i ] + suffix ] =
6867 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6868 }
6869
6870 return expanded;
6871 }
6872 };
6873
6874 if ( !rmargin.test( prefix ) ) {
6875 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6876 }
6877 });
6878
6879 jQuery.fn.extend({
6880 css: function( name, value ) {
6881 return access( this, function( elem, name, value ) {
6882 var styles, len,
6883 map = {},
6884 i = 0;
6885
6886 if ( jQuery.isArray( name ) ) {
6887 styles = getStyles( elem );
6888 len = name.length;
6889
6890 for ( ; i < len; i++ ) {
6891 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6892 }
6893
6894 return map;
6895 }
6896
6897 return value !== undefined ?
6898 jQuery.style( elem, name, value ) :
6899 jQuery.css( elem, name );
6900 }, name, value, arguments.length > 1 );
6901 },
6902 show: function() {
6903 return showHide( this, true );
6904 },
6905 hide: function() {
6906 return showHide( this );
6907 },
6908 toggle: function( state ) {
6909 if ( typeof state === "boolean" ) {
6910 return state ? this.show() : this.hide();
6911 }
6912
6913 return this.each(function() {
6914 if ( isHidden( this ) ) {
6915 jQuery( this ).show();
6916 } else {
6917 jQuery( this ).hide();
6918 }
6919 });
6920 }
6921 });
6922
6923
6924 function Tween( elem, options, prop, end, easing ) {
6925 return new Tween.prototype.init( elem, options, prop, end, easing );
6926 }
6927 jQuery.Tween = Tween;
6928
6929 Tween.prototype = {
6930 constructor: Tween,
6931 init: function( elem, options, prop, end, easing, unit ) {
6932 this.elem = elem;
6933 this.prop = prop;
6934 this.easing = easing || "swing";
6935 this.options = options;
6936 this.start = this.now = this.cur();
6937 this.end = end;
6938 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6939 },
6940 cur: function() {
6941 var hooks = Tween.propHooks[ this.prop ];
6942
6943 return hooks && hooks.get ?
6944 hooks.get( this ) :
6945 Tween.propHooks._default.get( this );
6946 },
6947 run: function( percent ) {
6948 var eased,
6949 hooks = Tween.propHooks[ this.prop ];
6950
6951 if ( this.options.duration ) {
6952 this.pos = eased = jQuery.easing[ this.easing ](
6953 percent, this.options.duration * percent, 0, 1, this.options.duration
6954 );
6955 } else {
6956 this.pos = eased = percent;
6957 }
6958 this.now = ( this.end - this.start ) * eased + this.start;
6959
6960 if ( this.options.step ) {
6961 this.options.step.call( this.elem, this.now, this );
6962 }
6963
6964 if ( hooks && hooks.set ) {
6965 hooks.set( this );
6966 } else {
6967 Tween.propHooks._default.set( this );
6968 }
6969 return this;
6970 }
6971 };
6972
6973 Tween.prototype.init.prototype = Tween.prototype;
6974
6975 Tween.propHooks = {
6976 _default: {
6977 get: function( tween ) {
6978 var result;
6979
6980 if ( tween.elem[ tween.prop ] != null &&
6981 (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
6982 return tween.elem[ tween.prop ];
6983 }
6984
6985 // passing an empty string as a 3rd parameter to .css will automatically
6986 // attempt a parseFloat and fallback to a string if the parse fails
6987 // so, simple values such as "10px" are parsed to Float.
6988 // complex values such as "rotate(1rad)" are returned as is.
6989 result = jQuery.css( tween.elem, tween.prop, "" );
6990 // Empty strings, null, undefined and "auto" are converted to 0.
6991 return !result || result === "auto" ? 0 : result;
6992 },
6993 set: function( tween ) {
6994 // use step hook for back compat - use cssHook if its there - use .style if its
6995 // available and use plain properties where available
6996 if ( jQuery.fx.step[ tween.prop ] ) {
6997 jQuery.fx.step[ tween.prop ]( tween );
6998 } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
6999 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7000 } else {
7001 tween.elem[ tween.prop ] = tween.now;
7002 }
7003 }
7004 }
7005 };
7006
7007 // Support: IE <=9
7008 // Panic based approach to setting things on disconnected nodes
7009
7010 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7011 set: function( tween ) {
7012 if ( tween.elem.nodeType && tween.elem.parentNode ) {
7013 tween.elem[ tween.prop ] = tween.now;
7014 }
7015 }
7016 };
7017
7018 jQuery.easing = {
7019 linear: function( p ) {
7020 return p;
7021 },
7022 swing: function( p ) {
7023 return 0.5 - Math.cos( p * Math.PI ) / 2;
7024 }
7025 };
7026
7027 jQuery.fx = Tween.prototype.init;
7028
7029 // Back Compat <1.8 extension point
7030 jQuery.fx.step = {};
7031
7032
7033
7034
7035 var
7036 fxNow, timerId,
7037 rfxtypes = /^(?:toggle|show|hide)$/,
7038 rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
7039 rrun = /queueHooks$/,
7040 animationPrefilters = [ defaultPrefilter ],
7041 tweeners = {
7042 "*": [ function( prop, value ) {
7043 var tween = this.createTween( prop, value ),
7044 target = tween.cur(),
7045 parts = rfxnum.exec( value ),
7046 unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
7047
7048 // Starting value computation is required for potential unit mismatches
7049 start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
7050 rfxnum.exec( jQuery.css( tween.elem, prop ) ),
7051 scale = 1,
7052 maxIterations = 20;
7053
7054 if ( start && start[ 3 ] !== unit ) {
7055 // Trust units reported by jQuery.css
7056 unit = unit || start[ 3 ];
7057
7058 // Make sure we update the tween properties later on
7059 parts = parts || [];
7060
7061 // Iteratively approximate from a nonzero starting point
7062 start = +target || 1;
7063
7064 do {
7065 // If previous iteration zeroed out, double until we get *something*
7066 // Use a string for doubling factor so we don't accidentally see scale as unchanged below
7067 scale = scale || ".5";
7068
7069 // Adjust and apply
7070 start = start / scale;
7071 jQuery.style( tween.elem, prop, start + unit );
7072
7073 // Update scale, tolerating zero or NaN from tween.cur()
7074 // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
7075 } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
7076 }
7077
7078 // Update tween properties
7079 if ( parts ) {
7080 start = tween.start = +start || +target || 0;
7081 tween.unit = unit;
7082 // If a +=/-= token was provided, we're doing a relative animation
7083 tween.end = parts[ 1 ] ?
7084 start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
7085 +parts[ 2 ];
7086 }
7087
7088 return tween;
7089 } ]
7090 };
7091
7092 // Animations created synchronously will run synchronously
7093 function createFxNow() {
7094 setTimeout(function() {
7095 fxNow = undefined;
7096 });
7097 return ( fxNow = jQuery.now() );
7098 }
7099
7100 // Generate parameters to create a standard animation
7101 function genFx( type, includeWidth ) {
7102 var which,
7103 attrs = { height: type },
7104 i = 0;
7105
7106 // if we include width, step value is 1 to do all cssExpand values,
7107 // if we don't include width, step value is 2 to skip over Left and Right
7108 includeWidth = includeWidth ? 1 : 0;
7109 for ( ; i < 4 ; i += 2 - includeWidth ) {
7110 which = cssExpand[ i ];
7111 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7112 }
7113
7114 if ( includeWidth ) {
7115 attrs.opacity = attrs.width = type;
7116 }
7117
7118 return attrs;
7119 }
7120
7121 function createTween( value, prop, animation ) {
7122 var tween,
7123 collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
7124 index = 0,
7125 length = collection.length;
7126 for ( ; index < length; index++ ) {
7127 if ( (tween = collection[ index ].call( animation, prop, value )) ) {
7128
7129 // we're done with this property
7130 return tween;
7131 }
7132 }
7133 }
7134
7135 function defaultPrefilter( elem, props, opts ) {
7136 /* jshint validthis: true */
7137 var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
7138 anim = this,
7139 orig = {},
7140 style = elem.style,
7141 hidden = elem.nodeType && isHidden( elem ),
7142 dataShow = jQuery._data( elem, "fxshow" );
7143
7144 // handle queue: false promises
7145 if ( !opts.queue ) {
7146 hooks = jQuery._queueHooks( elem, "fx" );
7147 if ( hooks.unqueued == null ) {
7148 hooks.unqueued = 0;
7149 oldfire = hooks.empty.fire;
7150 hooks.empty.fire = function() {
7151 if ( !hooks.unqueued ) {
7152 oldfire();
7153 }
7154 };
7155 }
7156 hooks.unqueued++;
7157
7158 anim.always(function() {
7159 // doing this makes sure that the complete handler will be called
7160 // before this completes
7161 anim.always(function() {
7162 hooks.unqueued--;
7163 if ( !jQuery.queue( elem, "fx" ).length ) {
7164 hooks.empty.fire();
7165 }
7166 });
7167 });
7168 }
7169
7170 // height/width overflow pass
7171 if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
7172 // Make sure that nothing sneaks out
7173 // Record all 3 overflow attributes because IE does not
7174 // change the overflow attribute when overflowX and
7175 // overflowY are set to the same value
7176 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7177
7178 // Set display property to inline-block for height/width
7179 // animations on inline elements that are having width/height animated
7180 display = jQuery.css( elem, "display" );
7181
7182 // Test default display if display is currently "none"
7183 checkDisplay = display === "none" ?
7184 jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
7185
7186 if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
7187
7188 // inline-level elements accept inline-block;
7189 // block-level elements need to be inline with layout
7190 if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
7191 style.display = "inline-block";
7192 } else {
7193 style.zoom = 1;
7194 }
7195 }
7196 }
7197
7198 if ( opts.overflow ) {
7199 style.overflow = "hidden";
7200 if ( !support.shrinkWrapBlocks() ) {
7201 anim.always(function() {
7202 style.overflow = opts.overflow[ 0 ];
7203 style.overflowX = opts.overflow[ 1 ];
7204 style.overflowY = opts.overflow[ 2 ];
7205 });
7206 }
7207 }
7208
7209 // show/hide pass
7210 for ( prop in props ) {
7211 value = props[ prop ];
7212 if ( rfxtypes.exec( value ) ) {
7213 delete props[ prop ];
7214 toggle = toggle || value === "toggle";
7215 if ( value === ( hidden ? "hide" : "show" ) ) {
7216
7217 // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
7218 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7219 hidden = true;
7220 } else {
7221 continue;
7222 }
7223 }
7224 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7225
7226 // Any non-fx value stops us from restoring the original display value
7227 } else {
7228 display = undefined;
7229 }
7230 }
7231
7232 if ( !jQuery.isEmptyObject( orig ) ) {
7233 if ( dataShow ) {
7234 if ( "hidden" in dataShow ) {
7235 hidden = dataShow.hidden;
7236 }
7237 } else {
7238 dataShow = jQuery._data( elem, "fxshow", {} );
7239 }
7240
7241 // store state if its toggle - enables .stop().toggle() to "reverse"
7242 if ( toggle ) {
7243 dataShow.hidden = !hidden;
7244 }
7245 if ( hidden ) {
7246 jQuery( elem ).show();
7247 } else {
7248 anim.done(function() {
7249 jQuery( elem ).hide();
7250 });
7251 }
7252 anim.done(function() {
7253 var prop;
7254 jQuery._removeData( elem, "fxshow" );
7255 for ( prop in orig ) {
7256 jQuery.style( elem, prop, orig[ prop ] );
7257 }
7258 });
7259 for ( prop in orig ) {
7260 tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7261
7262 if ( !( prop in dataShow ) ) {
7263 dataShow[ prop ] = tween.start;
7264 if ( hidden ) {
7265 tween.end = tween.start;
7266 tween.start = prop === "width" || prop === "height" ? 1 : 0;
7267 }
7268 }
7269 }
7270
7271 // If this is a noop like .hide().hide(), restore an overwritten display value
7272 } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
7273 style.display = display;
7274 }
7275 }
7276
7277 function propFilter( props, specialEasing ) {
7278 var index, name, easing, value, hooks;
7279
7280 // camelCase, specialEasing and expand cssHook pass
7281 for ( index in props ) {
7282 name = jQuery.camelCase( index );
7283 easing = specialEasing[ name ];
7284 value = props[ index ];
7285 if ( jQuery.isArray( value ) ) {
7286 easing = value[ 1 ];
7287 value = props[ index ] = value[ 0 ];
7288 }
7289
7290 if ( index !== name ) {
7291 props[ name ] = value;
7292 delete props[ index ];
7293 }
7294
7295 hooks = jQuery.cssHooks[ name ];
7296 if ( hooks && "expand" in hooks ) {
7297 value = hooks.expand( value );
7298 delete props[ name ];
7299
7300 // not quite $.extend, this wont overwrite keys already present.
7301 // also - reusing 'index' from above because we have the correct "name"
7302 for ( index in value ) {
7303 if ( !( index in props ) ) {
7304 props[ index ] = value[ index ];
7305 specialEasing[ index ] = easing;
7306 }
7307 }
7308 } else {
7309 specialEasing[ name ] = easing;
7310 }
7311 }
7312 }
7313
7314 function Animation( elem, properties, options ) {
7315 var result,
7316 stopped,
7317 index = 0,
7318 length = animationPrefilters.length,
7319 deferred = jQuery.Deferred().always( function() {
7320 // don't match elem in the :animated selector
7321 delete tick.elem;
7322 }),
7323 tick = function() {
7324 if ( stopped ) {
7325 return false;
7326 }
7327 var currentTime = fxNow || createFxNow(),
7328 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7329 // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
7330 temp = remaining / animation.duration || 0,
7331 percent = 1 - temp,
7332 index = 0,
7333 length = animation.tweens.length;
7334
7335 for ( ; index < length ; index++ ) {
7336 animation.tweens[ index ].run( percent );
7337 }
7338
7339 deferred.notifyWith( elem, [ animation, percent, remaining ]);
7340
7341 if ( percent < 1 && length ) {
7342 return remaining;
7343 } else {
7344 deferred.resolveWith( elem, [ animation ] );
7345 return false;
7346 }
7347 },
7348 animation = deferred.promise({
7349 elem: elem,
7350 props: jQuery.extend( {}, properties ),
7351 opts: jQuery.extend( true, { specialEasing: {} }, options ),
7352 originalProperties: properties,
7353 originalOptions: options,
7354 startTime: fxNow || createFxNow(),
7355 duration: options.duration,
7356 tweens: [],
7357 createTween: function( prop, end ) {
7358 var tween = jQuery.Tween( elem, animation.opts, prop, end,
7359 animation.opts.specialEasing[ prop ] || animation.opts.easing );
7360 animation.tweens.push( tween );
7361 return tween;
7362 },
7363 stop: function( gotoEnd ) {
7364 var index = 0,
7365 // if we are going to the end, we want to run all the tweens
7366 // otherwise we skip this part
7367 length = gotoEnd ? animation.tweens.length : 0;
7368 if ( stopped ) {
7369 return this;
7370 }
7371 stopped = true;
7372 for ( ; index < length ; index++ ) {
7373 animation.tweens[ index ].run( 1 );
7374 }
7375
7376 // resolve when we played the last frame
7377 // otherwise, reject
7378 if ( gotoEnd ) {
7379 deferred.resolveWith( elem, [ animation, gotoEnd ] );
7380 } else {
7381 deferred.rejectWith( elem, [ animation, gotoEnd ] );
7382 }
7383 return this;
7384 }
7385 }),
7386 props = animation.props;
7387
7388 propFilter( props, animation.opts.specialEasing );
7389
7390 for ( ; index < length ; index++ ) {
7391 result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
7392 if ( result ) {
7393 return result;
7394 }
7395 }
7396
7397 jQuery.map( props, createTween, animation );
7398
7399 if ( jQuery.isFunction( animation.opts.start ) ) {
7400 animation.opts.start.call( elem, animation );
7401 }
7402
7403 jQuery.fx.timer(
7404 jQuery.extend( tick, {
7405 elem: elem,
7406 anim: animation,
7407 queue: animation.opts.queue
7408 })
7409 );
7410
7411 // attach callbacks from options
7412 return animation.progress( animation.opts.progress )
7413 .done( animation.opts.done, animation.opts.complete )
7414 .fail( animation.opts.fail )
7415 .always( animation.opts.always );
7416 }
7417
7418 jQuery.Animation = jQuery.extend( Animation, {
7419 tweener: function( props, callback ) {
7420 if ( jQuery.isFunction( props ) ) {
7421 callback = props;
7422 props = [ "*" ];
7423 } else {
7424 props = props.split(" ");
7425 }
7426
7427 var prop,
7428 index = 0,
7429 length = props.length;
7430
7431 for ( ; index < length ; index++ ) {
7432 prop = props[ index ];
7433 tweeners[ prop ] = tweeners[ prop ] || [];
7434 tweeners[ prop ].unshift( callback );
7435 }
7436 },
7437
7438 prefilter: function( callback, prepend ) {
7439 if ( prepend ) {
7440 animationPrefilters.unshift( callback );
7441 } else {
7442 animationPrefilters.push( callback );
7443 }
7444 }
7445 });
7446
7447 jQuery.speed = function( speed, easing, fn ) {
7448 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7449 complete: fn || !fn && easing ||
7450 jQuery.isFunction( speed ) && speed,
7451 duration: speed,
7452 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7453 };
7454
7455 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7456 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
7457
7458 // normalize opt.queue - true/undefined/null -> "fx"
7459 if ( opt.queue == null || opt.queue === true ) {
7460 opt.queue = "fx";
7461 }
7462
7463 // Queueing
7464 opt.old = opt.complete;
7465
7466 opt.complete = function() {
7467 if ( jQuery.isFunction( opt.old ) ) {
7468 opt.old.call( this );
7469 }
7470
7471 if ( opt.queue ) {
7472 jQuery.dequeue( this, opt.queue );
7473 }
7474 };
7475
7476 return opt;
7477 };
7478
7479 jQuery.fn.extend({
7480 fadeTo: function( speed, to, easing, callback ) {
7481
7482 // show any hidden elements after setting opacity to 0
7483 return this.filter( isHidden ).css( "opacity", 0 ).show()
7484
7485 // animate to the value specified
7486 .end().animate({ opacity: to }, speed, easing, callback );
7487 },
7488 animate: function( prop, speed, easing, callback ) {
7489 var empty = jQuery.isEmptyObject( prop ),
7490 optall = jQuery.speed( speed, easing, callback ),
7491 doAnimation = function() {
7492 // Operate on a copy of prop so per-property easing won't be lost
7493 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7494
7495 // Empty animations, or finishing resolves immediately
7496 if ( empty || jQuery._data( this, "finish" ) ) {
7497 anim.stop( true );
7498 }
7499 };
7500 doAnimation.finish = doAnimation;
7501
7502 return empty || optall.queue === false ?
7503 this.each( doAnimation ) :
7504 this.queue( optall.queue, doAnimation );
7505 },
7506 stop: function( type, clearQueue, gotoEnd ) {
7507 var stopQueue = function( hooks ) {
7508 var stop = hooks.stop;
7509 delete hooks.stop;
7510 stop( gotoEnd );
7511 };
7512
7513 if ( typeof type !== "string" ) {
7514 gotoEnd = clearQueue;
7515 clearQueue = type;
7516 type = undefined;
7517 }
7518 if ( clearQueue && type !== false ) {
7519 this.queue( type || "fx", [] );
7520 }
7521
7522 return this.each(function() {
7523 var dequeue = true,
7524 index = type != null && type + "queueHooks",
7525 timers = jQuery.timers,
7526 data = jQuery._data( this );
7527
7528 if ( index ) {
7529 if ( data[ index ] && data[ index ].stop ) {
7530 stopQueue( data[ index ] );
7531 }
7532 } else {
7533 for ( index in data ) {
7534 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7535 stopQueue( data[ index ] );
7536 }
7537 }
7538 }
7539
7540 for ( index = timers.length; index--; ) {
7541 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
7542 timers[ index ].anim.stop( gotoEnd );
7543 dequeue = false;
7544 timers.splice( index, 1 );
7545 }
7546 }
7547
7548 // start the next in the queue if the last step wasn't forced
7549 // timers currently will call their complete callbacks, which will dequeue
7550 // but only if they were gotoEnd
7551 if ( dequeue || !gotoEnd ) {
7552 jQuery.dequeue( this, type );
7553 }
7554 });
7555 },
7556 finish: function( type ) {
7557 if ( type !== false ) {
7558 type = type || "fx";
7559 }
7560 return this.each(function() {
7561 var index,
7562 data = jQuery._data( this ),
7563 queue = data[ type + "queue" ],
7564 hooks = data[ type + "queueHooks" ],
7565 timers = jQuery.timers,
7566 length = queue ? queue.length : 0;
7567
7568 // enable finishing flag on private data
7569 data.finish = true;
7570
7571 // empty the queue first
7572 jQuery.queue( this, type, [] );
7573
7574 if ( hooks && hooks.stop ) {
7575 hooks.stop.call( this, true );
7576 }
7577
7578 // look for any active animations, and finish them
7579 for ( index = timers.length; index--; ) {
7580 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7581 timers[ index ].anim.stop( true );
7582 timers.splice( index, 1 );
7583 }
7584 }
7585
7586 // look for any animations in the old queue and finish them
7587 for ( index = 0; index < length; index++ ) {
7588 if ( queue[ index ] && queue[ index ].finish ) {
7589 queue[ index ].finish.call( this );
7590 }
7591 }
7592
7593 // turn off finishing flag
7594 delete data.finish;
7595 });
7596 }
7597 });
7598
7599 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
7600 var cssFn = jQuery.fn[ name ];
7601 jQuery.fn[ name ] = function( speed, easing, callback ) {
7602 return speed == null || typeof speed === "boolean" ?
7603 cssFn.apply( this, arguments ) :
7604 this.animate( genFx( name, true ), speed, easing, callback );
7605 };
7606 });
7607
7608 // Generate shortcuts for custom animations
7609 jQuery.each({
7610 slideDown: genFx("show"),
7611 slideUp: genFx("hide"),
7612 slideToggle: genFx("toggle"),
7613 fadeIn: { opacity: "show" },
7614 fadeOut: { opacity: "hide" },
7615 fadeToggle: { opacity: "toggle" }
7616 }, function( name, props ) {
7617 jQuery.fn[ name ] = function( speed, easing, callback ) {
7618 return this.animate( props, speed, easing, callback );
7619 };
7620 });
7621
7622 jQuery.timers = [];
7623 jQuery.fx.tick = function() {
7624 var timer,
7625 timers = jQuery.timers,
7626 i = 0;
7627
7628 fxNow = jQuery.now();
7629
7630 for ( ; i < timers.length; i++ ) {
7631 timer = timers[ i ];
7632 // Checks the timer has not already been removed
7633 if ( !timer() && timers[ i ] === timer ) {
7634 timers.splice( i--, 1 );
7635 }
7636 }
7637
7638 if ( !timers.length ) {
7639 jQuery.fx.stop();
7640 }
7641 fxNow = undefined;
7642 };
7643
7644 jQuery.fx.timer = function( timer ) {
7645 jQuery.timers.push( timer );
7646 if ( timer() ) {
7647 jQuery.fx.start();
7648 } else {
7649 jQuery.timers.pop();
7650 }
7651 };
7652
7653 jQuery.fx.interval = 13;
7654
7655 jQuery.fx.start = function() {
7656 if ( !timerId ) {
7657 timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
7658 }
7659 };
7660
7661 jQuery.fx.stop = function() {
7662 clearInterval( timerId );
7663 timerId = null;
7664 };
7665
7666 jQuery.fx.speeds = {
7667 slow: 600,
7668 fast: 200,
7669 // Default speed
7670 _default: 400
7671 };
7672
7673
7674 // Based off of the plugin by Clint Helfers, with permission.
7675 // http://blindsignals.com/index.php/2009/07/jquery-delay/
7676 jQuery.fn.delay = function( time, type ) {
7677 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7678 type = type || "fx";
7679
7680 return this.queue( type, function( next, hooks ) {
7681 var timeout = setTimeout( next, time );
7682 hooks.stop = function() {
7683 clearTimeout( timeout );
7684 };
7685 });
7686 };
7687
7688
7689 (function() {
7690 // Minified: var a,b,c,d,e
7691 var input, div, select, a, opt;
7692
7693 // Setup
7694 div = document.createElement( "div" );
7695 div.setAttribute( "className", "t" );
7696 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
7697 a = div.getElementsByTagName("a")[ 0 ];
7698
7699 // First batch of tests.
7700 select = document.createElement("select");
7701 opt = select.appendChild( document.createElement("option") );
7702 input = div.getElementsByTagName("input")[ 0 ];
7703
7704 a.style.cssText = "top:1px";
7705
7706 // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
7707 support.getSetAttribute = div.className !== "t";
7708
7709 // Get the style information from getAttribute
7710 // (IE uses .cssText instead)
7711 support.style = /top/.test( a.getAttribute("style") );
7712
7713 // Make sure that URLs aren't manipulated
7714 // (IE normalizes it by default)
7715 support.hrefNormalized = a.getAttribute("href") === "/a";
7716
7717 // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
7718 support.checkOn = !!input.value;
7719
7720 // Make sure that a selected-by-default option has a working selected property.
7721 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
7722 support.optSelected = opt.selected;
7723
7724 // Tests for enctype support on a form (#6743)
7725 support.enctype = !!document.createElement("form").enctype;
7726
7727 // Make sure that the options inside disabled selects aren't marked as disabled
7728 // (WebKit marks them as disabled)
7729 select.disabled = true;
7730 support.optDisabled = !opt.disabled;
7731
7732 // Support: IE8 only
7733 // Check if we can trust getAttribute("value")
7734 input = document.createElement( "input" );
7735 input.setAttribute( "value", "" );
7736 support.input = input.getAttribute( "value" ) === "";
7737
7738 // Check if an input maintains its value after becoming a radio
7739 input.value = "t";
7740 input.setAttribute( "type", "radio" );
7741 support.radioValue = input.value === "t";
7742 })();
7743
7744
7745 var rreturn = /\r/g;
7746
7747 jQuery.fn.extend({
7748 val: function( value ) {
7749 var hooks, ret, isFunction,
7750 elem = this[0];
7751
7752 if ( !arguments.length ) {
7753 if ( elem ) {
7754 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7755
7756 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
7757 return ret;
7758 }
7759
7760 ret = elem.value;
7761
7762 return typeof ret === "string" ?
7763 // handle most common string cases
7764 ret.replace(rreturn, "") :
7765 // handle cases where value is null/undef or number
7766 ret == null ? "" : ret;
7767 }
7768
7769 return;
7770 }
7771
7772 isFunction = jQuery.isFunction( value );
7773
7774 return this.each(function( i ) {
7775 var val;
7776
7777 if ( this.nodeType !== 1 ) {
7778 return;
7779 }
7780
7781 if ( isFunction ) {
7782 val = value.call( this, i, jQuery( this ).val() );
7783 } else {
7784 val = value;
7785 }
7786
7787 // Treat null/undefined as ""; convert numbers to string
7788 if ( val == null ) {
7789 val = "";
7790 } else if ( typeof val === "number" ) {
7791 val += "";
7792 } else if ( jQuery.isArray( val ) ) {
7793 val = jQuery.map( val, function( value ) {
7794 return value == null ? "" : value + "";
7795 });
7796 }
7797
7798 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7799
7800 // If set returns undefined, fall back to normal setting
7801 if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
7802 this.value = val;
7803 }
7804 });
7805 }
7806 });
7807
7808 jQuery.extend({
7809 valHooks: {
7810 option: {
7811 get: function( elem ) {
7812 var val = jQuery.find.attr( elem, "value" );
7813 return val != null ?
7814 val :
7815 // Support: IE10-11+
7816 // option.text throws exceptions (#14686, #14858)
7817 jQuery.trim( jQuery.text( elem ) );
7818 }
7819 },
7820 select: {
7821 get: function( elem ) {
7822 var value, option,
7823 options = elem.options,
7824 index = elem.selectedIndex,
7825 one = elem.type === "select-one" || index < 0,
7826 values = one ? null : [],
7827 max = one ? index + 1 : options.length,
7828 i = index < 0 ?
7829 max :
7830 one ? index : 0;
7831
7832 // Loop through all the selected options
7833 for ( ; i < max; i++ ) {
7834 option = options[ i ];
7835
7836 // oldIE doesn't update selected after form reset (#2551)
7837 if ( ( option.selected || i === index ) &&
7838 // Don't return options that are disabled or in a disabled optgroup
7839 ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
7840 ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
7841
7842 // Get the specific value for the option
7843 value = jQuery( option ).val();
7844
7845 // We don't need an array for one selects
7846 if ( one ) {
7847 return value;
7848 }
7849
7850 // Multi-Selects return an array
7851 values.push( value );
7852 }
7853 }
7854
7855 return values;
7856 },
7857
7858 set: function( elem, value ) {
7859 var optionSet, option,
7860 options = elem.options,
7861 values = jQuery.makeArray( value ),
7862 i = options.length;
7863
7864 while ( i-- ) {
7865 option = options[ i ];
7866
7867 if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
7868
7869 // Support: IE6
7870 // When new option element is added to select box we need to
7871 // force reflow of newly added node in order to workaround delay
7872 // of initialization properties
7873 try {
7874 option.selected = optionSet = true;
7875
7876 } catch ( _ ) {
7877
7878 // Will be executed only in IE6
7879 option.scrollHeight;
7880 }
7881
7882 } else {
7883 option.selected = false;
7884 }
7885 }
7886
7887 // Force browsers to behave consistently when non-matching value is set
7888 if ( !optionSet ) {
7889 elem.selectedIndex = -1;
7890 }
7891
7892 return options;
7893 }
7894 }
7895 }
7896 });
7897
7898 // Radios and checkboxes getter/setter
7899 jQuery.each([ "radio", "checkbox" ], function() {
7900 jQuery.valHooks[ this ] = {
7901 set: function( elem, value ) {
7902 if ( jQuery.isArray( value ) ) {
7903 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
7904 }
7905 }
7906 };
7907 if ( !support.checkOn ) {
7908 jQuery.valHooks[ this ].get = function( elem ) {
7909 // Support: Webkit
7910 // "" is returned instead of "on" if a value isn't specified
7911 return elem.getAttribute("value") === null ? "on" : elem.value;
7912 };
7913 }
7914 });
7915
7916
7917
7918
7919 var nodeHook, boolHook,
7920 attrHandle = jQuery.expr.attrHandle,
7921 ruseDefault = /^(?:checked|selected)$/i,
7922 getSetAttribute = support.getSetAttribute,
7923 getSetInput = support.input;
7924
7925 jQuery.fn.extend({
7926 attr: function( name, value ) {
7927 return access( this, jQuery.attr, name, value, arguments.length > 1 );
7928 },
7929
7930 removeAttr: function( name ) {
7931 return this.each(function() {
7932 jQuery.removeAttr( this, name );
7933 });
7934 }
7935 });
7936
7937 jQuery.extend({
7938 attr: function( elem, name, value ) {
7939 var hooks, ret,
7940 nType = elem.nodeType;
7941
7942 // don't get/set attributes on text, comment and attribute nodes
7943 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
7944 return;
7945 }
7946
7947 // Fallback to prop when attributes are not supported
7948 if ( typeof elem.getAttribute === strundefined ) {
7949 return jQuery.prop( elem, name, value );
7950 }
7951
7952 // All attributes are lowercase
7953 // Grab necessary hook if one is defined
7954 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7955 name = name.toLowerCase();
7956 hooks = jQuery.attrHooks[ name ] ||
7957 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
7958 }
7959
7960 if ( value !== undefined ) {
7961
7962 if ( value === null ) {
7963 jQuery.removeAttr( elem, name );
7964
7965 } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
7966 return ret;
7967
7968 } else {
7969 elem.setAttribute( name, value + "" );
7970 return value;
7971 }
7972
7973 } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
7974 return ret;
7975
7976 } else {
7977 ret = jQuery.find.attr( elem, name );
7978
7979 // Non-existent attributes return null, we normalize to undefined
7980 return ret == null ?
7981 undefined :
7982 ret;
7983 }
7984 },
7985
7986 removeAttr: function( elem, value ) {
7987 var name, propName,
7988 i = 0,
7989 attrNames = value && value.match( rnotwhite );
7990
7991 if ( attrNames && elem.nodeType === 1 ) {
7992 while ( (name = attrNames[i++]) ) {
7993 propName = jQuery.propFix[ name ] || name;
7994
7995 // Boolean attributes get special treatment (#10870)
7996 if ( jQuery.expr.match.bool.test( name ) ) {
7997 // Set corresponding property to false
7998 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
7999 elem[ propName ] = false;
8000 // Support: IE<9
8001 // Also clear defaultChecked/defaultSelected (if appropriate)
8002 } else {
8003 elem[ jQuery.camelCase( "default-" + name ) ] =
8004 elem[ propName ] = false;
8005 }
8006
8007 // See #9699 for explanation of this approach (setting first, then removal)
8008 } else {
8009 jQuery.attr( elem, name, "" );
8010 }
8011
8012 elem.removeAttribute( getSetAttribute ? name : propName );
8013 }
8014 }
8015 },
8016
8017 attrHooks: {
8018 type: {
8019 set: function( elem, value ) {
8020 if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
8021 // Setting the type on a radio button after the value resets the value in IE6-9
8022 // Reset value to default in case type is set after value during creation
8023 var val = elem.value;
8024 elem.setAttribute( "type", value );
8025 if ( val ) {
8026 elem.value = val;
8027 }
8028 return value;
8029 }
8030 }
8031 }
8032 }
8033 });
8034
8035 // Hook for boolean attributes
8036 boolHook = {
8037 set: function( elem, value, name ) {
8038 if ( value === false ) {
8039 // Remove boolean attributes when set to false
8040 jQuery.removeAttr( elem, name );
8041 } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8042 // IE<8 needs the *property* name
8043 elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
8044
8045 // Use defaultChecked and defaultSelected for oldIE
8046 } else {
8047 elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
8048 }
8049
8050 return name;
8051 }
8052 };
8053
8054 // Retrieve booleans specially
8055 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8056
8057 var getter = attrHandle[ name ] || jQuery.find.attr;
8058
8059 attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
8060 function( elem, name, isXML ) {
8061 var ret, handle;
8062 if ( !isXML ) {
8063 // Avoid an infinite loop by temporarily removing this function from the getter
8064 handle = attrHandle[ name ];
8065 attrHandle[ name ] = ret;
8066 ret = getter( elem, name, isXML ) != null ?
8067 name.toLowerCase() :
8068 null;
8069 attrHandle[ name ] = handle;
8070 }
8071 return ret;
8072 } :
8073 function( elem, name, isXML ) {
8074 if ( !isXML ) {
8075 return elem[ jQuery.camelCase( "default-" + name ) ] ?
8076 name.toLowerCase() :
8077 null;
8078 }
8079 };
8080 });
8081
8082 // fix oldIE attroperties
8083 if ( !getSetInput || !getSetAttribute ) {
8084 jQuery.attrHooks.value = {
8085 set: function( elem, value, name ) {
8086 if ( jQuery.nodeName( elem, "input" ) ) {
8087 // Does not return so that setAttribute is also used
8088 elem.defaultValue = value;
8089 } else {
8090 // Use nodeHook if defined (#1954); otherwise setAttribute is fine
8091 return nodeHook && nodeHook.set( elem, value, name );
8092 }
8093 }
8094 };
8095 }
8096
8097 // IE6/7 do not support getting/setting some attributes with get/setAttribute
8098 if ( !getSetAttribute ) {
8099
8100 // Use this for any attribute in IE6/7
8101 // This fixes almost every IE6/7 issue
8102 nodeHook = {
8103 set: function( elem, value, name ) {
8104 // Set the existing or create a new attribute node
8105 var ret = elem.getAttributeNode( name );
8106 if ( !ret ) {
8107 elem.setAttributeNode(
8108 (ret = elem.ownerDocument.createAttribute( name ))
8109 );
8110 }
8111
8112 ret.value = value += "";
8113
8114 // Break association with cloned elements by also using setAttribute (#9646)
8115 if ( name === "value" || value === elem.getAttribute( name ) ) {
8116 return value;
8117 }
8118 }
8119 };
8120
8121 // Some attributes are constructed with empty-string values when not defined
8122 attrHandle.id = attrHandle.name = attrHandle.coords =
8123 function( elem, name, isXML ) {
8124 var ret;
8125 if ( !isXML ) {
8126 return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
8127 ret.value :
8128 null;
8129 }
8130 };
8131
8132 // Fixing value retrieval on a button requires this module
8133 jQuery.valHooks.button = {
8134 get: function( elem, name ) {
8135 var ret = elem.getAttributeNode( name );
8136 if ( ret && ret.specified ) {
8137 return ret.value;
8138 }
8139 },
8140 set: nodeHook.set
8141 };
8142
8143 // Set contenteditable to false on removals(#10429)
8144 // Setting to empty string throws an error as an invalid value
8145 jQuery.attrHooks.contenteditable = {
8146 set: function( elem, value, name ) {
8147 nodeHook.set( elem, value === "" ? false : value, name );
8148 }
8149 };
8150
8151 // Set width and height to auto instead of 0 on empty string( Bug #8150 )
8152 // This is for removals
8153 jQuery.each([ "width", "height" ], function( i, name ) {
8154 jQuery.attrHooks[ name ] = {
8155 set: function( elem, value ) {
8156 if ( value === "" ) {
8157 elem.setAttribute( name, "auto" );
8158 return value;
8159 }
8160 }
8161 };
8162 });
8163 }
8164
8165 if ( !support.style ) {
8166 jQuery.attrHooks.style = {
8167 get: function( elem ) {
8168 // Return undefined in the case of empty string
8169 // Note: IE uppercases css property names, but if we were to .toLowerCase()
8170 // .cssText, that would destroy case senstitivity in URL's, like in "background"
8171 return elem.style.cssText || undefined;
8172 },
8173 set: function( elem, value ) {
8174 return ( elem.style.cssText = value + "" );
8175 }
8176 };
8177 }
8178
8179
8180
8181
8182 var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8183 rclickable = /^(?:a|area)$/i;
8184
8185 jQuery.fn.extend({
8186 prop: function( name, value ) {
8187 return access( this, jQuery.prop, name, value, arguments.length > 1 );
8188 },
8189
8190 removeProp: function( name ) {
8191 name = jQuery.propFix[ name ] || name;
8192 return this.each(function() {
8193 // try/catch handles cases where IE balks (such as removing a property on window)
8194 try {
8195 this[ name ] = undefined;
8196 delete this[ name ];
8197 } catch( e ) {}
8198 });
8199 }
8200 });
8201
8202 jQuery.extend({
8203 propFix: {
8204 "for": "htmlFor",
8205 "class": "className"
8206 },
8207
8208 prop: function( elem, name, value ) {
8209 var ret, hooks, notxml,
8210 nType = elem.nodeType;
8211
8212 // don't get/set properties on text, comment and attribute nodes
8213 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
8214 return;
8215 }
8216
8217 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
8218
8219 if ( notxml ) {
8220 // Fix name and attach hooks
8221 name = jQuery.propFix[ name ] || name;
8222 hooks = jQuery.propHooks[ name ];
8223 }
8224
8225 if ( value !== undefined ) {
8226 return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
8227 ret :
8228 ( elem[ name ] = value );
8229
8230 } else {
8231 return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
8232 ret :
8233 elem[ name ];
8234 }
8235 },
8236
8237 propHooks: {
8238 tabIndex: {
8239 get: function( elem ) {
8240 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
8241 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8242 // Use proper attribute retrieval(#12072)
8243 var tabindex = jQuery.find.attr( elem, "tabindex" );
8244
8245 return tabindex ?
8246 parseInt( tabindex, 10 ) :
8247 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
8248 0 :
8249 -1;
8250 }
8251 }
8252 }
8253 });
8254
8255 // Some attributes require a special call on IE
8256 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8257 if ( !support.hrefNormalized ) {
8258 // href/src property should get the full normalized URL (#10299/#12915)
8259 jQuery.each([ "href", "src" ], function( i, name ) {
8260 jQuery.propHooks[ name ] = {
8261 get: function( elem ) {
8262 return elem.getAttribute( name, 4 );
8263 }
8264 };
8265 });
8266 }
8267
8268 // Support: Safari, IE9+
8269 // mis-reports the default selected property of an option
8270 // Accessing the parent's selectedIndex property fixes it
8271 if ( !support.optSelected ) {
8272 jQuery.propHooks.selected = {
8273 get: function( elem ) {
8274 var parent = elem.parentNode;
8275
8276 if ( parent ) {
8277 parent.selectedIndex;
8278
8279 // Make sure that it also works with optgroups, see #5701
8280 if ( parent.parentNode ) {
8281 parent.parentNode.selectedIndex;
8282 }
8283 }
8284 return null;
8285 }
8286 };
8287 }
8288
8289 jQuery.each([
8290 "tabIndex",
8291 "readOnly",
8292 "maxLength",
8293 "cellSpacing",
8294 "cellPadding",
8295 "rowSpan",
8296 "colSpan",
8297 "useMap",
8298 "frameBorder",
8299 "contentEditable"
8300 ], function() {
8301 jQuery.propFix[ this.toLowerCase() ] = this;
8302 });
8303
8304 // IE6/7 call enctype encoding
8305 if ( !support.enctype ) {
8306 jQuery.propFix.enctype = "encoding";
8307 }
8308
8309
8310
8311
8312 var rclass = /[\t\r\n\f]/g;
8313
8314 jQuery.fn.extend({
8315 addClass: function( value ) {
8316 var classes, elem, cur, clazz, j, finalValue,
8317 i = 0,
8318 len = this.length,
8319 proceed = typeof value === "string" && value;
8320
8321 if ( jQuery.isFunction( value ) ) {
8322 return this.each(function( j ) {
8323 jQuery( this ).addClass( value.call( this, j, this.className ) );
8324 });
8325 }
8326
8327 if ( proceed ) {
8328 // The disjunction here is for better compressibility (see removeClass)
8329 classes = ( value || "" ).match( rnotwhite ) || [];
8330
8331 for ( ; i < len; i++ ) {
8332 elem = this[ i ];
8333 cur = elem.nodeType === 1 && ( elem.className ?
8334 ( " " + elem.className + " " ).replace( rclass, " " ) :
8335 " "
8336 );
8337
8338 if ( cur ) {
8339 j = 0;
8340 while ( (clazz = classes[j++]) ) {
8341 if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8342 cur += clazz + " ";
8343 }
8344 }
8345
8346 // only assign if different to avoid unneeded rendering.
8347 finalValue = jQuery.trim( cur );
8348 if ( elem.className !== finalValue ) {
8349 elem.className = finalValue;
8350 }
8351 }
8352 }
8353 }
8354
8355 return this;
8356 },
8357
8358 removeClass: function( value ) {
8359 var classes, elem, cur, clazz, j, finalValue,
8360 i = 0,
8361 len = this.length,
8362 proceed = arguments.length === 0 || typeof value === "string" && value;
8363
8364 if ( jQuery.isFunction( value ) ) {
8365 return this.each(function( j ) {
8366 jQuery( this ).removeClass( value.call( this, j, this.className ) );
8367 });
8368 }
8369 if ( proceed ) {
8370 classes = ( value || "" ).match( rnotwhite ) || [];
8371
8372 for ( ; i < len; i++ ) {
8373 elem = this[ i ];
8374 // This expression is here for better compressibility (see addClass)
8375 cur = elem.nodeType === 1 && ( elem.className ?
8376 ( " " + elem.className + " " ).replace( rclass, " " ) :
8377 ""
8378 );
8379
8380 if ( cur ) {
8381 j = 0;
8382 while ( (clazz = classes[j++]) ) {
8383 // Remove *all* instances
8384 while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
8385 cur = cur.replace( " " + clazz + " ", " " );
8386 }
8387 }
8388
8389 // only assign if different to avoid unneeded rendering.
8390 finalValue = value ? jQuery.trim( cur ) : "";
8391 if ( elem.className !== finalValue ) {
8392 elem.className = finalValue;
8393 }
8394 }
8395 }
8396 }
8397
8398 return this;
8399 },
8400
8401 toggleClass: function( value, stateVal ) {
8402 var type = typeof value;
8403
8404 if ( typeof stateVal === "boolean" && type === "string" ) {
8405 return stateVal ? this.addClass( value ) : this.removeClass( value );
8406 }
8407
8408 if ( jQuery.isFunction( value ) ) {
8409 return this.each(function( i ) {
8410 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
8411 });
8412 }
8413
8414 return this.each(function() {
8415 if ( type === "string" ) {
8416 // toggle individual class names
8417 var className,
8418 i = 0,
8419 self = jQuery( this ),
8420 classNames = value.match( rnotwhite ) || [];
8421
8422 while ( (className = classNames[ i++ ]) ) {
8423 // check each className given, space separated list
8424 if ( self.hasClass( className ) ) {
8425 self.removeClass( className );
8426 } else {
8427 self.addClass( className );
8428 }
8429 }
8430
8431 // Toggle whole class name
8432 } else if ( type === strundefined || type === "boolean" ) {
8433 if ( this.className ) {
8434 // store className if set
8435 jQuery._data( this, "__className__", this.className );
8436 }
8437
8438 // If the element has a class name or if we're passed "false",
8439 // then remove the whole classname (if there was one, the above saved it).
8440 // Otherwise bring back whatever was previously saved (if anything),
8441 // falling back to the empty string if nothing was stored.
8442 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
8443 }
8444 });
8445 },
8446
8447 hasClass: function( selector ) {
8448 var className = " " + selector + " ",
8449 i = 0,
8450 l = this.length;
8451 for ( ; i < l; i++ ) {
8452 if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
8453 return true;
8454 }
8455 }
8456
8457 return false;
8458 }
8459 });
8460
8461
8462
8463
8464 // Return jQuery for attributes-only inclusion
8465
8466
8467 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
8468 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8469 "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
8470
8471 // Handle event binding
8472 jQuery.fn[ name ] = function( data, fn ) {
8473 return arguments.length > 0 ?
8474 this.on( name, null, data, fn ) :
8475 this.trigger( name );
8476 };
8477 });
8478
8479 jQuery.fn.extend({
8480 hover: function( fnOver, fnOut ) {
8481 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8482 },
8483
8484 bind: function( types, data, fn ) {
8485 return this.on( types, null, data, fn );
8486 },
8487 unbind: function( types, fn ) {
8488 return this.off( types, null, fn );
8489 },
8490
8491 delegate: function( selector, types, data, fn ) {
8492 return this.on( types, selector, data, fn );
8493 },
8494 undelegate: function( selector, types, fn ) {
8495 // ( namespace ) or ( selector, types [, fn] )
8496 return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
8497 }
8498 });
8499
8500
8501 var nonce = jQuery.now();
8502
8503 var rquery = (/\?/);
8504
8505
8506
8507 var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
8508
8509 jQuery.parseJSON = function( data ) {
8510 // Attempt to parse using the native JSON parser first
8511 if ( window.JSON && window.JSON.parse ) {
8512 // Support: Android 2.3
8513 // Workaround failure to string-cast null input
8514 return window.JSON.parse( data + "" );
8515 }
8516
8517 var requireNonComma,
8518 depth = null,
8519 str = jQuery.trim( data + "" );
8520
8521 // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
8522 // after removing valid tokens
8523 return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
8524
8525 // Force termination if we see a misplaced comma
8526 if ( requireNonComma && comma ) {
8527 depth = 0;
8528 }
8529
8530 // Perform no more replacements after returning to outermost depth
8531 if ( depth === 0 ) {
8532 return token;
8533 }
8534
8535 // Commas must not follow "[", "{", or ","
8536 requireNonComma = open || comma;
8537
8538 // Determine new depth
8539 // array/object open ("[" or "{"): depth += true - false (increment)
8540 // array/object close ("]" or "}"): depth += false - true (decrement)
8541 // other cases ("," or primitive): depth += true - true (numeric cast)
8542 depth += !close - !open;
8543
8544 // Remove this token
8545 return "";
8546 }) ) ?
8547 ( Function( "return " + str ) )() :
8548 jQuery.error( "Invalid JSON: " + data );
8549 };
8550
8551
8552 // Cross-browser xml parsing
8553 jQuery.parseXML = function( data ) {
8554 var xml, tmp;
8555 if ( !data || typeof data !== "string" ) {
8556 return null;
8557 }
8558 try {
8559 if ( window.DOMParser ) { // Standard
8560 tmp = new DOMParser();
8561 xml = tmp.parseFromString( data, "text/xml" );
8562 } else { // IE
8563 xml = new ActiveXObject( "Microsoft.XMLDOM" );
8564 xml.async = "false";
8565 xml.loadXML( data );
8566 }
8567 } catch( e ) {
8568 xml = undefined;
8569 }
8570 if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
8571 jQuery.error( "Invalid XML: " + data );
8572 }
8573 return xml;
8574 };
8575
8576
8577 var
8578 // Document location
8579 ajaxLocParts,
8580 ajaxLocation,
8581
8582 rhash = /#.*$/,
8583 rts = /([?&])_=[^&]*/,
8584 rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
8585 // #7653, #8125, #8152: local protocol detection
8586 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8587 rnoContent = /^(?:GET|HEAD)$/,
8588 rprotocol = /^\/\//,
8589 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
8590
8591 /* Prefilters
8592 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8593 * 2) These are called:
8594 * - BEFORE asking for a transport
8595 * - AFTER param serialization (s.data is a string if s.processData is true)
8596 * 3) key is the dataType
8597 * 4) the catchall symbol "*" can be used
8598 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8599 */
8600 prefilters = {},
8601
8602 /* Transports bindings
8603 * 1) key is the dataType
8604 * 2) the catchall symbol "*" can be used
8605 * 3) selection will start with transport dataType and THEN go to "*" if needed
8606 */
8607 transports = {},
8608
8609 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8610 allTypes = "*/".concat("*");
8611
8612 // #8138, IE may throw an exception when accessing
8613 // a field from window.location if document.domain has been set
8614 try {
8615 ajaxLocation = location.href;
8616 } catch( e ) {
8617 // Use the href attribute of an A element
8618 // since IE will modify it given document.location
8619 ajaxLocation = document.createElement( "a" );
8620 ajaxLocation.href = "";
8621 ajaxLocation = ajaxLocation.href;
8622 }
8623
8624 // Segment location into parts
8625 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
8626
8627 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8628 function addToPrefiltersOrTransports( structure ) {
8629
8630 // dataTypeExpression is optional and defaults to "*"
8631 return function( dataTypeExpression, func ) {
8632
8633 if ( typeof dataTypeExpression !== "string" ) {
8634 func = dataTypeExpression;
8635 dataTypeExpression = "*";
8636 }
8637
8638 var dataType,
8639 i = 0,
8640 dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
8641
8642 if ( jQuery.isFunction( func ) ) {
8643 // For each dataType in the dataTypeExpression
8644 while ( (dataType = dataTypes[i++]) ) {
8645 // Prepend if requested
8646 if ( dataType.charAt( 0 ) === "+" ) {
8647 dataType = dataType.slice( 1 ) || "*";
8648 (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
8649
8650 // Otherwise append
8651 } else {
8652 (structure[ dataType ] = structure[ dataType ] || []).push( func );
8653 }
8654 }
8655 }
8656 };
8657 }
8658
8659 // Base inspection function for prefilters and transports
8660 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8661
8662 var inspected = {},
8663 seekingTransport = ( structure === transports );
8664
8665 function inspect( dataType ) {
8666 var selected;
8667 inspected[ dataType ] = true;
8668 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8669 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8670 if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8671 options.dataTypes.unshift( dataTypeOrTransport );
8672 inspect( dataTypeOrTransport );
8673 return false;
8674 } else if ( seekingTransport ) {
8675 return !( selected = dataTypeOrTransport );
8676 }
8677 });
8678 return selected;
8679 }
8680
8681 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8682 }
8683
8684 // A special extend for ajax options
8685 // that takes "flat" options (not to be deep extended)
8686 // Fixes #9887
8687 function ajaxExtend( target, src ) {
8688 var deep, key,
8689 flatOptions = jQuery.ajaxSettings.flatOptions || {};
8690
8691 for ( key in src ) {
8692 if ( src[ key ] !== undefined ) {
8693 ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
8694 }
8695 }
8696 if ( deep ) {
8697 jQuery.extend( true, target, deep );
8698 }
8699
8700 return target;
8701 }
8702
8703 /* Handles responses to an ajax request:
8704 * - finds the right dataType (mediates between content-type and expected dataType)
8705 * - returns the corresponding response
8706 */
8707 function ajaxHandleResponses( s, jqXHR, responses ) {
8708 var firstDataType, ct, finalDataType, type,
8709 contents = s.contents,
8710 dataTypes = s.dataTypes;
8711
8712 // Remove auto dataType and get content-type in the process
8713 while ( dataTypes[ 0 ] === "*" ) {
8714 dataTypes.shift();
8715 if ( ct === undefined ) {
8716 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8717 }
8718 }
8719
8720 // Check if we're dealing with a known content-type
8721 if ( ct ) {
8722 for ( type in contents ) {
8723 if ( contents[ type ] && contents[ type ].test( ct ) ) {
8724 dataTypes.unshift( type );
8725 break;
8726 }
8727 }
8728 }
8729
8730 // Check to see if we have a response for the expected dataType
8731 if ( dataTypes[ 0 ] in responses ) {
8732 finalDataType = dataTypes[ 0 ];
8733 } else {
8734 // Try convertible dataTypes
8735 for ( type in responses ) {
8736 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8737 finalDataType = type;
8738 break;
8739 }
8740 if ( !firstDataType ) {
8741 firstDataType = type;
8742 }
8743 }
8744 // Or just use first one
8745 finalDataType = finalDataType || firstDataType;
8746 }
8747
8748 // If we found a dataType
8749 // We add the dataType to the list if needed
8750 // and return the corresponding response
8751 if ( finalDataType ) {
8752 if ( finalDataType !== dataTypes[ 0 ] ) {
8753 dataTypes.unshift( finalDataType );
8754 }
8755 return responses[ finalDataType ];
8756 }
8757 }
8758
8759 /* Chain conversions given the request and the original response
8760 * Also sets the responseXXX fields on the jqXHR instance
8761 */
8762 function ajaxConvert( s, response, jqXHR, isSuccess ) {
8763 var conv2, current, conv, tmp, prev,
8764 converters = {},
8765 // Work with a copy of dataTypes in case we need to modify it for conversion
8766 dataTypes = s.dataTypes.slice();
8767
8768 // Create converters map with lowercased keys
8769 if ( dataTypes[ 1 ] ) {
8770 for ( conv in s.converters ) {
8771 converters[ conv.toLowerCase() ] = s.converters[ conv ];
8772 }
8773 }
8774
8775 current = dataTypes.shift();
8776
8777 // Convert to each sequential dataType
8778 while ( current ) {
8779
8780 if ( s.responseFields[ current ] ) {
8781 jqXHR[ s.responseFields[ current ] ] = response;
8782 }
8783
8784 // Apply the dataFilter if provided
8785 if ( !prev && isSuccess && s.dataFilter ) {
8786 response = s.dataFilter( response, s.dataType );
8787 }
8788
8789 prev = current;
8790 current = dataTypes.shift();
8791
8792 if ( current ) {
8793
8794 // There's only work to do if current dataType is non-auto
8795 if ( current === "*" ) {
8796
8797 current = prev;
8798
8799 // Convert response if prev dataType is non-auto and differs from current
8800 } else if ( prev !== "*" && prev !== current ) {
8801
8802 // Seek a direct converter
8803 conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8804
8805 // If none found, seek a pair
8806 if ( !conv ) {
8807 for ( conv2 in converters ) {
8808
8809 // If conv2 outputs current
8810 tmp = conv2.split( " " );
8811 if ( tmp[ 1 ] === current ) {
8812
8813 // If prev can be converted to accepted input
8814 conv = converters[ prev + " " + tmp[ 0 ] ] ||
8815 converters[ "* " + tmp[ 0 ] ];
8816 if ( conv ) {
8817 // Condense equivalence converters
8818 if ( conv === true ) {
8819 conv = converters[ conv2 ];
8820
8821 // Otherwise, insert the intermediate dataType
8822 } else if ( converters[ conv2 ] !== true ) {
8823 current = tmp[ 0 ];
8824 dataTypes.unshift( tmp[ 1 ] );
8825 }
8826 break;
8827 }
8828 }
8829 }
8830 }
8831
8832 // Apply converter (if not an equivalence)
8833 if ( conv !== true ) {
8834
8835 // Unless errors are allowed to bubble, catch and return them
8836 if ( conv && s[ "throws" ] ) {
8837 response = conv( response );
8838 } else {
8839 try {
8840 response = conv( response );
8841 } catch ( e ) {
8842 return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8843 }
8844 }
8845 }
8846 }
8847 }
8848 }
8849
8850 return { state: "success", data: response };
8851 }
8852
8853 jQuery.extend({
8854
8855 // Counter for holding the number of active queries
8856 active: 0,
8857
8858 // Last-Modified header cache for next request
8859 lastModified: {},
8860 etag: {},
8861
8862 ajaxSettings: {
8863 url: ajaxLocation,
8864 type: "GET",
8865 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
8866 global: true,
8867 processData: true,
8868 async: true,
8869 contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8870 /*
8871 timeout: 0,
8872 data: null,
8873 dataType: null,
8874 username: null,
8875 password: null,
8876 cache: null,
8877 throws: false,
8878 traditional: false,
8879 headers: {},
8880 */
8881
8882 accepts: {
8883 "*": allTypes,
8884 text: "text/plain",
8885 html: "text/html",
8886 xml: "application/xml, text/xml",
8887 json: "application/json, text/javascript"
8888 },
8889
8890 contents: {
8891 xml: /xml/,
8892 html: /html/,
8893 json: /json/
8894 },
8895
8896 responseFields: {
8897 xml: "responseXML",
8898 text: "responseText",
8899 json: "responseJSON"
8900 },
8901
8902 // Data converters
8903 // Keys separate source (or catchall "*") and destination types with a single space
8904 converters: {
8905
8906 // Convert anything to text
8907 "* text": String,
8908
8909 // Text to html (true = no transformation)
8910 "text html": true,
8911
8912 // Evaluate text as a json expression
8913 "text json": jQuery.parseJSON,
8914
8915 // Parse text as xml
8916 "text xml": jQuery.parseXML
8917 },
8918
8919 // For options that shouldn't be deep extended:
8920 // you can add your own custom options here if
8921 // and when you create one that shouldn't be
8922 // deep extended (see ajaxExtend)
8923 flatOptions: {
8924 url: true,
8925 context: true
8926 }
8927 },
8928
8929 // Creates a full fledged settings object into target
8930 // with both ajaxSettings and settings fields.
8931 // If target is omitted, writes into ajaxSettings.
8932 ajaxSetup: function( target, settings ) {
8933 return settings ?
8934
8935 // Building a settings object
8936 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8937
8938 // Extending ajaxSettings
8939 ajaxExtend( jQuery.ajaxSettings, target );
8940 },
8941
8942 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8943 ajaxTransport: addToPrefiltersOrTransports( transports ),
8944
8945 // Main method
8946 ajax: function( url, options ) {
8947
8948 // If url is an object, simulate pre-1.5 signature
8949 if ( typeof url === "object" ) {
8950 options = url;
8951 url = undefined;
8952 }
8953
8954 // Force options to be an object
8955 options = options || {};
8956
8957 var // Cross-domain detection vars
8958 parts,
8959 // Loop variable
8960 i,
8961 // URL without anti-cache param
8962 cacheURL,
8963 // Response headers as string
8964 responseHeadersString,
8965 // timeout handle
8966 timeoutTimer,
8967
8968 // To know if global events are to be dispatched
8969 fireGlobals,
8970
8971 transport,
8972 // Response headers
8973 responseHeaders,
8974 // Create the final options object
8975 s = jQuery.ajaxSetup( {}, options ),
8976 // Callbacks context
8977 callbackContext = s.context || s,
8978 // Context for global events is callbackContext if it is a DOM node or jQuery collection
8979 globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
8980 jQuery( callbackContext ) :
8981 jQuery.event,
8982 // Deferreds
8983 deferred = jQuery.Deferred(),
8984 completeDeferred = jQuery.Callbacks("once memory"),
8985 // Status-dependent callbacks
8986 statusCode = s.statusCode || {},
8987 // Headers (they are sent all at once)
8988 requestHeaders = {},
8989 requestHeadersNames = {},
8990 // The jqXHR state
8991 state = 0,
8992 // Default abort message
8993 strAbort = "canceled",
8994 // Fake xhr
8995 jqXHR = {
8996 readyState: 0,
8997
8998 // Builds headers hashtable if needed
8999 getResponseHeader: function( key ) {
9000 var match;
9001 if ( state === 2 ) {
9002 if ( !responseHeaders ) {
9003 responseHeaders = {};
9004 while ( (match = rheaders.exec( responseHeadersString )) ) {
9005 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
9006 }
9007 }
9008 match = responseHeaders[ key.toLowerCase() ];
9009 }
9010 return match == null ? null : match;
9011 },
9012
9013 // Raw string
9014 getAllResponseHeaders: function() {
9015 return state === 2 ? responseHeadersString : null;
9016 },
9017
9018 // Caches the header
9019 setRequestHeader: function( name, value ) {
9020 var lname = name.toLowerCase();
9021 if ( !state ) {
9022 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
9023 requestHeaders[ name ] = value;
9024 }
9025 return this;
9026 },
9027
9028 // Overrides response content-type header
9029 overrideMimeType: function( type ) {
9030 if ( !state ) {
9031 s.mimeType = type;
9032 }
9033 return this;
9034 },
9035
9036 // Status-dependent callbacks
9037 statusCode: function( map ) {
9038 var code;
9039 if ( map ) {
9040 if ( state < 2 ) {
9041 for ( code in map ) {
9042 // Lazy-add the new callback in a way that preserves old ones
9043 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9044 }
9045 } else {
9046 // Execute the appropriate callbacks
9047 jqXHR.always( map[ jqXHR.status ] );
9048 }
9049 }
9050 return this;
9051 },
9052
9053 // Cancel the request
9054 abort: function( statusText ) {
9055 var finalText = statusText || strAbort;
9056 if ( transport ) {
9057 transport.abort( finalText );
9058 }
9059 done( 0, finalText );
9060 return this;
9061 }
9062 };
9063
9064 // Attach deferreds
9065 deferred.promise( jqXHR ).complete = completeDeferred.add;
9066 jqXHR.success = jqXHR.done;
9067 jqXHR.error = jqXHR.fail;
9068
9069 // Remove hash character (#7531: and string promotion)
9070 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9071 // Handle falsy url in the settings object (#10093: consistency with old signature)
9072 // We also use the url parameter if available
9073 s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
9074
9075 // Alias method option to type as per ticket #12004
9076 s.type = options.method || options.type || s.method || s.type;
9077
9078 // Extract dataTypes list
9079 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
9080
9081 // A cross-domain request is in order when we have a protocol:host:port mismatch
9082 if ( s.crossDomain == null ) {
9083 parts = rurl.exec( s.url.toLowerCase() );
9084 s.crossDomain = !!( parts &&
9085 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
9086 ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
9087 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
9088 );
9089 }
9090
9091 // Convert data if not already a string
9092 if ( s.data && s.processData && typeof s.data !== "string" ) {
9093 s.data = jQuery.param( s.data, s.traditional );
9094 }
9095
9096 // Apply prefilters
9097 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9098
9099 // If request was aborted inside a prefilter, stop there
9100 if ( state === 2 ) {
9101 return jqXHR;
9102 }
9103
9104 // We can fire global events as of now if asked to
9105 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9106 fireGlobals = jQuery.event && s.global;
9107
9108 // Watch for a new set of requests
9109 if ( fireGlobals && jQuery.active++ === 0 ) {
9110 jQuery.event.trigger("ajaxStart");
9111 }
9112
9113 // Uppercase the type
9114 s.type = s.type.toUpperCase();
9115
9116 // Determine if request has content
9117 s.hasContent = !rnoContent.test( s.type );
9118
9119 // Save the URL in case we're toying with the If-Modified-Since
9120 // and/or If-None-Match header later on
9121 cacheURL = s.url;
9122
9123 // More options handling for requests with no content
9124 if ( !s.hasContent ) {
9125
9126 // If data is available, append data to url
9127 if ( s.data ) {
9128 cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
9129 // #9682: remove data so that it's not used in an eventual retry
9130 delete s.data;
9131 }
9132
9133 // Add anti-cache in url if needed
9134 if ( s.cache === false ) {
9135 s.url = rts.test( cacheURL ) ?
9136
9137 // If there is already a '_' parameter, set its value
9138 cacheURL.replace( rts, "$1_=" + nonce++ ) :
9139
9140 // Otherwise add one to the end
9141 cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
9142 }
9143 }
9144
9145 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9146 if ( s.ifModified ) {
9147 if ( jQuery.lastModified[ cacheURL ] ) {
9148 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9149 }
9150 if ( jQuery.etag[ cacheURL ] ) {
9151 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9152 }
9153 }
9154
9155 // Set the correct header, if data is being sent
9156 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9157 jqXHR.setRequestHeader( "Content-Type", s.contentType );
9158 }
9159
9160 // Set the Accepts header for the server, depending on the dataType
9161 jqXHR.setRequestHeader(
9162 "Accept",
9163 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
9164 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9165 s.accepts[ "*" ]
9166 );
9167
9168 // Check for headers option
9169 for ( i in s.headers ) {
9170 jqXHR.setRequestHeader( i, s.headers[ i ] );
9171 }
9172
9173 // Allow custom headers/mimetypes and early abort
9174 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
9175 // Abort if not done already and return
9176 return jqXHR.abort();
9177 }
9178
9179 // aborting is no longer a cancellation
9180 strAbort = "abort";
9181
9182 // Install callbacks on deferreds
9183 for ( i in { success: 1, error: 1, complete: 1 } ) {
9184 jqXHR[ i ]( s[ i ] );
9185 }
9186
9187 // Get transport
9188 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9189
9190 // If no transport, we auto-abort
9191 if ( !transport ) {
9192 done( -1, "No Transport" );
9193 } else {
9194 jqXHR.readyState = 1;
9195
9196 // Send global event
9197 if ( fireGlobals ) {
9198 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9199 }
9200 // Timeout
9201 if ( s.async && s.timeout > 0 ) {
9202 timeoutTimer = setTimeout(function() {
9203 jqXHR.abort("timeout");
9204 }, s.timeout );
9205 }
9206
9207 try {
9208 state = 1;
9209 transport.send( requestHeaders, done );
9210 } catch ( e ) {
9211 // Propagate exception as error if not done
9212 if ( state < 2 ) {
9213 done( -1, e );
9214 // Simply rethrow otherwise
9215 } else {
9216 throw e;
9217 }
9218 }
9219 }
9220
9221 // Callback for when everything is done
9222 function done( status, nativeStatusText, responses, headers ) {
9223 var isSuccess, success, error, response, modified,
9224 statusText = nativeStatusText;
9225
9226 // Called once
9227 if ( state === 2 ) {
9228 return;
9229 }
9230
9231 // State is "done" now
9232 state = 2;
9233
9234 // Clear timeout if it exists
9235 if ( timeoutTimer ) {
9236 clearTimeout( timeoutTimer );
9237 }
9238
9239 // Dereference transport for early garbage collection
9240 // (no matter how long the jqXHR object will be used)
9241 transport = undefined;
9242
9243 // Cache response headers
9244 responseHeadersString = headers || "";
9245
9246 // Set readyState
9247 jqXHR.readyState = status > 0 ? 4 : 0;
9248
9249 // Determine if successful
9250 isSuccess = status >= 200 && status < 300 || status === 304;
9251
9252 // Get response data
9253 if ( responses ) {
9254 response = ajaxHandleResponses( s, jqXHR, responses );
9255 }
9256
9257 // Convert no matter what (that way responseXXX fields are always set)
9258 response = ajaxConvert( s, response, jqXHR, isSuccess );
9259
9260 // If successful, handle type chaining
9261 if ( isSuccess ) {
9262
9263 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9264 if ( s.ifModified ) {
9265 modified = jqXHR.getResponseHeader("Last-Modified");
9266 if ( modified ) {
9267 jQuery.lastModified[ cacheURL ] = modified;
9268 }
9269 modified = jqXHR.getResponseHeader("etag");
9270 if ( modified ) {
9271 jQuery.etag[ cacheURL ] = modified;
9272 }
9273 }
9274
9275 // if no content
9276 if ( status === 204 || s.type === "HEAD" ) {
9277 statusText = "nocontent";
9278
9279 // if not modified
9280 } else if ( status === 304 ) {
9281 statusText = "notmodified";
9282
9283 // If we have data, let's convert it
9284 } else {
9285 statusText = response.state;
9286 success = response.data;
9287 error = response.error;
9288 isSuccess = !error;
9289 }
9290 } else {
9291 // We extract error from statusText
9292 // then normalize statusText and status for non-aborts
9293 error = statusText;
9294 if ( status || !statusText ) {
9295 statusText = "error";
9296 if ( status < 0 ) {
9297 status = 0;
9298 }
9299 }
9300 }
9301
9302 // Set data for the fake xhr object
9303 jqXHR.status = status;
9304 jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9305
9306 // Success/Error
9307 if ( isSuccess ) {
9308 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9309 } else {
9310 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9311 }
9312
9313 // Status-dependent callbacks
9314 jqXHR.statusCode( statusCode );
9315 statusCode = undefined;
9316
9317 if ( fireGlobals ) {
9318 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9319 [ jqXHR, s, isSuccess ? success : error ] );
9320 }
9321
9322 // Complete
9323 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9324
9325 if ( fireGlobals ) {
9326 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9327 // Handle the global AJAX counter
9328 if ( !( --jQuery.active ) ) {
9329 jQuery.event.trigger("ajaxStop");
9330 }
9331 }
9332 }
9333
9334 return jqXHR;
9335 },
9336
9337 getJSON: function( url, data, callback ) {
9338 return jQuery.get( url, data, callback, "json" );
9339 },
9340
9341 getScript: function( url, callback ) {
9342 return jQuery.get( url, undefined, callback, "script" );
9343 }
9344 });
9345
9346 jQuery.each( [ "get", "post" ], function( i, method ) {
9347 jQuery[ method ] = function( url, data, callback, type ) {
9348 // shift arguments if data argument was omitted
9349 if ( jQuery.isFunction( data ) ) {
9350 type = type || callback;
9351 callback = data;
9352 data = undefined;
9353 }
9354
9355 return jQuery.ajax({
9356 url: url,
9357 type: method,
9358 dataType: type,
9359 data: data,
9360 success: callback
9361 });
9362 };
9363 });
9364
9365
9366 jQuery._evalUrl = function( url ) {
9367 return jQuery.ajax({
9368 url: url,
9369 type: "GET",
9370 dataType: "script",
9371 async: false,
9372 global: false,
9373 "throws": true
9374 });
9375 };
9376
9377
9378 jQuery.fn.extend({
9379 wrapAll: function( html ) {
9380 if ( jQuery.isFunction( html ) ) {
9381 return this.each(function(i) {
9382 jQuery(this).wrapAll( html.call(this, i) );
9383 });
9384 }
9385
9386 if ( this[0] ) {
9387 // The elements to wrap the target around
9388 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
9389
9390 if ( this[0].parentNode ) {
9391 wrap.insertBefore( this[0] );
9392 }
9393
9394 wrap.map(function() {
9395 var elem = this;
9396
9397 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
9398 elem = elem.firstChild;
9399 }
9400
9401 return elem;
9402 }).append( this );
9403 }
9404
9405 return this;
9406 },
9407
9408 wrapInner: function( html ) {
9409 if ( jQuery.isFunction( html ) ) {
9410 return this.each(function(i) {
9411 jQuery(this).wrapInner( html.call(this, i) );
9412 });
9413 }
9414
9415 return this.each(function() {
9416 var self = jQuery( this ),
9417 contents = self.contents();
9418
9419 if ( contents.length ) {
9420 contents.wrapAll( html );
9421
9422 } else {
9423 self.append( html );
9424 }
9425 });
9426 },
9427
9428 wrap: function( html ) {
9429 var isFunction = jQuery.isFunction( html );
9430
9431 return this.each(function(i) {
9432 jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
9433 });
9434 },
9435
9436 unwrap: function() {
9437 return this.parent().each(function() {
9438 if ( !jQuery.nodeName( this, "body" ) ) {
9439 jQuery( this ).replaceWith( this.childNodes );
9440 }
9441 }).end();
9442 }
9443 });
9444
9445
9446 jQuery.expr.filters.hidden = function( elem ) {
9447 // Support: Opera <= 12.12
9448 // Opera reports offsetWidths and offsetHeights less than zero on some elements
9449 return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
9450 (!support.reliableHiddenOffsets() &&
9451 ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
9452 };
9453
9454 jQuery.expr.filters.visible = function( elem ) {
9455 return !jQuery.expr.filters.hidden( elem );
9456 };
9457
9458
9459
9460
9461 var r20 = /%20/g,
9462 rbracket = /\[\]$/,
9463 rCRLF = /\r?\n/g,
9464 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
9465 rsubmittable = /^(?:input|select|textarea|keygen)/i;
9466
9467 function buildParams( prefix, obj, traditional, add ) {
9468 var name;
9469
9470 if ( jQuery.isArray( obj ) ) {
9471 // Serialize array item.
9472 jQuery.each( obj, function( i, v ) {
9473 if ( traditional || rbracket.test( prefix ) ) {
9474 // Treat each array item as a scalar.
9475 add( prefix, v );
9476
9477 } else {
9478 // Item is non-scalar (array or object), encode its numeric index.
9479 buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
9480 }
9481 });
9482
9483 } else if ( !traditional && jQuery.type( obj ) === "object" ) {
9484 // Serialize object item.
9485 for ( name in obj ) {
9486 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
9487 }
9488
9489 } else {
9490 // Serialize scalar item.
9491 add( prefix, obj );
9492 }
9493 }
9494
9495 // Serialize an array of form elements or a set of
9496 // key/values into a query string
9497 jQuery.param = function( a, traditional ) {
9498 var prefix,
9499 s = [],
9500 add = function( key, value ) {
9501 // If value is a function, invoke it and return its value
9502 value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
9503 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
9504 };
9505
9506 // Set traditional to true for jQuery <= 1.3.2 behavior.
9507 if ( traditional === undefined ) {
9508 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
9509 }
9510
9511 // If an array was passed in, assume that it is an array of form elements.
9512 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
9513 // Serialize the form elements
9514 jQuery.each( a, function() {
9515 add( this.name, this.value );
9516 });
9517
9518 } else {
9519 // If traditional, encode the "old" way (the way 1.3.2 or older
9520 // did it), otherwise encode params recursively.
9521 for ( prefix in a ) {
9522 buildParams( prefix, a[ prefix ], traditional, add );
9523 }
9524 }
9525
9526 // Return the resulting serialization
9527 return s.join( "&" ).replace( r20, "+" );
9528 };
9529
9530 jQuery.fn.extend({
9531 serialize: function() {
9532 return jQuery.param( this.serializeArray() );
9533 },
9534 serializeArray: function() {
9535 return this.map(function() {
9536 // Can add propHook for "elements" to filter or add form elements
9537 var elements = jQuery.prop( this, "elements" );
9538 return elements ? jQuery.makeArray( elements ) : this;
9539 })
9540 .filter(function() {
9541 var type = this.type;
9542 // Use .is(":disabled") so that fieldset[disabled] works
9543 return this.name && !jQuery( this ).is( ":disabled" ) &&
9544 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
9545 ( this.checked || !rcheckableType.test( type ) );
9546 })
9547 .map(function( i, elem ) {
9548 var val = jQuery( this ).val();
9549
9550 return val == null ?
9551 null :
9552 jQuery.isArray( val ) ?
9553 jQuery.map( val, function( val ) {
9554 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9555 }) :
9556 { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9557 }).get();
9558 }
9559 });
9560
9561
9562 // Create the request object
9563 // (This is still attached to ajaxSettings for backward compatibility)
9564 jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
9565 // Support: IE6+
9566 function() {
9567
9568 // XHR cannot access local files, always use ActiveX for that case
9569 return !this.isLocal &&
9570
9571 // Support: IE7-8
9572 // oldIE XHR does not support non-RFC2616 methods (#13240)
9573 // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
9574 // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
9575 // Although this check for six methods instead of eight
9576 // since IE also does not support "trace" and "connect"
9577 /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
9578
9579 createStandardXHR() || createActiveXHR();
9580 } :
9581 // For all other browsers, use the standard XMLHttpRequest object
9582 createStandardXHR;
9583
9584 var xhrId = 0,
9585 xhrCallbacks = {},
9586 xhrSupported = jQuery.ajaxSettings.xhr();
9587
9588 // Support: IE<10
9589 // Open requests must be manually aborted on unload (#5280)
9590 // See https://support.microsoft.com/kb/2856746 for more info
9591 if ( window.attachEvent ) {
9592 window.attachEvent( "onunload", function() {
9593 for ( var key in xhrCallbacks ) {
9594 xhrCallbacks[ key ]( undefined, true );
9595 }
9596 });
9597 }
9598
9599 // Determine support properties
9600 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9601 xhrSupported = support.ajax = !!xhrSupported;
9602
9603 // Create transport if the browser can provide an xhr
9604 if ( xhrSupported ) {
9605
9606 jQuery.ajaxTransport(function( options ) {
9607 // Cross domain only allowed if supported through XMLHttpRequest
9608 if ( !options.crossDomain || support.cors ) {
9609
9610 var callback;
9611
9612 return {
9613 send: function( headers, complete ) {
9614 var i,
9615 xhr = options.xhr(),
9616 id = ++xhrId;
9617
9618 // Open the socket
9619 xhr.open( options.type, options.url, options.async, options.username, options.password );
9620
9621 // Apply custom fields if provided
9622 if ( options.xhrFields ) {
9623 for ( i in options.xhrFields ) {
9624 xhr[ i ] = options.xhrFields[ i ];
9625 }
9626 }
9627
9628 // Override mime type if needed
9629 if ( options.mimeType && xhr.overrideMimeType ) {
9630 xhr.overrideMimeType( options.mimeType );
9631 }
9632
9633 // X-Requested-With header
9634 // For cross-domain requests, seeing as conditions for a preflight are
9635 // akin to a jigsaw puzzle, we simply never set it to be sure.
9636 // (it can always be set on a per-request basis or even using ajaxSetup)
9637 // For same-domain requests, won't change header if already provided.
9638 if ( !options.crossDomain && !headers["X-Requested-With"] ) {
9639 headers["X-Requested-With"] = "XMLHttpRequest";
9640 }
9641
9642 // Set headers
9643 for ( i in headers ) {
9644 // Support: IE<9
9645 // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
9646 // request header to a null-value.
9647 //
9648 // To keep consistent with other XHR implementations, cast the value
9649 // to string and ignore `undefined`.
9650 if ( headers[ i ] !== undefined ) {
9651 xhr.setRequestHeader( i, headers[ i ] + "" );
9652 }
9653 }
9654
9655 // Do send the request
9656 // This may raise an exception which is actually
9657 // handled in jQuery.ajax (so no try/catch here)
9658 xhr.send( ( options.hasContent && options.data ) || null );
9659
9660 // Listener
9661 callback = function( _, isAbort ) {
9662 var status, statusText, responses;
9663
9664 // Was never called and is aborted or complete
9665 if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
9666 // Clean up
9667 delete xhrCallbacks[ id ];
9668 callback = undefined;
9669 xhr.onreadystatechange = jQuery.noop;
9670
9671 // Abort manually if needed
9672 if ( isAbort ) {
9673 if ( xhr.readyState !== 4 ) {
9674 xhr.abort();
9675 }
9676 } else {
9677 responses = {};
9678 status = xhr.status;
9679
9680 // Support: IE<10
9681 // Accessing binary-data responseText throws an exception
9682 // (#11426)
9683 if ( typeof xhr.responseText === "string" ) {
9684 responses.text = xhr.responseText;
9685 }
9686
9687 // Firefox throws an exception when accessing
9688 // statusText for faulty cross-domain requests
9689 try {
9690 statusText = xhr.statusText;
9691 } catch( e ) {
9692 // We normalize with Webkit giving an empty statusText
9693 statusText = "";
9694 }
9695
9696 // Filter status for non standard behaviors
9697
9698 // If the request is local and we have data: assume a success
9699 // (success with no data won't get notified, that's the best we
9700 // can do given current implementations)
9701 if ( !status && options.isLocal && !options.crossDomain ) {
9702 status = responses.text ? 200 : 404;
9703 // IE - #1450: sometimes returns 1223 when it should be 204
9704 } else if ( status === 1223 ) {
9705 status = 204;
9706 }
9707 }
9708 }
9709
9710 // Call complete if needed
9711 if ( responses ) {
9712 complete( status, statusText, responses, xhr.getAllResponseHeaders() );
9713 }
9714 };
9715
9716 if ( !options.async ) {
9717 // if we're in sync mode we fire the callback
9718 callback();
9719 } else if ( xhr.readyState === 4 ) {
9720 // (IE6 & IE7) if it's in cache and has been
9721 // retrieved directly we need to fire the callback
9722 setTimeout( callback );
9723 } else {
9724 // Add to the list of active xhr callbacks
9725 xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
9726 }
9727 },
9728
9729 abort: function() {
9730 if ( callback ) {
9731 callback( undefined, true );
9732 }
9733 }
9734 };
9735 }
9736 });
9737 }
9738
9739 // Functions to create xhrs
9740 function createStandardXHR() {
9741 try {
9742 return new window.XMLHttpRequest();
9743 } catch( e ) {}
9744 }
9745
9746 function createActiveXHR() {
9747 try {
9748 return new window.ActiveXObject( "Microsoft.XMLHTTP" );
9749 } catch( e ) {}
9750 }
9751
9752
9753
9754
9755 // Install script dataType
9756 jQuery.ajaxSetup({
9757 accepts: {
9758 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
9759 },
9760 contents: {
9761 script: /(?:java|ecma)script/
9762 },
9763 converters: {
9764 "text script": function( text ) {
9765 jQuery.globalEval( text );
9766 return text;
9767 }
9768 }
9769 });
9770
9771 // Handle cache's special case and global
9772 jQuery.ajaxPrefilter( "script", function( s ) {
9773 if ( s.cache === undefined ) {
9774 s.cache = false;
9775 }
9776 if ( s.crossDomain ) {
9777 s.type = "GET";
9778 s.global = false;
9779 }
9780 });
9781
9782 // Bind script tag hack transport
9783 jQuery.ajaxTransport( "script", function(s) {
9784
9785 // This transport only deals with cross domain requests
9786 if ( s.crossDomain ) {
9787
9788 var script,
9789 head = document.head || jQuery("head")[0] || document.documentElement;
9790
9791 return {
9792
9793 send: function( _, callback ) {
9794
9795 script = document.createElement("script");
9796
9797 script.async = true;
9798
9799 if ( s.scriptCharset ) {
9800 script.charset = s.scriptCharset;
9801 }
9802
9803 script.src = s.url;
9804
9805 // Attach handlers for all browsers
9806 script.onload = script.onreadystatechange = function( _, isAbort ) {
9807
9808 if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
9809
9810 // Handle memory leak in IE
9811 script.onload = script.onreadystatechange = null;
9812
9813 // Remove the script
9814 if ( script.parentNode ) {
9815 script.parentNode.removeChild( script );
9816 }
9817
9818 // Dereference the script
9819 script = null;
9820
9821 // Callback if not abort
9822 if ( !isAbort ) {
9823 callback( 200, "success" );
9824 }
9825 }
9826 };
9827
9828 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
9829 // Use native DOM manipulation to avoid our domManip AJAX trickery
9830 head.insertBefore( script, head.firstChild );
9831 },
9832
9833 abort: function() {
9834 if ( script ) {
9835 script.onload( undefined, true );
9836 }
9837 }
9838 };
9839 }
9840 });
9841
9842
9843
9844
9845 var oldCallbacks = [],
9846 rjsonp = /(=)\?(?=&|$)|\?\?/;
9847
9848 // Default jsonp settings
9849 jQuery.ajaxSetup({
9850 jsonp: "callback",
9851 jsonpCallback: function() {
9852 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9853 this[ callback ] = true;
9854 return callback;
9855 }
9856 });
9857
9858 // Detect, normalize options and install callbacks for jsonp requests
9859 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9860
9861 var callbackName, overwritten, responseContainer,
9862 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9863 "url" :
9864 typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
9865 );
9866
9867 // Handle iff the expected data type is "jsonp" or we have a parameter to set
9868 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9869
9870 // Get callback name, remembering preexisting value associated with it
9871 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9872 s.jsonpCallback() :
9873 s.jsonpCallback;
9874
9875 // Insert callback into url or form data
9876 if ( jsonProp ) {
9877 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9878 } else if ( s.jsonp !== false ) {
9879 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9880 }
9881
9882 // Use data converter to retrieve json after script execution
9883 s.converters["script json"] = function() {
9884 if ( !responseContainer ) {
9885 jQuery.error( callbackName + " was not called" );
9886 }
9887 return responseContainer[ 0 ];
9888 };
9889
9890 // force json dataType
9891 s.dataTypes[ 0 ] = "json";
9892
9893 // Install callback
9894 overwritten = window[ callbackName ];
9895 window[ callbackName ] = function() {
9896 responseContainer = arguments;
9897 };
9898
9899 // Clean-up function (fires after converters)
9900 jqXHR.always(function() {
9901 // Restore preexisting value
9902 window[ callbackName ] = overwritten;
9903
9904 // Save back as free
9905 if ( s[ callbackName ] ) {
9906 // make sure that re-using the options doesn't screw things around
9907 s.jsonpCallback = originalSettings.jsonpCallback;
9908
9909 // save the callback name for future use
9910 oldCallbacks.push( callbackName );
9911 }
9912
9913 // Call if it was a function and we have a response
9914 if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9915 overwritten( responseContainer[ 0 ] );
9916 }
9917
9918 responseContainer = overwritten = undefined;
9919 });
9920
9921 // Delegate to script
9922 return "script";
9923 }
9924 });
9925
9926
9927
9928
9929 // data: string of html
9930 // context (optional): If specified, the fragment will be created in this context, defaults to document
9931 // keepScripts (optional): If true, will include scripts passed in the html string
9932 jQuery.parseHTML = function( data, context, keepScripts ) {
9933 if ( !data || typeof data !== "string" ) {
9934 return null;
9935 }
9936 if ( typeof context === "boolean" ) {
9937 keepScripts = context;
9938 context = false;
9939 }
9940 context = context || document;
9941
9942 var parsed = rsingleTag.exec( data ),
9943 scripts = !keepScripts && [];
9944
9945 // Single tag
9946 if ( parsed ) {
9947 return [ context.createElement( parsed[1] ) ];
9948 }
9949
9950 parsed = jQuery.buildFragment( [ data ], context, scripts );
9951
9952 if ( scripts && scripts.length ) {
9953 jQuery( scripts ).remove();
9954 }
9955
9956 return jQuery.merge( [], parsed.childNodes );
9957 };
9958
9959
9960 // Keep a copy of the old load method
9961 var _load = jQuery.fn.load;
9962
9963 /**
9964 * Load a url into a page
9965 */
9966 jQuery.fn.load = function( url, params, callback ) {
9967 if ( typeof url !== "string" && _load ) {
9968 return _load.apply( this, arguments );
9969 }
9970
9971 var selector, response, type,
9972 self = this,
9973 off = url.indexOf(" ");
9974
9975 if ( off >= 0 ) {
9976 selector = jQuery.trim( url.slice( off, url.length ) );
9977 url = url.slice( 0, off );
9978 }
9979
9980 // If it's a function
9981 if ( jQuery.isFunction( params ) ) {
9982
9983 // We assume that it's the callback
9984 callback = params;
9985 params = undefined;
9986
9987 // Otherwise, build a param string
9988 } else if ( params && typeof params === "object" ) {
9989 type = "POST";
9990 }
9991
9992 // If we have elements to modify, make the request
9993 if ( self.length > 0 ) {
9994 jQuery.ajax({
9995 url: url,
9996
9997 // if "type" variable is undefined, then "GET" method will be used
9998 type: type,
9999 dataType: "html",
10000 data: params
10001 }).done(function( responseText ) {
10002
10003 // Save response for use in complete callback
10004 response = arguments;
10005
10006 self.html( selector ?
10007
10008 // If a selector was specified, locate the right elements in a dummy div
10009 // Exclude scripts to avoid IE 'Permission Denied' errors
10010 jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
10011
10012 // Otherwise use the full result
10013 responseText );
10014
10015 }).complete( callback && function( jqXHR, status ) {
10016 self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
10017 });
10018 }
10019
10020 return this;
10021 };
10022
10023
10024
10025
10026 // Attach a bunch of functions for handling common AJAX events
10027 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
10028 jQuery.fn[ type ] = function( fn ) {
10029 return this.on( type, fn );
10030 };
10031 });
10032
10033
10034
10035
10036 jQuery.expr.filters.animated = function( elem ) {
10037 return jQuery.grep(jQuery.timers, function( fn ) {
10038 return elem === fn.elem;
10039 }).length;
10040 };
10041
10042
10043
10044
10045
10046 var docElem = window.document.documentElement;
10047
10048 /**
10049 * Gets a window from an element
10050 */
10051 function getWindow( elem ) {
10052 return jQuery.isWindow( elem ) ?
10053 elem :
10054 elem.nodeType === 9 ?
10055 elem.defaultView || elem.parentWindow :
10056 false;
10057 }
10058
10059 jQuery.offset = {
10060 setOffset: function( elem, options, i ) {
10061 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10062 position = jQuery.css( elem, "position" ),
10063 curElem = jQuery( elem ),
10064 props = {};
10065
10066 // set position first, in-case top/left are set even on static elem
10067 if ( position === "static" ) {
10068 elem.style.position = "relative";
10069 }
10070
10071 curOffset = curElem.offset();
10072 curCSSTop = jQuery.css( elem, "top" );
10073 curCSSLeft = jQuery.css( elem, "left" );
10074 calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10075 jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
10076
10077 // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
10078 if ( calculatePosition ) {
10079 curPosition = curElem.position();
10080 curTop = curPosition.top;
10081 curLeft = curPosition.left;
10082 } else {
10083 curTop = parseFloat( curCSSTop ) || 0;
10084 curLeft = parseFloat( curCSSLeft ) || 0;
10085 }
10086
10087 if ( jQuery.isFunction( options ) ) {
10088 options = options.call( elem, i, curOffset );
10089 }
10090
10091 if ( options.top != null ) {
10092 props.top = ( options.top - curOffset.top ) + curTop;
10093 }
10094 if ( options.left != null ) {
10095 props.left = ( options.left - curOffset.left ) + curLeft;
10096 }
10097
10098 if ( "using" in options ) {
10099 options.using.call( elem, props );
10100 } else {
10101 curElem.css( props );
10102 }
10103 }
10104 };
10105
10106 jQuery.fn.extend({
10107 offset: function( options ) {
10108 if ( arguments.length ) {
10109 return options === undefined ?
10110 this :
10111 this.each(function( i ) {
10112 jQuery.offset.setOffset( this, options, i );
10113 });
10114 }
10115
10116 var docElem, win,
10117 box = { top: 0, left: 0 },
10118 elem = this[ 0 ],
10119 doc = elem && elem.ownerDocument;
10120
10121 if ( !doc ) {
10122 return;
10123 }
10124
10125 docElem = doc.documentElement;
10126
10127 // Make sure it's not a disconnected DOM node
10128 if ( !jQuery.contains( docElem, elem ) ) {
10129 return box;
10130 }
10131
10132 // If we don't have gBCR, just use 0,0 rather than error
10133 // BlackBerry 5, iOS 3 (original iPhone)
10134 if ( typeof elem.getBoundingClientRect !== strundefined ) {
10135 box = elem.getBoundingClientRect();
10136 }
10137 win = getWindow( doc );
10138 return {
10139 top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
10140 left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
10141 };
10142 },
10143
10144 position: function() {
10145 if ( !this[ 0 ] ) {
10146 return;
10147 }
10148
10149 var offsetParent, offset,
10150 parentOffset = { top: 0, left: 0 },
10151 elem = this[ 0 ];
10152
10153 // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
10154 if ( jQuery.css( elem, "position" ) === "fixed" ) {
10155 // we assume that getBoundingClientRect is available when computed position is fixed
10156 offset = elem.getBoundingClientRect();
10157 } else {
10158 // Get *real* offsetParent
10159 offsetParent = this.offsetParent();
10160
10161 // Get correct offsets
10162 offset = this.offset();
10163 if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
10164 parentOffset = offsetParent.offset();
10165 }
10166
10167 // Add offsetParent borders
10168 parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
10169 parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
10170 }
10171
10172 // Subtract parent offsets and element margins
10173 // note: when an element has margin: auto the offsetLeft and marginLeft
10174 // are the same in Safari causing offset.left to incorrectly be 0
10175 return {
10176 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10177 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
10178 };
10179 },
10180
10181 offsetParent: function() {
10182 return this.map(function() {
10183 var offsetParent = this.offsetParent || docElem;
10184
10185 while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
10186 offsetParent = offsetParent.offsetParent;
10187 }
10188 return offsetParent || docElem;
10189 });
10190 }
10191 });
10192
10193 // Create scrollLeft and scrollTop methods
10194 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10195 var top = /Y/.test( prop );
10196
10197 jQuery.fn[ method ] = function( val ) {
10198 return access( this, function( elem, method, val ) {
10199 var win = getWindow( elem );
10200
10201 if ( val === undefined ) {
10202 return win ? (prop in win) ? win[ prop ] :
10203 win.document.documentElement[ method ] :
10204 elem[ method ];
10205 }
10206
10207 if ( win ) {
10208 win.scrollTo(
10209 !top ? val : jQuery( win ).scrollLeft(),
10210 top ? val : jQuery( win ).scrollTop()
10211 );
10212
10213 } else {
10214 elem[ method ] = val;
10215 }
10216 }, method, val, arguments.length, null );
10217 };
10218 });
10219
10220 // Add the top/left cssHooks using jQuery.fn.position
10221 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10222 // getComputedStyle returns percent when specified for top/left/bottom/right
10223 // rather than make the css module depend on the offset module, we just check for it here
10224 jQuery.each( [ "top", "left" ], function( i, prop ) {
10225 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10226 function( elem, computed ) {
10227 if ( computed ) {
10228 computed = curCSS( elem, prop );
10229 // if curCSS returns percentage, fallback to offset
10230 return rnumnonpx.test( computed ) ?
10231 jQuery( elem ).position()[ prop ] + "px" :
10232 computed;
10233 }
10234 }
10235 );
10236 });
10237
10238
10239 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10240 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10241 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
10242 // margin is only for outerHeight, outerWidth
10243 jQuery.fn[ funcName ] = function( margin, value ) {
10244 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10245 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10246
10247 return access( this, function( elem, type, value ) {
10248 var doc;
10249
10250 if ( jQuery.isWindow( elem ) ) {
10251 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10252 // isn't a whole lot we can do. See pull request at this URL for discussion:
10253 // https://github.com/jquery/jquery/pull/764
10254 return elem.document.documentElement[ "client" + name ];
10255 }
10256
10257 // Get document width or height
10258 if ( elem.nodeType === 9 ) {
10259 doc = elem.documentElement;
10260
10261 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
10262 // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
10263 return Math.max(
10264 elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10265 elem.body[ "offset" + name ], doc[ "offset" + name ],
10266 doc[ "client" + name ]
10267 );
10268 }
10269
10270 return value === undefined ?
10271 // Get width or height on the element, requesting but not forcing parseFloat
10272 jQuery.css( elem, type, extra ) :
10273
10274 // Set width or height on the element
10275 jQuery.style( elem, type, value, extra );
10276 }, type, chainable ? margin : undefined, chainable, null );
10277 };
10278 });
10279 });
10280
10281
10282 // The number of elements contained in the matched element set
10283 jQuery.fn.size = function() {
10284 return this.length;
10285 };
10286
10287 jQuery.fn.andSelf = jQuery.fn.addBack;
10288
10289
10290
10291
10292 // Register as a named AMD module, since jQuery can be concatenated with other
10293 // files that may use define, but not via a proper concatenation script that
10294 // understands anonymous AMD modules. A named AMD is safest and most robust
10295 // way to register. Lowercase jquery is used because AMD module names are
10296 // derived from file names, and jQuery is normally delivered in a lowercase
10297 // file name. Do this after creating the global so that if an AMD module wants
10298 // to call noConflict to hide this version of jQuery, it will work.
10299
10300 // Note that for maximum portability, libraries that are not jQuery should
10301 // declare themselves as anonymous modules, and avoid setting a global if an
10302 // AMD loader is present. jQuery is a special case. For more information, see
10303 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10304
10305 if ( typeof define === "function" && define.amd ) {
10306 define( "jquery", [], function() {
10307 return jQuery;
10308 });
10309 }
10310
10311
10312
10313
10314 var
10315 // Map over jQuery in case of overwrite
10316 _jQuery = window.jQuery,
10317
10318 // Map over the $ in case of overwrite
10319 _$ = window.$;
10320
10321 jQuery.noConflict = function( deep ) {
10322 if ( window.$ === jQuery ) {
10323 window.$ = _$;
10324 }
10325
10326 if ( deep && window.jQuery === jQuery ) {
10327 window.jQuery = _jQuery;
10328 }
10329
10330 return jQuery;
10331 };
10332
10333 // Expose jQuery and $ identifiers, even in
10334 // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10335 // and CommonJS for browser emulators (#13566)
10336 if ( typeof noGlobal === strundefined ) {
10337 window.jQuery = window.$ = jQuery;
10338 }
10339
10340
10341
10342
10343 return jQuery;
10344
10345 }));
0 /*jslint node: true */
1 /*global ZeroClipboard */
2
3 (function(window, angular, undefined) {
4 'use strict';
5
6 angular.module('ngClipboard', []).
7 provider('ngClip', function() {
8 var self = this;
9 this.path = '//cdnjs.cloudflare.com/ajax/libs/zeroclipboard/2.1.6/ZeroClipboard.swf';
10 return {
11 setPath: function(newPath) {
12 self.path = newPath;
13 },
14 setConfig: function(config) {
15 self.config = config;
16 },
17 $get: function() {
18 return {
19 path: self.path,
20 config: self.config
21 };
22 }
23 };
24 }).
25 run(['ngClip', function(ngClip) {
26 var config = {
27 swfPath: ngClip.path,
28 trustedDomains: ["*"],
29 allowScriptAccess: "always",
30 forceHandCursor: true,
31 };
32 ZeroClipboard.config(angular.extend(config,ngClip.config || {}));
33 }]).
34 directive('clipCopy', ['ngClip', function (ngClip) {
35 return {
36 scope: {
37 clipCopy: '&',
38 clipClick: '&',
39 clipClickFallback: '&'
40 },
41 restrict: 'A',
42 link: function (scope, element, attrs) {
43 // Bind a fallback function if flash is unavailable
44 if (ZeroClipboard.isFlashUnusable()) {
45 element.bind('click', function($event) {
46 // Execute the expression with local variables `$event` and `copy`
47 scope.$apply(scope.clipClickFallback({
48 $event: $event,
49 copy: scope.$eval(scope.clipCopy)
50 }));
51 });
52
53 return;
54 }
55
56 // Create the client object
57 var client = new ZeroClipboard(element);
58 if (attrs.clipCopy === "") {
59 scope.clipCopy = function(scope) {
60 return element[0].previousElementSibling.innerText;
61 };
62 }
63 client.on( 'ready', function(readyEvent) {
64
65 client.on('copy', function (event) {
66 var clipboard = event.clipboardData;
67 clipboard.setData(attrs.clipCopyMimeType || 'text/plain', scope.$eval(scope.clipCopy));
68 });
69
70 client.on( 'aftercopy', function(event) {
71 if (angular.isDefined(attrs.clipClick)) {
72 scope.$apply(scope.clipClick);
73 }
74 });
75
76 scope.$on('$destroy', function() {
77 client.destroy();
78 });
79 });
80 }
81 };
82 }]);
83 })(window, window.angular);
0 // Faraday Penetration Test IDE - Community Version
0 // Faraday Penetration Test IDE
11 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
22 // See the file 'doc/LICENSE' for the license information
33
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 'use strict';
15
26 $.ajaxSetup({
37 async: false
48 });
59
6 var faradayApp = angular.module('faradayApp', ['ngRoute', 'selectionModel', 'ui.bootstrap'])
10 var faradayApp = angular.module('faradayApp', ['ngRoute', 'selectionModel', 'ui.bootstrap', 'angularFileUpload', 'filter', 'ngClipboard', 'ngCookies'])
711 .constant("BASEURL", (function() {
812 var url = window.location.origin + "/";
913 return url;
14 })())
15 .constant("EASEOFRESOLUTION", (function() {
16 var resolutions = [
17 "trivial",
18 "simple",
19 "moderate",
20 "difficult",
21 "infeasible"
22 ];
23 return resolutions;
24 })())
25 .constant("SEVERITIES", (function() {
26 var severities = [
27 "unclassified",
28 "info",
29 "low",
30 "med",
31 "high",
32 "critical"
33 ];
34 return severities;
1035 })());
1136
1237 faradayApp.config(['$routeProvider', function($routeProvider) {
1338 $routeProvider.
39 when('/dashboard/ws/:wsId', {
40 templateUrl: 'scripts/dashboard/partials/dashboard.html',
41 controller: 'dashboardCtrl',
42 title: 'Dashboard | '
43 }).
44 when('/dashboard', {
45 templateUrl: 'scripts/partials/workspaces.html',
46 controller: 'workspacesCtrl',
47 title: 'Dashboard | '
48 }).
1449 when('/status/ws/:wsId', {
1550 templateUrl: 'scripts/partials/status_report.html',
16 controller: 'statusReportCtrl'
51 controller: 'statusReportCtrl',
52 title: 'Status Report | '
53 }).
54 when('/workspaces', {
55 templateUrl: 'scripts/workspaces/partials/list.html',
56 controller: 'workspacesCtrl',
57 title: 'Workspaces | '
1758 }).
1859 when('/status', {
1960 templateUrl: 'scripts/partials/workspaces.html',
20 controller: 'workspacesCtrl'
61 controller: 'workspacesCtrl',
62 title: 'Status Report | '
2163 }).
2264 otherwise({
2365 templateUrl: 'scripts/partials/home.html',
2466 controller: 'statusReportCtrl'
2567 });
2668 }]);
69
70 faradayApp.run(['$location', '$rootScope', function($location, $rootScope) {
71 $rootScope.$on('$routeChangeSuccess', function(event, current, previous) {
72 if(current.hasOwnProperty('$$route')) {
73 $rootScope.title = current.$$route.title;
74 }
75 });
76 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .factory('attachmentsFact', ['BASEURL', '$http', '$q', function(BASEURL, $http, $q) {
6 var attachmentsFact = {};
7
8 // receives an array of File objects
9 // returns an array of promises
10 attachmentsFact.loadAttachments = function(files) {
11 var deferred = $q.defer(),
12 promises = [],
13 tmp = {};
14 files.forEach(function(file) {
15 promises.push(attachmentsFact.loadAttachment(file));
16 });
17 $q.all(promises).then(function(attachments) {
18 attachments.forEach(function(attachment) {
19 tmp[attachment.filename] = attachment.value;
20 });
21 deferred.resolve(tmp);
22 });
23
24 return deferred.promise;
25 };
26
27 // receives a File object
28 // returns a promise
29 attachmentsFact.loadAttachment = function(file) {
30 var deferred = $q.defer(),
31 filename = encodeURIComponent(file.name),
32 filetype = file.type.replace("/", "\/"),
33 fileReader = new FileReader();
34 fileReader.readAsDataURL(file);
35 fileReader.onloadend = function (readerEvent) {
36 result = readerEvent.target.result;
37 result = result.slice(result.indexOf(',')+1);
38 deferred.resolve({"filename": filename, "value": {"content_type": filetype, "data": result}});
39 };
40
41 return deferred.promise;
42 };
43
44 attachmentsFact.getStubs = function(ws, vid, names) {
45 var url = BASEURL + ws + "/" + vid,
46 stubs = {},
47 deferred = $q.defer();
48
49 $http.get(url).success(function(result) {
50 for(var attachment in result._attachments) {
51 if(names.indexOf(attachment) >= 0) {
52 stubs[attachment] = result._attachments[attachment];
53 }
54 }
55 deferred.resolve(stubs);
56 });
57
58 return deferred.promise;
59 };
60
61 return attachmentsFact;
62 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 //Filter to order by field, when you have and object
5 angular.module('faradayApp')
6 .filter('orderObjectBy', ['SEVERITIES',
7 function(SEVERITIES) {
8 return function(items, field, reverse) {
9 var filtered = [];
10 angular.forEach(items, function(item) {
11 filtered.push(item);
12 });
13 filtered.sort(compareItems(field));
14 if(reverse) filtered.reverse();
15 return filtered;
16 };
17
18 function compareItems(field) {
19 return function(a, b) {
20 var res;
21 a = a[field];
22 b = b[field];
23 if(typeof(a) == "string" && typeof(b) == "string") {
24 a = a.toLowerCase();
25 b = b.toLowerCase();
26 }
27 res = (a > b || typeof(b) == "undefined" ? 1 : -1);
28 if(field == 'impact'){
29 res = compareImpact(a, b);
30 }
31 if(field == 'severity') {
32 res = compareSeverities(a, b);
33 }
34 return res;
35 }
36 }
37
38 function compareImpact(a, b) {
39 var contA = 0, contB = 0;
40 for(key in a){
41 if(a.hasOwnProperty(key)){
42 if(a[key]){
43 contA = contA + 1;
44 }
45 }
46 }
47 for(key in b){
48 if(b.hasOwnProperty(key)){
49 if(b[key]){
50 contB = contB + 1;
51 }
52 }
53 }
54 return (contA > contB ? 1 : -1);
55 }
56
57 function compareSeverities(a, b) {
58 var res = 1;
59 if(SEVERITIES.indexOf(a) > SEVERITIES.indexOf(b)) {
60 res = -1;
61 }
62 return res;
63 }
64 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .factory('commonsFact', function() {
6 var commonsFact = {};
7
8 // receives a dictionary of files whose keys are names
9 // returns a dictionary whose keys are names and values are strings - the names of the icons
10 commonsFact.loadIcons = function(files) {
11 var icons = {},
12 type = "";
13
14 for(var name in files) {
15 // first lets load the type prop
16 if(files[name].hasOwnProperty("type")) {
17 type = files[name].type.toLowerCase();
18 } else {
19 type = name.slice(-3);
20 }
21 if(type == "application/pdf" || type == "pdf") {
22 icons[name] = "fa-file-pdf-o";
23 } else if(type.split("/")[0] == "image" || type == "jpg" || type == "peg" || type == "png") {
24 icons[name] = "fa-file-image-o";
25 } else if(type == "application/msword" || type == "text/plain" || type == "txt" || type == "doc") {
26 icons[name] = "fa-file-text-o";
27 } else {
28 icons[name] = "fa-file-o";
29 }
30 };
31
32 return icons;
33 };
34
35 commonsFact.arrayToObject = function(array){
36 var refArray = [];
37 if (array != undefined){
38 array.forEach(function(r){
39 refArray.push({ref:r});
40 });
41 }
42 return refArray;
43 }
44
45 commonsFact.objectToArray = function(object){
46 var res = {};
47 var arrayReferences = [];
48 object.forEach(function(r){
49 arrayReferences.push(r.ref);
50 });
51 arrayReferences = arrayReferences.filter(Boolean);
52 return arrayReferences;
53 }
54
55 commonsFact.htmlentities = function(string, quote_style, charset, double_encode) {
56 var hash_map = commonsFact.translationtable('HTML_ENTITIES', quote_style), symbol = '';
57 string = string == null ? '' : string + '';
58
59 if (!hash_map) {
60 return false;
61 }
62
63 if (quote_style && quote_style === 'ENT_QUOTES') {
64 hash_map["'"] = '&#039;';
65 }
66
67 if ( !! double_encode || double_encode == null) {
68 for (symbol in hash_map) {
69 if (hash_map.hasOwnProperty(symbol)) {
70 string = string.split(symbol)
71 .join(hash_map[symbol]);
72 }
73 }
74 } else {
75 string = string.replace(/([\s\S]*?)(&(?:#\d+|#x[\da-f]+|[a-zA-Z][\da-z]*);|$)/g, function (ignore, text, entity) {
76 for (symbol in hash_map) {
77 if (hash_map.hasOwnProperty(symbol)) {
78 text = text.split(symbol)
79 .join(hash_map[symbol]);
80 }
81 }
82 return text + entity;
83 });
84 }
85 return string;
86 };
87
88 commonsFact.translationtable = function(table, quote_style) {
89 var entities = {},
90 hash_map = {},
91 decimal;
92 var constMappingTable = {},
93 constMappingQuoteStyle = {};
94 var useTable = {},
95 useQuoteStyle = {};
96
97 // Translate arguments
98 constMappingTable[0] = 'HTML_SPECIALCHARS';
99 constMappingTable[1] = 'HTML_ENTITIES';
100 constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
101 constMappingQuoteStyle[2] = 'ENT_COMPAT';
102 constMappingQuoteStyle[3] = 'ENT_QUOTES';
103
104 useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
105 useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() :
106 'ENT_COMPAT';
107
108 if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
109 throw new Error('Table: ' + useTable + ' not supported');
110 }
111
112 entities['38'] = '&amp;';
113 if (useTable === 'HTML_ENTITIES') {
114 entities['160'] = '&nbsp;';
115 entities['161'] = '&iexcl;';
116 entities['162'] = '&cent;';
117 entities['163'] = '&pound;';
118 entities['164'] = '&curren;';
119 entities['165'] = '&yen;';
120 entities['166'] = '&brvbar;';
121 entities['167'] = '&sect;';
122 entities['168'] = '&uml;';
123 entities['169'] = '&copy;';
124 entities['170'] = '&ordf;';
125 entities['171'] = '&laquo;';
126 entities['172'] = '&not;';
127 entities['173'] = '&shy;';
128 entities['174'] = '&reg;';
129 entities['175'] = '&macr;';
130 entities['176'] = '&deg;';
131 entities['177'] = '&plusmn;';
132 entities['178'] = '&sup2;';
133 entities['179'] = '&sup3;';
134 entities['180'] = '&acute;';
135 entities['181'] = '&micro;';
136 entities['182'] = '&para;';
137 entities['183'] = '&middot;';
138 entities['184'] = '&cedil;';
139 entities['185'] = '&sup1;';
140 entities['186'] = '&ordm;';
141 entities['187'] = '&raquo;';
142 entities['188'] = '&frac14;';
143 entities['189'] = '&frac12;';
144 entities['190'] = '&frac34;';
145 entities['191'] = '&iquest;';
146 entities['192'] = '&Agrave;';
147 entities['193'] = '&Aacute;';
148 entities['194'] = '&Acirc;';
149 entities['195'] = '&Atilde;';
150 entities['196'] = '&Auml;';
151 entities['197'] = '&Aring;';
152 entities['198'] = '&AElig;';
153 entities['199'] = '&Ccedil;';
154 entities['200'] = '&Egrave;';
155 entities['201'] = '&Eacute;';
156 entities['202'] = '&Ecirc;';
157 entities['203'] = '&Euml;';
158 entities['204'] = '&Igrave;';
159 entities['205'] = '&Iacute;';
160 entities['206'] = '&Icirc;';
161 entities['207'] = '&Iuml;';
162 entities['208'] = '&ETH;';
163 entities['209'] = '&Ntilde;';
164 entities['210'] = '&Ograve;';
165 entities['211'] = '&Oacute;';
166 entities['212'] = '&Ocirc;';
167 entities['213'] = '&Otilde;';
168 entities['214'] = '&Ouml;';
169 entities['215'] = '&times;';
170 entities['216'] = '&Oslash;';
171 entities['217'] = '&Ugrave;';
172 entities['218'] = '&Uacute;';
173 entities['219'] = '&Ucirc;';
174 entities['220'] = '&Uuml;';
175 entities['221'] = '&Yacute;';
176 entities['222'] = '&THORN;';
177 entities['223'] = '&szlig;';
178 entities['224'] = '&agrave;';
179 entities['225'] = '&aacute;';
180 entities['226'] = '&acirc;';
181 entities['227'] = '&atilde;';
182 entities['228'] = '&auml;';
183 entities['229'] = '&aring;';
184 entities['230'] = '&aelig;';
185 entities['231'] = '&ccedil;';
186 entities['232'] = '&egrave;';
187 entities['233'] = '&eacute;';
188 entities['234'] = '&ecirc;';
189 entities['235'] = '&euml;';
190 entities['236'] = '&igrave;';
191 entities['237'] = '&iacute;';
192 entities['238'] = '&icirc;';
193 entities['239'] = '&iuml;';
194 entities['240'] = '&eth;';
195 entities['241'] = '&ntilde;';
196 entities['242'] = '&ograve;';
197 entities['243'] = '&oacute;';
198 entities['244'] = '&ocirc;';
199 entities['245'] = '&otilde;';
200 entities['246'] = '&ouml;';
201 entities['247'] = '&divide;';
202 entities['248'] = '&oslash;';
203 entities['249'] = '&ugrave;';
204 entities['250'] = '&uacute;';
205 entities['251'] = '&ucirc;';
206 entities['252'] = '&uuml;';
207 entities['253'] = '&yacute;';
208 entities['254'] = '&thorn;';
209 entities['255'] = '&yuml;';
210 }
211
212 if (useQuoteStyle !== 'ENT_NOQUOTES') {
213 entities['34'] = '&quot;';
214 }
215 if (useQuoteStyle === 'ENT_QUOTES') {
216 entities['39'] = '&#39;';
217 }
218 entities['60'] = '&lt;';
219 entities['62'] = '&gt;';
220
221 // ascii decimals to real symbols
222 for (decimal in entities) {
223 if (entities.hasOwnProperty(decimal)) {
224 hash_map[String.fromCharCode(decimal)] = entities[decimal];
225 }
226 }
227
228 return hash_map;
229 }
230
231 return commonsFact;
232 });
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .directive('d3Bars', ['d3Service', '$routeParams',
6 function(d3Service, $routeParams) {
7 return {
8 restrict: 'EA',
9 scope: {
10 data: '='
11 },
12 link: function(scope, ele, attrs) {
13 d3Service.d3().then(function(d3) {
14
15 var margin = {
16 "top": parseInt(attrs.marginTop) || 20,
17 "right": parseInt(attrs.marginRight) || 20,
18 "bottom": parseInt(attrs.marginBottom) || 30,
19 "left": parseInt(attrs.marginLeft) || 40
20 }
21
22 var barHeight = parseInt(attrs.barHeight) || 20,
23 barPadding = parseInt(attrs.barPadding) || 5,
24 width = parseInt(attrs.svgWitdh) || 160,
25 height = parseInt(attrs.svgHeight) || 149;
26
27 scope.$watch('data', function(newData) {
28 scope.render(newData);
29 }, true);
30
31 scope.render = function(data) {
32
33 // remove existing treemap container, if any
34 d3.select("#bar_container").remove();
35
36 if (!data || data.length == 0) return;
37
38 var svg = d3.select(ele[0])
39 .append("div")
40 .attr("class", "box")
41 .attr("id", "bar_container")
42 .append("svg")
43 .attr("width", width)
44 .attr("height", height)
45 .append("g")
46 .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
47
48 var color = d3.scale.category20b();
49 var x = d3.scale.ordinal()
50 .rangeRoundBands([0, width - margin.left - margin.right], .1);
51
52 var y = d3.scale.linear()
53 .range([height - margin.top - margin.bottom, 0]);
54
55 var xAxis = d3.svg.axis()
56 .scale(x)
57 .orient("bottom");
58 var yAxis = d3.svg.axis()
59 .scale(y)
60 .orient("left")
61 .ticks(5);
62
63 x.domain(data.map(function(d) { return d.key; }));
64 y.domain([0, d3.max(data, function(d) { return d.value; })]);
65
66 svg.selectAll('.bar')
67 .data(data)
68 .enter()
69 .append('rect')
70 .attr("class", "bar")
71 .attr("x", function(d) { return x(d.key); })
72 .attr("y", function(d) { return y(d.value - 0.5); })
73 .style("fill", function(d) { return color(Math.random()*55); })
74 .attr("height", function(d) { return height - margin.top - margin.bottom - y(d.value); })
75 .attr("width", 30)
76 .style('opacity', 0)
77 .on('mouseover', function(d){
78 workspace = $routeParams.wsId;
79 var hurl = "/" + workspace + "/_design/hosts/_view/hosts";
80 hosts = get_obj(hurl);
81 var name = hosts[d.key].name;
82 document.getElementById("barText").innerHTML = "<div style='background-color:" + d.color + "'><b>" + name + '</b></div>' + d.value;
83
84 })
85 .on('mouseleave', function(){
86 document.getElementById("barText").innerHTML = "";
87 })
88 .transition()
89 .duration(1250)
90 .style('opacity', 1);
91
92 function get_obj(ourl) {
93 var ls = {};
94 $.ajax({
95 dataType: "json",
96 url: ourl,
97 async: false,
98 success: function(data) {
99 $.each(data.rows, function(n, obj){
100 ls[obj.key] = obj.value;
101 });
102 }
103 });
104 return ls;
105 }
106 };
107 });
108 }}
109 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .directive('d3Cake', ['d3Service',
6 function(d3Service) {
7 return {
8 restrict: 'EA',
9 scope: {
10 data: '='
11 },
12 link: function(scope, ele, attrs) {
13 d3Service.d3().then(function(d3) {
14
15 var margin = {
16 "top": parseInt(attrs.marginTop) || 28,
17 "right": parseInt(attrs.marginRight) || 10,
18 "bottom": parseInt(attrs.marginBottom) || 10,
19 "left": parseInt(attrs.marginLeft) || 10
20 }
21
22 var width = parseInt(attrs.cakeWitdh) || 160,
23 height = parseInt(attrs.cakeHeight) || 149,
24 radius = parseInt(attrs.cakeRadius) || Math.min(width, height) / 2;
25
26 // Breadcrumb dimensions: width, height, spacing, width of tip/tail.
27 var b = {
28 w: 75, h: 30, s: 3, t: 10
29 };
30
31 scope.$watch('data', function(newData) {
32 scope.render(newData);
33 }, true);
34
35 scope.render = function(data) {
36
37 // remove existing treemap container, if any
38 d3.select("#chart").remove();
39 d3.select("#sequence").remove();
40
41 if (!data || data.length == 0) return;
42
43 // we need to make a copy of the data, because the treemap is going to change it
44 // and we have a watcher for that data to re-render the treemap, so we can enter
45 // in a recursion loop
46 var data_cp = {};
47 angular.copy(data, data_cp);
48
49 var totalSize = 0;
50
51 var vis = d3.select(ele[0])
52 .append("div")
53 .attr("class", "box")
54 .attr("id", "chart")
55 .append("svg:svg")
56 .attr("class", "box")
57 .attr("width", width)
58 .attr("height", height)
59 .append("svg:g")
60 .attr("id", "container")
61 .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
62
63 var partition = d3.layout.partition()
64 .size([2 * Math.PI , radius * radius])
65 .value(function(d) { return d.value; });
66
67 var arc = d3.svg.arc()
68 .startAngle(function(d) { return d.x; })
69 .endAngle(function(d) { return d.x + d.dx; })
70 .innerRadius(function(d) { return Math.sqrt(d.y); })
71 .outerRadius(function(d) { return Math.sqrt(radius); });
72
73 // Bounding circle underneath the sunburst, to make it easier to detect
74 // when the mouse leaves the parent g.
75 vis.append("svg:circle")
76 .attr("r", radius)
77 .style("opacity", 0);
78
79 // For efficiency, filter nodes to keep only those large enough to see.
80 var nodes = partition.nodes(data_cp)
81 .filter(function(d) {
82 return (d.dx > 0.005); // 0.005 radians = 0.29 degrees
83 });
84
85 var path = vis.data([data_cp]).selectAll("path")
86 .data(nodes)
87 .enter().append("svg:path")
88 .attr("display", function(d) { return d.depth ? null : "none"; })
89 .attr("d", arc)
90 .attr("fill-rule", "evenodd")
91 .style("fill", function(d) {return d.color; })
92 .style("stroke-width", "0.5")
93 .style("opacity", 0)
94 .on('mouseover', function(d){
95 document.getElementById("cakeText").innerHTML = "<div style='background-color:" + d.color + "'><b>" + d.key + '</b></div>' + d.value;
96 })
97 .on('mouseleave', function(){
98 document.getElementById("cakeText").innerHTML = "";
99 })
100 .transition()
101 .duration(1250)
102 .style('opacity', 1);
103
104 // Get total size of the tree = value of root node from partition.
105 totalSize = path.node().__data__.value;
106 };
107 });
108 }}
109 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .directive('d3Treemap', ['d3Service',
6 function(d3Service) {
7 return {
8 restrict: 'EA',
9 scope: {
10 data: '='
11 },
12 link: function(scope, ele, attrs) {
13 d3Service.d3().then(function(d3) {
14
15 var margin = {
16 "top": parseInt(attrs.marginTop) || 28,
17 "right": parseInt(attrs.marginRight) || 10,
18 "bottom": parseInt(attrs.marginBottom) || 10,
19 "left": parseInt(attrs.marginLeft) || 10
20 }
21
22 function position() {
23 this.style("left", function(d) { return d.x + "px"; })
24 .style("top", function(d) { return d.y + "px"; })
25 .style("width", function(d) { return Math.max(0, d.dx - 1) + "px"; })
26 .style("height", function(d) { return Math.max(0, d.dy - 1) + "px"; });
27 }
28
29 scope.$watch('data', function(newData) {
30 scope.render(newData);
31 }, true);
32
33 scope.render = function(data) {
34
35 if (!data || data.length == 0) return;
36
37 var width = data.width || 160,
38 height = data.height || 133;
39
40 var div = d3.select(ele[0])
41 .append("div")
42 .attr("class", "treemap")
43 .attr("id", "treemap_container")
44 .style("position", "relative")
45 .style("width", width + "px")
46 .style("height", height + "px")
47 .style("left", margin.left + "px")
48 .style("top", margin.top + "px");
49
50 // we need to make a copy of the data, because the treemap is going to change it
51 // and we have a watcher for that data to re-render the treemap, so we can enter
52 // in a recursion loop
53 var data_cp = {};
54 angular.copy(data, data_cp);
55
56 var treemap = d3.layout.treemap()
57 .size([width - margin.left - margin.right, height - margin.top - margin.bottom])
58 .sticky(true)
59 .value(function(d) {return d.value});
60
61 var node = div.datum(data_cp).selectAll(".node")
62 .data(treemap.nodes)
63 .enter().append("div")
64 .attr("class", "node treemap-tooltip")
65 .call(position)
66 .style("background", function(d) { return d.color; })
67 .style('opacity', 0)
68 .text(function(d, i) {
69 if(data.width){
70 var total = d3.sum(data.children, function(d){return d.value;});
71 return (d.key+ " ( " + d3.round(100* d.value / total, 1) + "% " + ")" ) ;
72 }
73 })
74 .on('mouseover', function(d){
75 if (!data.width){
76 document.getElementById("treemapText").innerHTML = "<div style='background-color:" + d.color + "'>" + d.key + '</div>' + d.value;
77 }else{
78 document.getElementById("treemapTextModel").innerHTML = "<div style='background-color:" + d.color + "'>" + d.key + '</div>' + d.value;
79 }
80 })
81 .on('mouseleave', function(){
82 document.getElementById("treemapText").innerHTML = "";
83 })
84 .transition()
85 .duration(1250)
86 .style('opacity', 1);
87
88 };
89 });
90 }}
91 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .factory('d3Service', ['BASEURL', '$document', '$q', '$rootScope',
6 function(BASEURL, $document, $q, $rootScope) {
7 var d = $q.defer();
8 function onScriptLoad() {
9 // Load client in the browser
10 $rootScope.$apply(function() { d.resolve(window.d3); });
11 }
12 // Create a script tag with d3 as the source
13 // and call our onScriptLoad callback when it
14 // has been loaded
15 var scriptTag = $document[0].createElement('script');
16 scriptTag.type = 'text/javascript';
17 scriptTag.async = true;
18 scriptTag.src = 'script/d3.v3.min.js';
19 scriptTag.onreadystatechange = function () {
20 if (this.readyState == 'complete') onScriptLoad();
21 }
22 scriptTag.onload = onScriptLoad;
23
24 var s = $document[0].getElementsByTagName('body')[0];
25 s.appendChild(scriptTag);
26
27 return {
28 d3: function() { return d.promise; }
29 };
30 }
31 ]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .controller('dashboardCtrl',
6 ['$scope', '$filter', '$route', '$routeParams', 'statusReportFact',
7 function($scope, $filter, $route, $routeParams, statusReportFact) {
8 //current workspace
9 $scope.workspace = $routeParams.wsId;
10 $scope.workspaces = [];
11
12 statusReportFact.getWorkspaces().then(function(wss) {
13 $scope.workspaces = wss;
14 });
15 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .controller('graphicsBarCtrl',
6 ['$scope', '$route', '$routeParams', '$modal', 'dashboardSrv',
7 function($scope, $route, $routeParams, $modal, dashboardSrv) {
8 //current workspace
9 var workspace = $routeParams.wsId;
10 $scope.barData = [];
11 $scope.treemapData = [];
12 $scope.cakeData = [];
13
14 if (workspace != undefined){
15 dashboardSrv.getHostsByServicesCount(workspace).then(function(res){
16 if (res.length > 2) {
17 res.sort(function(a, b){
18 return b.value-a.value;
19 });
20 colors = ["rgb(57, 59, 121)","rgb(82, 84, 163)","rgb(107, 110, 207)"];
21 var tmp = [];
22 res.slice(0, 3).forEach(function(srv){
23 srv.color = colors.shift();
24 tmp.push(srv);
25 });
26 $scope.barData = tmp;
27 }
28 });
29
30 dashboardSrv.getServicesCount(workspace).then(function(res){
31 if (res.length > 4) {
32 res.sort(function(a, b){
33 return b.value - a.value;
34 });
35 colors = ["#FA5882", "#FF0040", "#B40431", "#610B21", "#2A0A1B"];
36 var tmp = [];
37 res.slice(0, 5).forEach(function(srv){
38 srv.color = colors.shift();
39 tmp.push(srv);
40 });
41 $scope.treemapData = {"children": tmp};
42 }
43 });
44
45 dashboardSrv.getVulnerabilitiesCount(workspace).then(function(res){
46 if (res.length > 0) {
47 var tmp = [
48 {"key": "low", "value": 0, "color": "#A1CE31"},
49 {"key": "med", "value": 0, "color": "#DFBF35"},
50 {"key": "high", "value": 0, "color": "#DF3936"},
51 {"key": "critical", "value": 0, "color": "#8B00FF"},
52 {"key": "info", "value": 0, "color": "#428BCA"}
53 ];
54
55 function accumulate(_array, key, value){
56 _array.forEach(function(obj){
57 if (obj.key == key){
58 obj.value += value;
59 }
60 });
61 }
62
63 res.forEach(function(tvuln){
64 if (tvuln.key == 1 || tvuln.key == "info"){
65 accumulate(tmp, "info", tvuln.value);
66 } else if (tvuln.key == 2 || tvuln.key == "low") {
67 accumulate(tmp, "low", tvuln.value);
68 } else if (tvuln.key == 3 || tvuln.key == "med") {
69 accumulate(tmp, "med", tvuln.value);
70 } else if (tvuln.key == 4 || tvuln.key == "high") {
71 accumulate(tmp, "high", tvuln.value);
72 } else if (tvuln.key == 5 || tvuln.key == "critical") {
73 accumulate(tmp, "critical", tvuln.value);
74 }
75 });
76 $scope.cakeData = {"children": tmp};
77 }
78 });
79 }
80
81 $scope.treemap = function(){
82 if($scope.treemapData.children){
83 var modal = $modal.open({
84 templateUrl: 'scripts/dashboard/partials/modal-treemap.html',
85 controller: 'summarizedCtrlBarModal',
86 size: 'lg',
87 resolve: {
88 workspace: function(){
89 return $scope.workspace;
90 }
91 }
92 });
93
94 modal.result.then(function(data) {
95 $scope.insert(data);
96 });
97 }
98 };
99
100 }]);
101
102 angular.module('faradayApp')
103 .controller('summarizedCtrlBarModal',
104 ['$scope', '$modalInstance', 'dashboardSrv', 'workspace',
105 function($scope, $modalInstance, dashboardSrv, workspace){
106
107 dashboardSrv.getServicesCount(workspace).then(function(res){
108 if (res.length > 4) {
109 res.sort(function(a, b){
110 return b.value - a.value;
111 });
112 colors = ["#FA5882", "#FF0040", "#B40431", "#610B21", "#2A0A1B"];
113 var tmp = [];
114 res.slice(0, 5).forEach(function(srv){
115 srv.color = colors.shift();
116 tmp.push(srv);
117 });
118 $scope.treemapDataModel = {"children": tmp, "height":300, "width": 500};
119 }
120 });
121
122 $scope.ok = function(){
123 $modalInstance.close();
124 }
125
126 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .controller('summarizedCtrl',
6 ['$scope', '$route', '$routeParams', '$modal', 'dashboardSrv',
7 function($scope, $route, $routeParams, $modal, dashboardSrv) {
8 //current workspace
9 var workspace = $routeParams.wsId;
10 $scope.servicesCount = [];
11 $scope.objectsCount = [];
12 $scope.vulnsCount = [];
13 $scope.commands = [];
14 $scope.hosts = [];
15 $scope.showPagination = 1;
16 $scope.currentPage = 0;
17 $scope.pageSize = 10;
18 $scope.pagination = 10;
19
20 // cmd table sorting
21 $scope.cmdSortField = 'date';
22 $scope.cmdSortReverse = true;
23 // toggles sort field and order
24 $scope.cmdToggleSort = function(field) {
25 $scope.cmdToggleSortField(field);
26 $scope.cmdToggleReverse();
27 };
28
29 // toggles column sort field
30 $scope.cmdToggleSortField = function(field) {
31 $scope.cmdSortField = field;
32 };
33
34 // toggle column sort order
35 $scope.cmdToggleReverse = function() {
36 $scope.cmdSortReverse = !$scope.cmdSortReverse;
37 }
38
39 // host table sorting
40 $scope.hostSortField = 'name';
41 $scope.hostSortReverse = true;
42 // toggles sort field and order
43 $scope.hostToggleSort = function(field) {
44 $scope.hostToggleSortField(field);
45 $scope.hostToggleReverse();
46 };
47
48 // toggles column sort field
49 $scope.hostToggleSortField = function(field) {
50 $scope.hostSortField = field;
51 };
52
53 // toggle column sort order
54 $scope.hostToggleReverse = function() {
55 $scope.hostSortReverse = !$scope.hostSortReverse;
56 }
57
58 if (workspace != undefined){
59 $scope.workspace = workspace;
60 dashboardSrv.getServicesCount(workspace).then(function(res){
61 res.sort(function(a, b){
62 return b.value - a.value;
63 });
64 $scope.servicesCount = res;
65
66 });
67 dashboardSrv.getObjectsCount(workspace).then(function(res){
68 for(var i = res.length - 1; i >= 0; i--) {
69 if(res[i].key === "interfaces") {
70 res.splice(i, 1);
71 }
72 }
73 $scope.objectsCount = res;
74 });
75 dashboardSrv.getVulnerabilitiesCount(workspace).then(function(res){
76 if (res.length > 0) {
77 var tmp = [
78 {"key": "critical", "value": 0},
79 {"key": "high", "value": 0},
80 {"key": "med", "value": 0},
81 {"key": "low", "value": 0},
82 {"key": "info", "value": 0},
83 {"key": "unclassified", "value": 0}
84 ];
85
86 function accumulate(_array, key, value){
87 _array.forEach(function(obj){
88 if (obj.key == key){
89 obj.value += value;
90 }
91 });
92 }
93
94 res.forEach(function(tvuln){
95 if (tvuln.key == 1 || tvuln.key == "info"){
96 accumulate(tmp, "info", tvuln.value);
97 } else if (tvuln.key == 2 || tvuln.key == "low") {
98 accumulate(tmp, "low", tvuln.value);
99 } else if (tvuln.key == 3 || tvuln.key == "med") {
100 accumulate(tmp, "med", tvuln.value);
101 } else if (tvuln.key == 4 || tvuln.key == "high") {
102 accumulate(tmp, "high", tvuln.value);
103 } else if (tvuln.key == 5 || tvuln.key == "critical") {
104 accumulate(tmp, "critical", tvuln.value);
105 }
106 });
107 $scope.vulnsCount = tmp;
108 }
109 });
110 dashboardSrv.getCommands(workspace).then(function(res){
111 res.forEach(function(cmd){
112 cmd.user = cmd.user || "unknown";
113 cmd.hostname = cmd.hostname || "unknown";
114 cmd.ip = cmd.ip || "0.0.0.0";
115 if(cmd.duration == "0" || cmd.duration == "") {
116 cmd.duration = "In progress";
117 } else if (cmd.duration != undefined) {
118 cmd.duration = cmd.duration.toFixed(2) + "s";
119 }
120 cmd.date = cmd.startdate * 1000;
121 });
122 $scope.commands = res;
123 });
124 dashboardSrv.getHosts(workspace).then(function(res){
125 dashboardSrv.getHostsByServicesCount(workspace).then(function(servicesCount){
126 res.forEach(function(host){
127 // Maybe this part should be in the view somehow
128 // or, even better, in CSS file
129 oss = ["windows", "cisco", "router", "osx", "apple","linux", "unix"];
130 oss.forEach(function(os){
131 if (host.os.toLowerCase().indexOf(os) != -1) {
132 host.icon = os;
133 if (os == "unix") {
134 host.icon = "linux";
135 }else if (os == "apple") {
136 host.icon = "osx";
137 }
138 }
139 });
140 host.servicesCount = 0;
141 servicesCount.forEach(function(count){
142 if (count.key == host.id) {
143 host.servicesCount = count.value;
144 return
145 }
146 })
147 $scope.hosts.push(host);
148 });
149 });
150 });
151 }
152
153 $scope.numberOfPages = function() {
154 $scope.filteredData = $scope.hosts;
155 if ($scope.filteredData.length <= 10){
156 $scope.showPagination = 0;
157 } else {
158 $scope.showPagination = 1;
159 };
160 return parseInt($scope.filteredData.length/$scope.pageSize);
161 }
162
163 $scope.go = function(page,pagination){
164 if(this.go_page < $scope.numberOfPages()+1 && this.go_page > -1){
165 $scope.currentPage = this.go_page;
166 }
167 $scope.pageSize = this.pagination;
168 if(this.go_page > $scope.numberOfPages()){
169 $scope.currentPage = 0;
170 }
171 }
172
173 $scope.showServices = function(host_id) {
174 if ($scope.workspace != undefined){
175 var modal = $modal.open({
176 templateUrl: 'scripts/dashboard/partials/modal-services-by-host.html',
177 controller: 'summarizedCtrlServicesModal',
178 size: 'lg',
179 resolve: {
180 host_id: function(){
181 return host_id
182 },
183 workspace: function(){
184 return $scope.workspace;
185 }
186 }
187 });
188 }
189 }
190
191 $scope.showHosts = function(srv_name) {
192 if ($scope.workspace != undefined){
193 var modal = $modal.open({
194 templateUrl: 'scripts/dashboard/partials/modal-hosts-by-service.html',
195 controller: 'summarizedCtrlHostsModal',
196 size: 'lg',
197 resolve: {
198 srv_name: function(){
199 return srv_name
200 },
201 workspace: function(){
202 return $scope.workspace;
203 }
204 }
205 });
206 }
207 }
208 }]);
209
210 angular.module('faradayApp')
211 .controller('summarizedCtrlServicesModal',
212 ['$scope', '$modalInstance', 'dashboardSrv', 'workspace', 'host_id',
213 function($scope, $modalInstance, dashboardSrv, workspace, host_id) {
214
215 $scope.sortField = 'port';
216 $scope.sortReverse = false;
217
218 // toggles sort field and order
219 $scope.toggleSort = function(field) {
220 $scope.toggleSortField(field);
221 $scope.toggleReverse();
222 };
223
224 // toggles column sort field
225 $scope.toggleSortField = function(field) {
226 $scope.sortField = field;
227 };
228
229 // toggle column sort order
230 $scope.toggleReverse = function() {
231 $scope.sortReverse = !$scope.sortReverse;
232 }
233
234 dashboardSrv.getServicesByHost(workspace, host_id).then(function(services){
235 dashboardSrv.getName(workspace, host_id).then(function(name){
236 $scope.name = name;
237 $scope.services = services;
238 })
239 });
240
241 $scope.ok = function(){
242 $modalInstance.close();
243 }
244
245 }]);
246
247 angular.module('faradayApp')
248 .controller('summarizedCtrlHostsModal',
249 ['$scope', '$modalInstance', 'dashboardSrv', 'workspace', 'srv_name',
250 function($scope, $modalInstance, dashboardSrv, workspace, srv_name) {
251
252 $scope.sortField = 'name';
253 $scope.sortReverse = false;
254 $scope.clipText = "Copy to Clipboard";
255
256 // toggles sort field and order
257 $scope.toggleSort = function(field) {
258 $scope.toggleSortField(field);
259 $scope.toggleReverse();
260 };
261
262 // toggles column sort field
263 $scope.toggleSortField = function(field) {
264 $scope.sortField = field;
265 };
266
267 // toggle column sort order
268 $scope.toggleReverse = function() {
269 $scope.sortReverse = !$scope.sortReverse;
270 }
271
272 dashboardSrv.getHostsByServicesName(workspace, srv_name).then(function(hosts){
273 $scope.name = srv_name;
274 $scope.hosts = hosts;
275 $scope.clip = "";
276 $scope.hosts.forEach(function(h){
277 $scope.clip += h.name + "\n";
278 });
279 });
280
281 $scope.messageCopied = function(){
282 $scope.clipText = "Copied!";
283 }
284
285 $scope.ok = function(){
286 $modalInstance.close();
287 }
288
289 }]);
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <section id="main" class="seccion clearfix">
5 <div class="right-main">
6 <div id="reports-main" class="fila clearfix">
7 <h2 class="ws-label">
8 <span id="ws-name" class="label label-default"
9 title="Current workspace">Dashboard for {{ workspace }}</span><!-- WS name -->
10 <div id="ws-control" class="btn-group">
11 <button id="refresh" type="button" class="btn btn-danger" title="Refresh current workspace" ng-click="location.reload()">
12 <span class="glyphicon glyphicon-refresh"></span>
13 </button>
14 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" title="Change current workspace">
15 Change workspace <span class="caret"></span>
16 </button>
17 <ul id="nav" class="dropdown-menu dropdown-menu-right" role="menu">
18 <li ng-repeat="ws in workspaces"><a href="#/dashboard/ws/{{ws}}" class="ws" >{{ws}}</a></li>
19 </ul><!-- WS navigation -->
20 </div><!-- #ws-control -->
21 </h2><!-- .ws-label -->
22 <div class="reports">
23 </div><!-- .reports -->
24 <div ng-controller="graphicsBarCtrl" ng-include="'scripts/dashboard/partials/graphics-bar.html'"></div>
25 <div ng-controller="summarizedCtrl" ng-include="'scripts/dashboard/partials/summarized.html'"></div>
26
27 </div><!-- #reports-main -->
28 </div><!-- .right-main -->
29 </section>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class='col-lg-2'>
5 <article id='treemap' class='panel panel-default'>
6 <header>
7 <h2>
8 <a class="treemap-view" href="" ng-disabled="{{nodata}}" ng-click="treemap()">Top Services</a>
9 <span class="glyphicon glyphicon-info-sign" tooltip="Top 5 services with the largest quantity of hosts"></span>
10 </h2>
11 </header>
12 <span id="treemapText"></span>
13 <div ng-if="treemapData.length < 5" class="alert alert-info alert-dismissible">
14 <button type="button" class="close" data-dismiss="alert">
15 <span aria-hidden="true">&times;</span>
16 <span class="sr-only">Close</span>
17 </button>
18 <p>At least 5 services needed to show this visualization</p>
19 </div>
20 <d3-treemap data="treemapData"></d3-treemap>
21 </article>
22 </div>
23 <div class='col-lg-2'>
24 <article id='bar' class='panel panel-default'>
25 <header>
26 <h2>Top Hosts
27 <span class="glyphicon glyphicon-info-sign" tooltip="Top 3 hosts with the largest quantity of services"></span>
28 </h2>
29 </header>
30 <span id="barText"></span>
31 <div ng-if="barData.length < 3" class="alert alert-info alert-dismissible">
32 <button type="button" class="close" data-dismiss="alert">
33 <span aria-hidden="true">&times;</span>
34 <span class="sr-only">Close</span>
35 </button>
36 <p>At least 3 hosts needed to show this visualization</p>
37 </div>
38 <d3-bars data="barData"></d3-bars>
39 </article>
40 </div>
41 <div class='col-lg-2'>
42 <article id='cake' class='panel panel-default'>
43 <header>
44 <h2>Vulnerabilities
45 <span class="glyphicon glyphicon-info-sign" tooltip="Vulnerabilty distribution for current WS"></span>
46 </h2>
47 </header>
48 <span id="cakeText"></span>
49 <div ng-if="cakeData.length == 0" class="alert alert-info alert-dismissible">
50 <button type="button" class="close" data-dismiss="alert">
51 <span aria-hidden="true">&times;</span>
52 <span class="sr-only">Close</span>
53 </button>
54 <p>No vulnerabilities found yet</p>
55 </div>
56 <d3-cake data="cakeData"></d3-cake>
57 </article>
58 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <h3>Services for {{name}} ({{hosts.length}} total)</h3>
6 </div>
7
8 <div class="modal-body">
9 <table class="status-report">
10 <thead>
11 <tr>
12 <th><a href="" ng-click="toggleSort('owned')">Owned</a></th>
13 <th><a href="" ng-click="toggleSort('name')">Name</a></th>
14 <th><a href="" ng-click="toggleSort('os')">OS</a></th>
15 </tr>
16 </thead>
17 <tbody>
18 <tr ng-repeat="host in hosts | orderBy:sortField:sortReverse">
19 <td><input disabled type="checkbox" ng-model="host.owned"/></td>
20 <td>{{host.name}}</td>
21 <td>{{host.os}}</td>
22 </tr>
23 </tbody>
24 </table>
25 <div class="form-group">
26 <button class="btn btn-danger" clip-copy="clip" clip-click="messageCopied()">{{clipText}}</button>
27 </div>
28 </div>
29
30 <div class="modal-footer">
31 <button class="btn btn-success" ng-click="ok()">OK</button>
32 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <h3>Services for {{name}} ({{services.length}} total)</h3>
6 </div>
7
8 <div class="modal-body">
9 <table class="status-report">
10 <thead>
11 <tr>
12 <th><a href="" ng-click="toggleSort('name')">Name</a></th>
13 <th><a href="" ng-click="toggleSort('description')">Description</a></th>
14 <th><a href="" ng-click="toggleSort('port')">Port</a></th>
15 <th><a href="" ng-click="toggleSort('protocol')">Protocol</a></th>
16 <th><a href="" ng-click="toggleSort('status')">Status</a></th>
17 </tr>
18 </thead>
19 <tbody>
20 <tr ng-repeat="srv in services | orderBy:sortField:sortReverse">
21 <td>{{srv.name}}</a></td>
22 <td>{{srv.description}}</td>
23 <td>{{srv.port}}</td>
24 <td>{{srv.protocol}}</td>
25 <td>{{srv.status}}</td>
26 </tr>
27 </tbody>
28 </table>
29 </div>
30
31 <div class="modal-footer">
32 <button class="btn btn-success" ng-click="ok()">OK</button>
33 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <h3>Top Services {{hola}}</h3>
6 </div>
7
8 <div class="modal-body">
9 <article class='panel'>
10 <span id="treemapTextModel"></span>
11 <d3-treemap data="treemapDataModel"></d3-treemap>
12 </article>
13 </div>
14
15 <div class="modal-footer">
16 <button class="btn btn-success" ng-click="ok()">OK</button>
17 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div id='byservices'>
5 <div class='col-lg-3'>
6 <article class='panel panel-default'>
7 <header>
8 <h2>Services report
9 <span class="glyphicon glyphicon-info-sign" tooltip="All services for current WS ordered by host amount"></span>
10 </h2>
11 </header>
12 <div ng-if="servicesCount.length == 0" class="alert alert-info alert-dismissible">
13 <button type="button" class="close" data-dismiss="alert">
14 <span aria-hidden="true">&times;</span>
15 <span class="sr-only">Close</span>
16 </button>
17 <p>No services found yet</p>
18 </div>
19 <div class='main'>
20 <div class='box'>
21 <div ng-repeat="srv in servicesCount" class="columna unquinto services">
22 <article class="dato2">
23 <span href="" ng-click="showHosts(srv.key)">
24 <section>
25 <div class="nro">{{srv.value}}</div>
26 <div class="txt texto-blanco">{{srv.key}}</div>
27 </section>
28 </span>
29 </article>
30 </div>
31 </div>
32 </div>
33 </article>
34 </div>
35 </div>
36 <div id='summarized'>
37 <div class='col-lg-3'>
38 <article class='panel panel-default'>
39 <header>
40 <h2>Workspace summarized report
41 <span class="glyphicon glyphicon-info-sign" tooltip="WS overview - hosts, notes, services and vulnerabilites counts"></span>
42 </h2>
43 </header>
44 <div ng-if="objectsCount.length == 0" class="alert alert-info alert-dismissible">
45 <button type="button" class="close" data-dismiss="alert">
46 <span aria-hidden="true">&times;</span>
47 <span class="sr-only">Close</span>
48 </button>
49 <p>Not enough data to generate summarized report yet</p>
50 </div>
51 <div class='main'>
52 <div class='box'>
53 <div ng-repeat="obj in objectsCount" class="columna unquinto">
54 <article class="dato2">
55 <section>
56 <div class="nro">{{obj.value}}</div>
57 <div class="txt texto-blanco">{{obj.key}}</div>
58 </section>
59 </article>
60 </div>
61 </div>
62 </div>
63 </article>
64 </div>
65 </div>
66 <div id='compound'>
67 <div class='col-lg-6'>
68 <article class='panel panel-default'>
69 <header>
70 <h2>Hosts
71 <span class="glyphicon glyphicon-info-sign" tooltip="All hosts, each one showing its service count and operating system. By clicking on a host IP you can access a list with all of its services"></span>
72 </h2>
73 </header>
74 <div ng-if="hosts.length == 0" class="alert alert-info alert-dismissible">
75 <button type="button" class="close" data-dismiss="alert">
76 <span aria-hidden="true">&times;</span>
77 <span class="sr-only">Close</span>
78 </button>
79 <p>No hosts found yet.</p>
80 </div>
81 <table id="hosts" ng-if="hosts.length > 0" class="tablesorter table table-striped">
82 <thead>
83 <tr>
84 <th><a href="" ng-click="hostToggleSort('name')">Host</a></th>
85 <th><a href="" ng-click="hostToggleSort('servicesCount')">Services</a></th>
86 <th><a href="" ng-click="hostToggleSort('os')">OS</a></th>
87 </tr>
88 </thead>
89 <tbody>
90 <tr ng-repeat="host in hosts | orderBy:hostSortField:hostSortReverse |
91 startFrom:currentPage*pageSize | limitTo:pageSize">
92 <td><a href="" class="host" ng-click="showServices(host.id)">{{host.name}}</a></td>
93 <td>{{host.servicesCount}}</td>
94 <td>
95 <img ng-if="host.icon != undefined" ng-src="../././reports/images/{{host.icon}}.png" tooltip="{{host.os}}"/>
96 <span ng-if="host.icon == undefined" class="glyphicon glyphicon-question-sign" tooltip="{{host.os}}"></span>
97 </td>
98 </tr>
99 </tbody>
100 </table>
101 <div class="showPagination" ng-show="showPagination">
102 <div class="form-group">
103 <ul class="pagination">
104 <li><a ng-hide="currentPage == 0" ng-click="currentPage=currentPage-1"><span aria-hidden="true">&laquo;</span><span class="sr-only">Previous</span></a></li>
105 <li><a>{{currentPage}}/{{numberOfPages()}}</a></li>
106 <li><a ng-hide="currentPage >= numberOfPages()" ng-click="currentPage=currentPage+1"><span aria-hidden="true">&raquo;</span><span class="sr-only">Next</span></a></li>
107 </ul>
108 <form name="goToPage" id="goToPageStatus">
109 <input type="number" min="0" max="{{numberOfPages()}}" class="form-control" ng-model="go_page" placeholder="Go to page"/>
110 <button class="btn btn-default" ng-click="go()">GO</button>
111 <input id="vuln-per-page" type="number" min="0" class="form-control vuln_per_page" ng-model="pagination" placeholder="Numbre page" />
112 </form>
113 </div>
114 </div>
115 </article>
116 </div>
117 </div>
118 <div id='vulns'>
119 <div class='col-lg-6'>
120 <article class='panel panel-default'>
121 <header>
122 <h2>
123 <a href="../././reports/index.html#/status/ws/{{workspace}}" class="status-report">Vulnerabilities</a>
124 <span class="glyphicon glyphicon-info-sign" tooltip="Vulnerabilities count arranged by severity"></span>
125 </h2>
126 </header>
127 <div ng-if="vulnsCount.length == 0" class="alert alert-info alert-dismissible">
128 <button type="button" class="close" data-dismiss="alert">
129 <span aria-hidden="true">&times;</span>
130 <span class="sr-only">Close</span>
131 </button>
132 <p>No vulnerabilities found yet.</p>
133 </div>
134 <div class='main box'>
135 <div ng-repeat="vuln in vulnsCount" class="columna unsexto">
136 <article class="dato2 fondo-{{vuln.key}}">
137 <section>
138 <div class="nro texto-blanco">{{vuln.value}}</div>
139 <div class="txt texto-blanco">{{vuln.key}}</div>
140 </section>
141 </article>
142 </div>
143 </div>
144 </article>
145 </div>
146 </div>
147 <div id='list'>
148 <div class='col-lg-6'>
149 <article class='panel panel-default'>
150 <header>
151 <h2>Commands History
152 <span class="glyphicon glyphicon-info-sign" tooltip="Shows current WS' executed commands"></span>
153 </h2>
154 </header>
155 <div ng-if="commands.length == 0" class="alert alert-info alert-dismissible">
156 <button type="button" class="close" data-dismiss="alert">
157 <span aria-hidden="true">&times;</span>
158 <span class="sr-only">Close</span>
159 </button>
160 <p>No commands found yet.</p>
161 </div>
162 <table id="commands" ng-if="commands.length > 0" class="tablesorter table table-striped">
163 <thead>
164 <tr>
165 <th><a href="" ng-click="cmdToggleSort('user')">By</a></th>
166 <th><a href="" ng-click="cmdToggleSort('command')">Command</a></th>
167 <th><a href="" ng-click="cmdToggleSort('date')">Start Date</a></th>
168 <th><a href="" ng-click="cmdToggleSort('duration')">Duration</a></th>
169 </tr>
170 </thead>
171 <tbody>
172 <tr ng-repeat="cmd in commands | orderObjectBy:cmdSortField:cmdSortReverse">
173 <td><p tooltip="{{cmd.ip}}">{{cmd.user}}@{{cmd.hostname}}</p></td>
174 <td>{{cmd.command}}</td>
175 <td>{{cmd.date | date:"MM/dd/yyyy 'at' h:mma"}}</td>
176 <td ng-bind="cmd.duration || 'undefined'"></td>
177 </tr>
178 </tbody>
179 </table>
180 </article>
181 </div>
182 </div>
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .factory('dashboardSrv', ['BASEURL', '$q', '$http', function(BASEURL, $q, $http) {
6 var dashboardSrv = {};
7
8 dashboardSrv._getView = function(url) {
9 var deferred = $q.defer();
10
11 $http.get(url).then(function(response){
12 res = response.data.rows;
13 deferred.resolve(res);
14 }, function(){
15 deferred.reject();
16 });
17
18 return deferred.promise;
19 };
20
21 dashboardSrv.getHostsByServicesCount = function(ws, id) {
22 var url = BASEURL + "/" + ws + "/_design/hosts/_view/byservicecount?group=true";
23 if (id != undefined){
24 url += "&key=\"" + id + "\"";
25 }
26 return dashboardSrv._getView(url);
27 };
28
29 dashboardSrv.getServicesCount = function(ws) {
30 var url = BASEURL + "/" + ws + "/_design/hosts/_view/byservices?group=true";
31 return dashboardSrv._getView(url);
32 };
33
34 dashboardSrv.getVulnerabilitiesCount = function(ws) {
35 var url = BASEURL + "/" + ws + "/_design/hosts/_view/vulns?group=true";
36 return dashboardSrv._getView(url);
37 };
38
39 dashboardSrv.getObjectsCount = function(ws) {
40 var url = BASEURL + "/" + ws + "/_design/hosts/_view/summarized?group=true";
41 return dashboardSrv._getView(url);
42 };
43
44 dashboardSrv.getCommands = function(ws) {
45 var deferred = $q.defer();
46 var url = BASEURL + "/" + ws + "/_design/commands/_view/list";
47 dashboardSrv._getView(url).then(function(res){
48 var tmp = [];
49 res.forEach(function(cmd){
50 var _cmd = cmd.value;
51 _cmd["command"] = cmd.key;
52 tmp.push(_cmd);
53 });
54 deferred.resolve(tmp);
55 }, function(){
56 deferred.reject();
57 });
58 return deferred.promise;
59 };
60
61 dashboardSrv.getHosts = function(ws) {
62 var deferred = $q.defer();
63 var url = BASEURL + "/" + ws + "/_design/hosts/_view/hosts";
64 dashboardSrv._getView(url).then(function(res){
65 var tmp = [];
66 res.forEach(function(host){
67 var _host = host.value;
68 _host["id"] = host.key;
69 tmp.push(_host);
70 });
71 deferred.resolve(tmp);
72 }, function(){
73 deferred.reject();
74 });
75 return deferred.promise;
76 };
77
78 dashboardSrv.getHost = function(ws, host_id) {
79 var deferred = $q.defer();
80 var url = BASEURL + "/" + ws + "/" + host_id;
81 $http.get(url).then(function(res){
82 deferred.resolve(res.data);
83 }, function(){
84 deferred.reject();
85 });
86 return deferred.promise;
87 };
88
89 dashboardSrv.getServicesByHost = function(ws, host_id) {
90 var deferred = $q.defer();
91 var url = BASEURL + "/" + ws + "/_design/services/_view/byhost?key=\"" + host_id + "\"";
92 dashboardSrv._getView(url).then(function(res){
93 var tmp = [];
94 res.forEach(function(service){
95 var _service = service.value;
96 _service["id"] = service.id;
97 _service["port"] = _service.ports[0];
98 tmp.push(_service);
99 });
100 deferred.resolve(tmp);
101 }, function(){
102 deferred.reject();
103 });
104 return deferred.promise;
105 }
106
107 dashboardSrv.getHostsByServicesName = function(ws, srv_name) {
108 var deferred = $q.defer();
109 var url = BASEURL + "/" + ws + "/_design/services/_view/byname?key=\"" + srv_name + "\"";
110 dashboardSrv._getView(url).then(function(res){
111 var dict = {};
112 var tmp = [];
113 res.forEach(function(srv){
114 tmp.push(dashboardSrv.getHost(ws, srv.value.hid));
115 });
116 $q.all(tmp).then(function(hosts){
117 var res = [];
118 hosts.sort(function(a, b){
119 if(a.name < b.name) return -1;
120 if(a.name > b.name) return 1;
121 return 0;
122 });
123 for (var i = 0; i < hosts.length; i++){
124 if (res.length == 0 || hosts[i].name != res[res.length - 1].name) {
125 res.push(hosts[i]);
126 }
127 }
128 deferred.resolve(res);
129 });
130 }, function(){
131 deferred.reject();
132 });
133 return deferred.promise;
134 };
135
136 dashboardSrv.getName = function(ws, id){
137 var deferred = $q.defer();
138 url = BASEURL + "/" + ws + "/" + id;
139
140 $http.get(url).then(function(response){
141 res = response.data.name;
142 deferred.resolve(res);
143 }, function(){
144 deferred.reject();
145 });
146
147 return deferred.promise;
148 }
149
150 return dashboardSrv;
151 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 // file export
2 .directive('fileExporter', function($parse, $click, $blob, $log, $timeout) {
6 .directive('fileExporter',
7 ['$parse', '$click', '$blob', '$log', '$timeout',
8 function($parse, $click, $blob, $log, $timeout) {
39 return {
410 compile: function($element, attr) {
511 var fn = $parse(attr.fileExporter);
3036 };
3137 }
3238 };
33 });
39 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .factory('$blob', function() {
26 return {
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .factory('$click', function() {
26 return {
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .factory('hostsFact', ['BASEURL', function(BASEURL) {
26 var hostsFact = {};
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .controller('modalDeleteCtrl', function($scope, $modalInstance, amount) {
5 .controller('modalDeleteCtrl', ['$scope', '$modalInstance', 'amount', function($scope, $modalInstance, amount) {
26 if(amount == 1) {
37 $scope.message = "A vulnerability will be deleted.";
48 } else {
1317 $scope.cancel = function() {
1418 $modalInstance.dismiss('cancel');
1519 };
16 });
20 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .controller('modalEditCtrl', function($scope, $modalInstance, severities, vulns) {
5 .controller('modalEditCtrl', ['$scope', '$modalInstance', 'EASEOFRESOLUTION', 'commonsFact', 'severities', 'vulns',
6 function($scope, $modalInstance, EASEOFRESOLUTION, commons, severities, vulns) {
7 $scope.easeofresolution = EASEOFRESOLUTION;
8 $scope.evidence = {};
9 $scope.icons = {};
10 $scope.severities = severities;
11 $scope.vulns = vulns;
12 $scope.web = false;
13 $scope.mixed = 0x00;
14 $scope.vulnc = 0;
15 $scope.vulnid = 0;
16 $scope.file_name_error = false;
17 $scope.p_impact = {
18 "accountability": false,
19 "availability": false,
20 "confidentiality": false,
21 "integrity": false
22 };
23 $scope.impact = {
24 "accountability": false,
25 "availability": false,
26 "confidentiality": false,
27 "integrity": false
28 };
29 var vuln_mask = {"VulnerabilityWeb": 0x01, "Vulnerability": 0x10};
230
331 $scope.pickVuln = function(v) {
432 $scope.p_name = v.name;
533 $scope.p_desc = v.desc;
634 $scope.p_data = v.data;
735 $scope.severitySelection = v.severity;
36 $scope.easeOfResolutionSelection = v.easeofresolution;
837 $scope.p_method = v.method;
938 $scope.p_pname = v.pname;
1039 $scope.p_params = v.params;
1140 $scope.p_path = v.path;
1241 $scope.p_query = v.query;
1342 $scope.p_website = v.website;
43 $scope.p_refs = v.refs;
1444 $scope.p_request = v.request;
1545 $scope.p_response = v.response;
46 $scope.p_resolution = v.resolution;
1647
1748 $scope.name = $scope.p_name;
1849 $scope.data = $scope.p_data;
2253 $scope.path = $scope.p_path;
2354 $scope.pname = $scope.p_pname;
2455 $scope.query = $scope.p_query;
56 $scope.refs = $scope.p_refs;
2557 $scope.request = $scope.p_request;
2658 $scope.response = $scope.p_response;
59 $scope.resolution = $scope.p_resolution;
2760 $scope.website = $scope.p_website;
28 };
29 $scope.severities = severities;
30 $scope.vulns = vulns;
31 $scope.web = false;
32 $scope.mixed = 0x00;
33
34 $scope.vulnc = 0;
35 var vuln_mask = {"VulnerabilityWeb": 0x01, "Vulnerability": 0x10};
36
61
62 for(var key in v.impact) {
63 $scope.impact[key] = v.impact[key];
64 $scope.p_impact[key] = v.impact[key];
65 }
66
67 };
68
69 $scope.toggleImpact = function(key) {
70 $scope.impact[key] = !$scope.impact[key];
71 };
72
73 $scope.call = function(){
74 $scope.refs = commons.arrayToObject($scope.refs);
75 };
76 vulnid_count=0
3777 $scope.vulns.forEach(function(v) {
3878 if(v.selected) {
79 if(typeof(v.attachments) != undefined && v.attachments != undefined) {
80 v.attachments.forEach(function(name) {
81 $scope.evidence[name] = {"name": name};
82 });
83 $scope.icons = commons.loadIcons($scope.evidence);
84 }
3985 $scope.mixed = $scope.mixed | vuln_mask[v.type];
4086 $scope.vulnc++;
41 $scope.pickVuln(v);
87 $scope.vulnid = vulnid_count;
4288 if (v.type === "VulnerabilityWeb") {
4389 $scope.web = true;
4490 //web
4591 }
4692
4793 }
94 vulnid_count++;
95
96
4897 });
98
99 if ($scope.vulnc == 1) {
100 $scope.pickVuln($scope.vulns[$scope.vulnid]);
101 }
49102
50103 $scope.unit = $scope.vulnc == 1;
51104
59112 $scope.p_path = "";
60113 $scope.p_query = "";
61114 $scope.p_website = "";
115 $scope.p_refs = "";
62116 $scope.p_request = "";
63117 $scope.p_response = "";
118 $scope.p_resolution = "";
64119 }
65120
66121 if($scope.mixed == 0x11) {
74129 };
75130
76131 $scope.ok = function() {
77 var res = {};
132 var res = {},
133 evidence = [];
134
135 for(var key in $scope.impact) {
136 $scope.impact[key] = Boolean($scope.impact[key]);
137 }
138
139 for(var key in $scope.evidence) {
140 if(Object.keys($scope.evidence[key]).length == 1) {
141 evidence.push(key);
142 } else {
143 evidence.push($scope.evidence[key]);
144 }
145 }
146
147 $scope.refs = commons.objectToArray($scope.refs);
78148
79149 if($scope.web) {
80150 res = {
81 "data": $scope.data,
82 "desc": $scope.desc,
83 "method": $scope.method,
84 "name": $scope.name,
85 "params": $scope.params,
86 "path": $scope.path,
87 "pname": $scope.pname,
88 "query": $scope.query,
89 "request": $scope.request,
90 "response": $scope.response,
91 "severity": $scope.severitySelection,
92 "vulns": $scope.vulns,
93 "website": $scope.website
151 "data": $scope.data,
152 "desc": $scope.desc,
153 "easeofresolution": $scope.easeOfResolutionSelection,
154 "evidence": $scope.evidence,
155 "impact": $scope.impact,
156 "method": $scope.method,
157 "name": $scope.name,
158 "params": $scope.params,
159 "path": $scope.path,
160 "pname": $scope.pname,
161 "query": $scope.query,
162 "refs": $scope.refs,
163 "request": $scope.request,
164 "response": $scope.response,
165 "resolution": $scope.resolution,
166 "severity": $scope.severitySelection,
167 "vulns": $scope.vulns,
168 "website": $scope.website
94169 };
95170 } else {
96171 res = {
97 "data": $scope.data,
98 "desc": $scope.desc,
99 "name": $scope.name,
100 "severity": $scope.severitySelection,
101 "vulns": $scope.vulns
172 "data": $scope.data,
173 "desc": $scope.desc,
174 "easeofresolution": $scope.easeOfResolutionSelection,
175 "evidence": $scope.evidence,
176 "impact": $scope.impact,
177 "name": $scope.name,
178 "refs": $scope.refs,
179 "resolution": $scope.resolution,
180 "severity": $scope.severitySelection,
181 "vulns": $scope.vulns
102182 };
103183 }
104184
108188 $scope.cancel = function() {
109189 $modalInstance.dismiss('cancel');
110190 };
111
112 });
191
192 $scope.refs = commons.arrayToObject($scope.refs);
193
194 $scope.newReference = function($event){
195 $scope.refs.push({ref:''});
196 };
197
198 $scope.selectedFiles = function(files, e) {
199 files.forEach(function(file) {
200 if(file.name.charAt(0) != "_") {
201 if(!$scope.evidence.hasOwnProperty(file)) $scope.evidence[file.name] = file;
202 } else {
203 $scope.file_name_error = true;
204 }
205 });
206 $scope.icons = commons.loadIcons($scope.evidence);
207 }
208
209 $scope.removeEvidence = function(name) {
210 delete $scope.evidence[name];
211 delete $scope.icons[name];
212 }
213 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .controller('modalKoCtrl', function($scope, $modalInstance, msg) {
5 .controller('modalKoCtrl', ['$scope', '$modalInstance', 'msg', function($scope, $modalInstance, msg) {
26 $scope.msg = msg;
37
48 $scope.ok = function() {
59 $modalInstance.close();
610 };
7 });
11 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .controller('modalNewCtrl',
2 ['$scope', '$modalInstance','targetFact', 'severities', 'workspace',
3 function($scope, $modalInstance,targetFact, severities, workspace) {
6 ['$scope', '$modalInstance', '$filter', '$upload', 'EASEOFRESOLUTION', 'targetFact', 'commonsFact', 'severities', 'workspace',
7 function($scope, $modalInstance, $filter, $upload, EASEOFRESOLUTION, targetFact, commons, severities, workspace) {
48
59 $scope.typeOptions = [
610 {name:'Vulnerability', value:'Vulnerability'},
711 {name:'VulnerabilityWeb',value:'VulnerabilityWeb'}
812 ];
13
14 $scope.easeofresolution = EASEOFRESOLUTION;
915 $scope.vuln_type = $scope.typeOptions[0].value;
1016 $scope.severities = severities;
1117 $scope.workspace = workspace;
1218 $scope.target_selected = null;
1319 $scope.not_target_selected = false;
1420 $scope.incompatible_vulnWeb = false;
15
16 var name_selected;
17 var host_selected;
18 var d = {};
19 var hosts = targetFact.getTarget($scope.workspace, true);
21 $scope.refs = [{ref:''}];
22 $scope.evidence = {};
23 $scope.icons = {};
24 $scope.showPagination = 1;
25 $scope.currentPage = 0;
26 $scope.pageSize = 5;
27 $scope.pagination = 10;
28 $scope.file_name_error = false;
29 $scope.impact = {
30 "accountability": false,
31 "availability": false,
32 "confidentiality": false,
33 "integrity": false
34 };
35
36 var name_selected,
37 host_selected,
38 d = {},
39 hosts = targetFact.getTarget($scope.workspace, true);
40
2041 hosts.forEach(function(h) {
2142 h.services = [];
2243 d[h._id] = h;
2344 });
45
2446 var services = targetFact.getTarget($scope.workspace, false);
47
2548 for(var i = 0; i < services.length; i++){
2649 var host = [];
2750 services[i].selected = false;
2851 host = d[services[i].hid];
2952 host.services.push(services[i]);
3053 }
54
3155 $scope.hosts_with_services = hosts;
56
57 $scope.numberOfPages = function() {
58 var filteredData = $filter('filter')($scope.hosts_with_services,$scope.search_notes);
59 if (filteredData.length <= 10){
60 $scope.showPagination = 0;
61 } else {
62 $scope.showPagination = 1;
63 };
64
65 return Math.ceil(filteredData.length/$scope.pagination);
66 };
67
68 $scope.selectedFiles = function(files, e) {
69 files.forEach(function(file) {
70 if(file.name.charAt(0) != "_") {
71 if(!$scope.evidence.hasOwnProperty(file)) $scope.evidence[file.name] = file;
72 } else {
73 $scope.file_name_error = true;
74 }
75 });
76 $scope.icons = commons.loadIcons($scope.evidence);
77 };
78
79 $scope.removeEvidence = function(name) {
80 delete $scope.evidence[name];
81 delete $scope.icons[name];
82 };
83
84 $scope.toggleImpact = function(key) {
85 $scope.impact[key] = !$scope.impact[key];
86 };
3287
3388 $scope.ok = function() {
3489 if($scope.vuln_type == "VulnerabilityWeb" && host_selected == true){
3590 $scope.incompatible_vulnWeb = true;
36 }else{
37 var res = {};
38 var id = $scope.target_selected._id + "." + CryptoJS.SHA1($scope.name + "." + $scope.desc).toString();
39 var sha = CryptoJS.SHA1($scope.name + "." + $scope.desc).toString();
40
41 var myDate = new Date();
42 var myEpoch = myDate.getTime()/1000.0;
91 } else {
92 var res = {},
93 id = $scope.target_selected._id + "." + CryptoJS.SHA1($scope.name + "." + $scope.desc).toString(),
94 sha = CryptoJS.SHA1($scope.name + "." + $scope.desc).toString(),
95 myDate = new Date(),
96 myEpoch = myDate.getTime()/1000.0,
97 extra_vulns_prop = {},
98 arrayReferences = [];
99
100 for(var key in $scope.impact) {
101 $scope.impact[key] = Boolean($scope.impact[key]);
102 }
103
104 $scope.refs.forEach(function(r){
105 arrayReferences.push(r.ref);
106 });
107
108 arrayReferences.filter(Boolean);
43109
44110 var res = {
45 "id": id,
46 "data": $scope.data,
47 "date": myEpoch,
48 "desc": $scope.desc,
49 "meta": {'create_time': myEpoch,
50 "update_time": myEpoch,
51 "update_user": 'UI Web',
52 'update_action': 0,
53 'creator': 'UI Web',
54 'create_time': myEpoch,
55 'update_controller_action': 'UI Web New',
56 'owner': 'anonymous'
57 },
58 "name": $scope.name,
59 "oid": sha,
60 "owned": false,
61 "owner": "",
62 "couch_parent": $scope.target_selected._id,
63
64 "refs": [],
65 "status": $scope.vuln_type,
66 "severity": $scope.severitySelection,
67 "target": name_selected,
68 "type": $scope.vuln_type,
69 };
70 var extra_vulns_prop = {};
111 "id": id,
112 "data": $scope.data,
113 "date": myEpoch,
114 "desc": $scope.desc,
115 "easeofresolution": $scope.easeOfResolutionSelection,
116 "evidence": $scope.evidence,
117 "impact": $scope.impact,
118 "meta": {
119 'create_time': myEpoch,
120 "update_time": myEpoch,
121 "update_user": 'UI Web',
122 'update_action': 0,
123 'creator': 'UI Web',
124 'create_time': myEpoch,
125 'update_controller_action': 'UI Web New',
126 'owner': 'anonymous'
127 },
128 "name": $scope.name,
129 "oid": sha,
130 "owned": false,
131 "owner": "",
132 "couch_parent": $scope.target_selected._id,
133 "refs": arrayReferences,
134 "resolution": $scope.resolution,
135 "status": $scope.vuln_type,
136 "severity": $scope.severitySelection,
137 "target": name_selected,
138 "type": $scope.vuln_type
139 }
71140
72141 if($scope.vuln_type == "VulnerabilityWeb") {
73142 extra_vulns_prop = {
75144 "pname": $scope.pname,
76145 "query": $scope.query,
77146 "request": $scope.request,
147 "resolution": $scope.resolution,
78148 "response": $scope.response,
79149 "web": true,
80150 "website": $scope.website
85155 };
86156 }
87157
88 for (var key in extra_vulns_prop) {
158 for(var key in extra_vulns_prop) {
89159 res[key] = extra_vulns_prop[key];
90160 }
91161
103173 $scope.$parent.isopen = newvalue;
104174 });
105175
106 $scope.selected = function(i, j){
176 $scope.selected = function(i,j){
107177 if($scope.target_selected){
108178 $scope.target_selected.selected = false;
109179 }
110180 if(j != null){
111181 host_selected = false;
112 $scope.target_selected = $scope.hosts_with_services[i].services[j];
113 name_selected = $scope.hosts_with_services[i].name;
182 $scope.target_selected = j;
183 name_selected = i.name;
114184 }else{
115185 host_selected = true;
116 $scope.target_selected = $scope.hosts_with_services[i];
117 name_selected = $scope.hosts_with_services[i].name;
186 $scope.target_selected = i;
187 name_selected = i.name;
118188 }
119189 $scope.target_selected.selected = true;
120190 $scope.not_target_selected = true;
121191 }
192
193 $scope.go = function(){
194 if($scope.go_page < $scope.numberOfPages()+2 && $scope.go_page > -1){
195 $scope.currentPage = $scope.go_page;
196 }
197 }
198
199 $scope.newReference = function($event){
200 $scope.refs.push({ref:''});
201 $event.preventDefault();
202 }
122203 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('filter', []).filter('startFrom', function() {
5 return function(input, start) {
6 start = +start; //parse to int
7 return input.slice(start);
8 }
9 });
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 angular.module('faradayApp')
5 .controller('navigationCtrl', ['$scope', '$http','$route', '$routeParams', '$cookies', '$location',
6 function($scope, $http, $route, $routeParams, $cookies, $location) {
7
8 $scope.workspace = "";
9 $scope.component = "";
10
11 $scope.$on('$routeChangeSuccess', function() {
12 $scope.updateWorkspace();
13 $scope.updateComponent();
14 });
15
16 $scope.updateWorkspace = function() {
17 if($routeParams.wsId != undefined) {
18 $scope.workspace = $routeParams.wsId;
19 $cookies.currentUrl = $location.path();
20 }
21 };
22
23 $scope.updateComponent = function() {
24 if($location.path() == "") {
25 $scope.component = "home";
26 } else {
27 $scope.component = $location.path().split("/")[1];
28 }
29 $cookies.currentComponent = $scope.component;
30 };
31
32 $scope.showNavigation = function() {
33 var noNav = ["home", "index", ""];
34 return noNav.indexOf($scope.component) < 0;
35 };
36
37 $scope.loadCurrentWorkspace = function() {
38 var pos = -1;
39
40 if($cookies.currentUrl != undefined) {
41 pos = $cookies.currentUrl.indexOf('ws/');
42 }
43
44 if($routeParams.wsId != undefined) {
45 $scope.workspace = $routeParams.wsId;
46 } else if(pos >= 0) {
47 $scope.workspace = $cookies.currentUrl.slice(pos+3);
48 }
49 };
50
51 $scope.loadCurrentWorkspace();
52
53 if(navigator.userAgent.toLowerCase().indexOf('iceweasel') > -1) {
54 $scope.isIceweasel = "Your browser is not supported, please use Firefox or Chrome";
55 }
56
57 }]);
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3 <aside class="left-nav" ng-if="showNavigation()">
4 <nav>
5 <ul>
6 <li>
7 <a href="#/dashboard/ws/{{workspace}}" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
8 <img src="images/ico-dashboard-menu.svg" alt="Dashboard"/>
9 </a>
10 </li>
11 <li>
12 <a href="#/status/ws/{{workspace}}" class="status-report" style="color: #ffffff !important" title="Status Report">
13 <img src="images/ico-status-menu.svg" alt="Status Report"/>
14 </a>
15 </li>
16 <li>
17 <a href="#/workspaces" class="workspaces" style="color: #ffffff !important" title="Workspaces">
18 <img src="images/ico-workspaces-menu.svg" alt="Workspaces"/>
19 </a>
20 </li>
21 </ul>
22 </nav>
23 <div ng-show="isIceweasel" class="alert alert-danger alert-dismissible">
24 <button type="button" class="close" data-dismiss="alert">
25 <span aria-hidden="true">&times;</span>
26 <span class="sr-only">Close</span>
27 </button>
28 <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
29 <span ng-bind="isIceweasel"></span>
30 </div>
31 </aside>
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .factory('notesFact', ['BASEURL', '$http', function(BASEURL, $http) {
26 var notesFact = {};
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <section id="main" class="seccion clearfix">
1 <aside class="left-nav">
2 <nav>
3 <ul>
4 <li>
5 <a href="../././reports/index.html#{{workspace}}" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
6 <h2><span class="fa fa-pie-chart" title="Dashboard"></span></h2>
7 </a>
8 </li>
9 <li>
10 <a href="../././reports/faraday.html#/status/ws/{{workspace}}" class="status-report" style="color: #ffffff !important" title="Status Report">
11 <h2><span class="fa fa-list" title="Status Report"></span></h2>
12 </a>
13 </li>
14 </ul>
15 </nav>
16 </aside>
17
185 <div class="right-main"><div id="reports-main" class="fila clearfix">
196 <h2 class="ws-label">
207 <span id="ws-name" class="label label-default"
21 title="Current workspace">All available sections</span><!-- WS name -->
8 title="Current workspace">Welcome to Faraday!</span><!-- WS name -->
229 </h2><!-- .ws-label -->
23 <div class="reports">
24 <div class="ws-list">
25 <a href="#/status" class="ws-link">
26 <p class="label label-success ws-name">Status Report</p>
10 <div class="reports">
11 <div class="reports">
12 <div class="ws-list home-list community clearfix">
13 <a href="#/dashboard" class="ws-link item animated flipInX">
14 <img src="images/ico-dashboard.svg" />
15 <span class="ws-name">Dashboard</span>
16 <small>
17 Gain insight into your project.<br/>
18 <strong>Visualise the progress</strong>
19 </small>
20 </a>
21 <a href="#/status" class="ws-link item animated flipInX">
22 <img src="images/ico-status.svg" />
23 <span class="ws-name">Status Report</span>
24 <small>
25 All the vulnerabilities in one place.<br/>
26 <strong>Manage findings</strong>
27 </small>
28 </a>
29 <a href="#/workspaces" class="ws-link item animated flipInX">
30 <img src="images/ico-workspaces.svg" />
31 <span class="ws-name">Workspaces</span>
32 <small>
33 Create and edit projects.<br/>
34 <strong>Manage your projects</strong>
35 </small>
2736 </a>
2837 </div><!-- .ws-list -->
2938 </div><!-- .reports -->
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <div class="modal-header">
15 <h3 class="modal-title">Bulk deletion</h3>
26 </div>
48 <h5>{{message}}</h5>
59 </div><!-- .modal-body -->
610 <div class="modal-footer">
11 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
712 <button class="btn btn-success" ng-click="ok()">OK</button>
8 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
913 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <form name="formEdit" novalidate>
15 <div class="modal-header">
26 <div class="modal-button">
7 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
38 <button class="btn btn-success" ng-click="ok()" ng-disabled="formEdit.$invalid">OK</button>
4 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
59 </div>
610 <h3 class="modal-title">Bulk edit</h3>
711 </div>
1923 </div><!-- ng-if -->
2024 <div class="form-horizontal">
2125 <div class="form-group">
22 <div class="col-md-3">
26 <div class="col-md-6">
27 <h5>Severity</h5>
2328 <select class="form-control" ng-model="severitySelection" ng-options="s as s for s in severities">
29 </select>
30 </div>
31 <div class="col-md-6">
32 <h5>Ease of Resolution</h5>
33 <select class="form-control" ng-model="easeOfResolutionSelection" ng-options="e as e for e in easeofresolution">
2434 <option value=""></option>
2535 </select>
2636 </div>
27 <div class="col-md-9">
37 </div><!-- .form-group -->
38 <div class="form-group">
39 <div class="col-md-12">
2840 <label class="sr-only" for="vuln-name">Vuln name</label>
29 <input type="text" class="form-control" id="vuln-name" placeholder="Name" value="{{p_name}}" ng-model="name" required/>
41 <input type="text" class="form-control" id="vuln-name" placeholder="Name" ng-model="name"/>
3042 </div>
3143 </div><!-- .form-group -->
3244 <div class="form-group">
3345 <div class="col-md-12">
3446 <label class="sr-only" for="vuln-desc">Vuln description</label>
35 <textarea class="form-control" id="vuln-desc" placeholder="Description" value="{{p_desc}}" ng-model="desc" required></textarea>
47 <textarea class="form-control" id="vuln-desc" placeholder="Description" value="{{p_desc}}" ng-model="desc"></textarea>
3648 </div>
3749 </div><!-- .form-group -->
3850 <div class="form-group">
3951 <div class="col-md-12">
4052 <label class="sr-only" for="vuln-data">Vuln data</label>
4153 <textarea class="form-control" id="vuln-data" placeholder="Data" value="{{p_data}}" ng-model="data"></textarea>
54 </div>
55 </div><!-- .form-group -->
56 <div class="form-group">
57 <div class="col-md-12">
58 <h4>References</h4>
59 <span class="input-group-addon add-reference" ng-click="newReference($event)">Add Reference</span>
60 </div>
61 <div class="col-md-12 reference" ng-repeat="reference in refs">
62 <div class="input-group margin-bottom-sm">
63 <label class="sr-only" for="vuln-refs">References</label>
64 <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="reference.ref"/>
65 <span class="input-group-addon" ng-click="refs.splice($index, 1)"><i class="fa fa-minus-circle"></i></span>
66 </div>
67 </div>
68 </div><!-- .form-group -->
69 <div class="form-group">
70 <div class="col-md-12">
71 <label class="sr-only" for="vuln-resolution">Vuln Resolution</label>
72 <textarea class="form-control" id="vuln-resolution" placeholder="Resolution" ng-model="resolution"></textarea>
4273 </div>
4374 </div><!-- .form-group -->
4475 <div ng-if="web">
84115 </div><!-- .form-group -->
85116 </div><!-- ng-if -->
86117 </div><!-- .form-horizontal -->
118
119 <h4>Impact</h4>
120 <div ng-repeat="(key, value) in impact" class="normal-size" style="cursor: pointer;">
121 <h4><span ng-class="{'label label-default': !value, 'label label-success': value}" ng-click="toggleImpact(key)">{{key}}</span></h4>
122 </div><!-- .normal-size -->
123
124 <div ng-if="vulnc == 1">
125 <h4>Evidence</h4>
126 <form>
127 <div class="alert alert-danger normal-size" role="alert" ng-if="file_name_error">
128 <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
129 <span class="sr-only">Error:</span>
130 Cannot upload evidence starting with underscore, please choose a different name for the file.
131 </div>
132 <div class="form-group normal-size">
133 <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" ng-file-change="selectedFiles($files, $event)"/>
134 <p class="help-block">Multiple files are allowed.</p>
135 </div><!-- .form-group -->
136 </form>
137 <div id="evidenceFiles" class="normal-size" ng-if="evidence">
138 <ul>
139 <li ng-repeat="e in evidence | orderObjectBy:'name':true | orderBy:'name'">
140 <div class="btn-group">
141 <button type="button" class="btn btn-default">
142 <span class="fa {{icons[e.name]}}" title="Evidence {{e.name}}"></span> {{e.name}}
143 </button><!-- ng-repeat -->
144 <button type="button" class="btn btn-danger" ng-click="removeEvidence(e.name)">
145 <span class="glyphicon glyphicon-trash"></span>
146 </button>
147 </div>
148 </li>
149 </ul>
150 </div><!-- #evidenceFiles -->
151 </div><!-- ng-if -->
152
87153 <h5><small>
88154 Vulnerabilities to update
89155 </small></h5>
97163 <th><a href="" ng-click="sortField = 'name'; reverse = !reverse">Name</a></th>
98164 <th><a href="" ng-click="sortField = 'target'; reverse = !reverse">Target</a></th>
99165 <th><a href="" ng-click="sortField = 'desc'; reverse = !reverse">Desc</a></th>
166 <th><a href="">Copy</a></th>
100167 </tr>
101168 </thead>
102169 <tbody>
103 <tr ng-click="pickVuln(v)" ng-repeat="v in vulns | filter:isChecked | orderBy:sortField:reverse">
104 <td>{{v.date}}</td>
170 <tr ng-repeat="v in vulns | filter:isChecked | orderBy:sortField:reverse">
171 <td>{{v.date | date:'MM/dd/yyyy'}}</td>
105172 <td>
106173 <span class="glyphicon glyphicon-ok" ng-show="v.web"></span>
107174 <span class="glyphicon glyphicon-remove" ng-show="!v.web"></span>
111178 <td>{{v.name}}</td>
112179 <td>{{v.target}}</td>
113180 <td text-collapse text-collapse-max-length="50" text-collapse-text="{{v.desc}}"></td>
181 <td><i class="fa fa-copy copy-icon fa-lg" ng-click="pickVuln(v);call();"></i></td>
114182 </tr>
115183 </tbody>
116184 </table><!-- #hosts -->
117185 </div><!-- .modal-body -->
118186 <div class="modal-footer">
187 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
119188 <button class="btn btn-success" ng-click="ok()" ng-disabled="formEdit.$invalid">OK</button>
120 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
121189 </div>
122 </form>
190 </form>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <div class="modal-header">
15 <h3 class="modal-title">Oops!</h3>
26 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <form name="form" novalidate>
15 <div class="modal-header">
26 <div class="modal-button">
7 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
38 <button class="btn btn-success" ng-click="ok()" ng-disabled="form.$invalid">OK</button>
4 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
59 </div>
6 <h3 class="modal-title">Bulk new</h3>
10 <h3 class="modal-title">Vulnerability creation</h3>
711 </div>
812 <div class="modal-body">
913 <div class="form-horizontal">
1014 <div class="form-group">
1115 <div class="col-md-12">
16 <input type="text" ng-model="search_notes" class="form-control input-sm" placeholder="Search" ng-change="currentPage = 0">
1217 <accordion close-others="true">
13 <accordion-group is-open="isopen" ng-repeat="host in hosts_with_services">
18 <accordion-group is-open="isopen" ng-repeat="host in hosts_with_services | filter:search_notes | startFrom:currentPage*pageSize | limitTo:pageSize">
1419 <accordion-heading>
15 <a ng-click="selected($index, null)" ng-class="{'multi-selected': host.selected == true}">{{host.name}}</a>
20 <a ng-click="selected(host,null)" ng-class="{'multi-selected': host.selected == true}">{{host.name}}</a>
1621 <i class="pull-right glyphicon"
1722 ng-class="{'glyphicon glyphicon-minus-sign': isopen, 'glyphicon glyphicon-plus-sign': !isopen}"></i>
1823 </accordion-heading>
1924 <div class="panel-body" ng-repeat="service in host.services">
20 <a ng-model="service" ng-click="selected($parent.$index, $index)" ng-class="{'multi-selected': service.selected == true}">{{service.name}}</a>
25 <a ng-model="service" ng-click="selected(host,service)" ng-class="{'multi-selected': service.selected == true}">{{service.name}}</a>
2126 </div>
2227 </accordion-group>
2328 </accordion>
29 <div class="showPagination" ng-show="showPagination">
30 <div class="form-group">
31 <ul class="pagination">
32 <li><a ng-hide="currentPage == 0" ng-click="currentPage=currentPage-1"><span aria-hidden="true">&laquo;</span><span class="sr-only">Previous</span></a></li>
33 <li><a>{{currentPage}}/{{numberOfPages()+1}}</a></li>
34 <li><a ng-hide="currentPage >= numberOfPages()+1" ng-click="currentPage=currentPage+1"><span aria-hidden="true">&raquo;</span><span class="sr-only">Next</span></a></li>
35 </ul>
36 <form name="goToPage">
37 <div class="col-md-2">
38 <input type="number" min="0" max="{{numberOfPages()+1}}" class="form-control" ng-model="go_page" placeholder="Go to page"/>
39 </div>
40 <button class="btn btn-danger" ng-click="go()">GO</button>
41 </form>
42 </div>
43 </div>
2444 </div>
2545 </div>
2646 </div>
3858
3959 <div class="form-horizontal">
4060 <div class="form-group">
41 <div class="col-md-12">
61 <div class="col-md-4">
62 <h5>Type</h5>
4263 <select class="form-control" ng-model="vuln_type" ng-options="option.value as option.name for option in typeOptions">
4364 </select>
4465 </div>
45 </div>
46 <div class="form-group">
47 <div class="col-md-3">
66 <div class="col-md-4">
67 <h5>Severity</h5>
4868 <select class="form-control" ng-model="severitySelection" ng-options="s as s for s in severities" required>
4969 </select>
5070 </div>
51 <div class="col-md-9">
71 <div class="col-md-4">
72 <h5>Ease of Resolution</h5>
73 <select class="form-control" ng-model="easeOfResolutionSelection" ng-options="e as e for e in easeofresolution">
74 <option value=""></option>
75 </select>
76 </div>
77 </div><!-- .form-group -->
78 <div class="form-group">
79 <div class="col-md-12">
5280 <label class="sr-only" for="vuln-name">Vuln name</label>
5381 <input type="text" class="form-control" id="vuln-name" placeholder="Name" ng-model="name" required/>
5482 </div>
6593 <textarea class="form-control" id="vuln-data" placeholder="Data" ng-model="data"></textarea>
6694 </div>
6795 </div><!-- .form-group -->
96 <div class="form-group">
97 <div class="col-md-12 reference" ng-repeat="reference in refs">
98 <div class="input-group margin-bottom-sm">
99 <label class="sr-only" for="vuln-refs">References</label>
100 <input type="text" class="form-control" id="vuln-refs" placeholder="Reference" ng-model="reference.ref"/>
101 <span class="input-group-addon" ng-click="newReference($event)"><i class="fa fa-plus-circle"></i></span>
102 <span class="input-group-addon" ng-click="refs.splice($index, 1)" ng-hide="refs.length == 1"><i class="fa fa-minus-circle"></i></span>
103 </div>
104 </div>
105 </div><!-- .form-group -->
106 <div class="form-group">
107 <div class="col-md-12">
108 <label class="sr-only" for="vuln-resolution">Vuln Resolution</label>
109 <textarea class="form-control" id="vuln-resolution" placeholder="Resolution" ng-model="resolution"></textarea>
110 </div>
111 </div><!-- .form-group -->
68112 </div>
69113
70114 <div class="animate-switch-container" ng-switch on="vuln_type">
71115 <div class="animate-switch" ng-switch-when="VulnerabilityWeb">
72 <div class="form-horizontal">
73 <div class="form-group">
74 <div class="col-md-4">
75 <label class="sr-only control-label" for="vuln-method">Method</label>
76 <input type="text" class="form-control" id="vuln-method" placeholder="Method" ng-model="$parent.method"/>
116 <div class="form-horizontal">
117 <div class="form-group">
118 <div class="col-md-4">
119 <label class="sr-only control-label" for="vuln-method">Method</label>
120 <input type="text" class="form-control" id="vuln-method" placeholder="Method" ng-model="$parent.method"/>
121 </div>
122 <div class="col-md-3">
123 <label class="sr-only control-label" for="vuln-pname">Param Name</label>
124 <input type="text" class="form-control" id="vuln-pname" placeholder="Param name" ng-model="$parent.pname"/>
125 </div>
126 <div class="col-md-5">
127 <label class="sr-only control-label" for="vuln-params">Params</label>
128 <input type="text" class="form-control" id="vuln-params" placeholder="Params" ng-model="$parent.params"/>
129 </div>
130 </div><!-- .form-group -->
131 <div class="form-group">
132 <div class="col-md-4">
133 <label class="sr-only control-label" for="vuln-path">Path</label>
134 <input type="text" class="form-control" id="vuln-path" placeholder="Path" ng-model="$parent.path"/>
135 </div>
136 <div class="col-md-4">
137 <label class="sr-only control-label" for="vuln-query">Query</label>
138 <input type="text" class="form-control" id="vuln-query" placeholder="Query" ng-model="$parent.query"/>
139 </div>
140 <div class="col-md-4">
141 <label class="sr-only control-label" for="vuln-website">Website</label>
142 <input type="text" class="form-control" id="vuln-website" placeholder="Website" ng-model="$parent.website"/>
143 </div>
144 </div><!-- .form-group -->
145 <div class="form-group">
146 <div class="col-md-12">
147 <label class="sr-only control-label" for="vuln-request">Request</label>
148 <textarea class="form-control" id="vuln-request" placeholder="Request" ng-model="$parent.request"></textarea>
149 </div>
150 </div><!-- .form-group -->
151 <div class="form-group">
152 <div class="col-md-12">
153 <label class="sr-only control-label" for="vuln-response">Response</label>
154 <textarea class="form-control" id="vuln-response" placeholder="Response" ng-model="$parent.response"></textarea>
155 </div>
156 </div><!-- .form-group -->
157 </div><!-- .form-horizontal -->
158 </div><!-- .animate-switch -->
159 <div class="animate-switch" ng-switch-when="Vulnerability"></div>
160 </div><!-- .animate-switch-container -->
161
162 <h4>Impact</h4>
163 <div ng-repeat="(key, value) in impact" class="normal-size" style="cursor: pointer;">
164 <h4><span ng-class="{'label label-default': !value, 'label label-success': value}" ng-click="toggleImpact(key)">{{key}}</span></h4>
165 </div><!-- .normal-size -->
166
167 <h4>Evidence</h4>
168 <form>
169 <div class="alert alert-danger normal-size" role="alert" ng-if="file_name_error">
170 <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
171 <span class="sr-only">Error:</span>
172 Cannot upload evidence starting with underscore, please choose a different name for the file.
173 </div>
174 <div class="form-group normal-size">
175 <input type="file" id="evidence" ng-file-select ng-multiple="true" resetOnClick="false" ng-file-change="selectedFiles($files, $event)"/>
176 <p class="help-block">Multiple files are allowed.</p>
177 </div><!-- .form-group -->
178 </form>
179 <div id="evidenceFiles" class="normal-size" ng-if="evidence">
180 <ul>
181 <li ng-repeat="e in evidence | orderObjectBy:'name':true | orderBy:'name'">
182 <div class="btn-group">
183 <button type="button" class="btn btn-default">
184 <span class="fa {{icons[e.name]}}" title="Evidence {{e.name}}"></span> {{e.name}}
185 </button><!-- ng-repeat -->
186 <button type="button" class="btn btn-danger" ng-click="removeEvidence(e.name)">
187 <span class="glyphicon glyphicon-trash"></span>
188 </button>
77189 </div>
78 <div class="col-md-3">
79 <label class="sr-only control-label" for="vuln-pname">Param Name</label>
80 <input type="text" class="form-control" id="vuln-pname" placeholder="Param name" ng-model="$parent.pname"/>
81 </div>
82 <div class="col-md-5">
83 <label class="sr-only control-label" for="vuln-params">Params</label>
84 <input type="text" class="form-control" id="vuln-params" placeholder="Params" ng-model="$parent.params"/>
85 </div>
86 </div><!-- .form-group -->
87 <div class="form-group">
88 <div class="col-md-4">
89 <label class="sr-only control-label" for="vuln-path">Path</label>
90 <input type="text" class="form-control" id="vuln-path" placeholder="Path" ng-model="$parent.path"/>
91 </div>
92 <div class="col-md-4">
93 <label class="sr-only control-label" for="vuln-query">Query</label>
94 <input type="text" class="form-control" id="vuln-query" placeholder="Query" ng-model="$parent.query"/>
95 </div>
96 <div class="col-md-4">
97 <label class="sr-only control-label" for="vuln-website">Website</label>
98 <input type="text" class="form-control" id="vuln-website" placeholder="Website" ng-model="$parent.website"/>
99 </div>
100 </div><!-- .form-group -->
101 <div class="form-group">
102 <div class="col-md-12">
103 <label class="sr-only control-label" for="vuln-request">Request</label>
104 <textarea class="form-control" id="vuln-request" placeholder="Request" ng-model="$parent.request"></textarea>
105 </div>
106 </div><!-- .form-group -->
107 <div class="form-group">
108 <div class="col-md-12">
109 <label class="sr-only control-label" for="vuln-response">Response</label>
110 <textarea class="form-control" id="vuln-response" placeholder="Response" ng-model="$parent.response"></textarea>
111 </div>
112 </div><!-- .form-group -->
113 <div class="animate-switch" ng-switch-when="Vulnerability"></div>
114 </div>
115 </div>
116 </div><!-- ng-if -->
190 </li>
191 </ul>
192 </div><!-- #evidenceFiles -->
117193 </div><!-- .modal-body -->
118194 <div class="modal-footer">
195 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
119196 <button class="btn btn-success" ng-disabled="form.$invalid" ng-click="ok()">OK</button>
120 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
121197 </div>
122 </form>
198 </form>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
04 <section id="main" class="seccion clearfix">
1 <aside class="left-nav">
2 <nav>
3 <ul>
4 <li>
5 <a href="../././reports/index.html#{{workspace}}" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
6 <h2><span class="fa fa-pie-chart" title="Dashboard"></span></h2>
7 </a>
8 </li>
9 <li>
10 <a href="../././reports/faraday.html#/status/ws/{{workspace}}" class="status-report" style="color: #ffffff !important" title="Status Report">
11 <h2><span class="fa fa-list" title="Status Report"></span></h2>
12 </a>
13 </li>
14 </ul>
15 </nav>
16 </aside>
5 <div class="right-main"><div id="reports-main" class="fila clearfix">
6 <div class="ws-label">
7 <h2><span id="ws-name" class="label label-default"
8 title="Current workspace">Status report for {{ workspace }} ({{vulns.length}} vulns)</span></h2><!-- WS name -->
9 </div><!-- .ws-label -->
10 <div id="ws-control" class="btn-group">
11 <button file-exporter="toCSV()" type="button" class="btn btn-success" title="Download CSV for current workspace">
12 <span class="glyphicon glyphicon-download"></span>
13 </button>
14 <button id="refresh" type="button" class="btn btn-danger" title="Refresh current workspace" ng-click="location.reload()">
15 <span class="glyphicon glyphicon-refresh"></span>
16 </button>
17 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" title="Change current workspace">
18 Change workspace <span class="caret"></span>
19 </button>
20 <ul id="nav" class="dropdown-menu dropdown-menu-right" role="menu">
21 <li ng-repeat="ws in workspaces"><a href="#/status/ws/{{ws}}" class="ws" >{{ws}}</a></li>
22 </ul><!-- WS navigation -->
23 </div><!-- #ws-control -->
24
25 <div class="button-control col-md-6 col-sm-6 col-xs-12">
26 <button id="delete" type="button" class="btn btn-default" title="Delete selected items" ng-click="delete()">
27 <span class="glyphicon glyphicon-trash"></span>
28 Delete
29 </button>
30 <button id="merge" type="button" class="btn btn-default" title="Edit selected vulns" ng-click="edit()">
31 <span class="glyphicon glyphicon-pencil"></span>
32 Edit
33 </button>
34 <button id="new" type="button" class="btn btn-success" title="New Vulns" ng-click="new()">
35 <span class="glyphicon glyphicon-plus-sign"></span>
36 New
37 </button>
38 </div><!-- .col-md-6 .col-sm-6 .col-xs-12 -->
39 <div class="reports">
40 <div class="row">
41 <div class="col-md-12 col-sm-3 col-xs-11">
42 <form role="form">
43 <div class="form-group">
44 <h4><span class="label label-default " title="Filter by">Filter by</span></h4>
45 <input type="text" class="form-control input-sm" id="filter-by" placeholder="enter keywords..." ng-model="query" ng-change="currentPage = 0">
46 </div>
47 </form>
48 </div>
49 <div class="col-md-12 col-sm-9 col-xs-12">
50 <h4><span class="label label-default" title="Add columns">Add columns</span></h4>
51 <ul class="label-list">
52 <li ng-repeat="(column, show) in columns">
53 <a href="" ng-click="toggleShow(column, show)" ng-show="!show">
54 <span class="label label-primary ws-name">{{column}}</span>
55 </a>
56 </li><!-- label-list -->
57 </ul>
58 </div>
59 </div>
1760
18 <div class="right-main"><div id="reports-main" class="fila clearfix">
19 <h2 class="ws-label">
20 <span id="ws-name" class="label label-default"
21 title="Current workspace">Status report for {{ workspace }} ({{vulns.length}} vulns)</span><!-- WS name -->
22
23 <div id="ws-control" class="btn-group">
24 <button file-exporter="toCSV()" type="button" class="btn btn-success" title="Download CSV for current workspace">
25 <span class="glyphicon glyphicon-download"></span>
26 </button>
27 <button id="refresh" type="button" class="btn btn-danger" title="Refresh current workspace" ng-click="location.reload()">
28 <span class="glyphicon glyphicon-refresh"></span>
29 </button>
30 <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" title="Change current workspace">
31 Change workspace <span class="caret"></span>
32 </button>
33 <ul id="nav" class="dropdown-menu dropdown-menu-right" role="menu">
34 <li ng-repeat="ws in workspaces"><a href="#/status/ws/{{ws}}" class="ws" >{{ws}}</a></li>
35 </ul><!-- WS navigation -->
36 </div><!-- #ws-control -->
37 <button id="delete" type="button" class="btn btn-danger" title="Delete selected items" ng-click="delete()">
38 Delete
39 </button>
40 <button id="merge" type="button" class="btn btn-danger" title="Edit selected vulns" ng-click="edit()">
41 Edit
42 </button>
43 <button id="new" type="button" class="btn btn-success" title="New Vulns" ng-click="new()">
44 New
45 </button>
46 </h2><!-- .ws-label -->
47 <div class="reports">
48 <h3><span class="label label-default" title="Add columns">Add columns</span></h3>
49 <div class="columns">
50 <div class="label-list ws-link" ng-repeat="(column, show) in columns">
51 <a href="" class="ws-link" ng-click="toggleShow(column, show)" ng-show="!show">
52 <h1 class="label label-primary ws-name">{{column}}</h1>
53 </a>
54 </div><!-- label-list -->
55 </div><!-- .columns -->
56 <form style="margin: 10px !important;" role="form">
57 <div class="form-group">
58 <label class="sr-only" for="filter-by">Filter by</label>
59 <input type="text" class="form-control input-sm" id="filter-by" placeholder="Filter by" ng-model="query">
60 </div>
61 </form>
62 <table class="csv-export status-report">
61 <table class="csv-export status-report table table-responsive">
6362 <thead>
6463 <tr>
64 <th><input type="checkbox" ng-model="selectall" ng-click="checkAll()"/></th>
6565 <th ng-if="columns.date">
66 <a href="" ng-click="toggleSort('date')">Date</a>
6667 <a href="" ng-click="toggleShow('date', true)"><span class="glyphicon glyphicon-remove"></span></a>
67 <a href="" ng-click="toggleSort('date')">Date</a>
6868 </th>
6969 <th ng-if="columns.target">
70 <a href="" ng-click="toggleSort('target')">Target</a>
7071 <a href="" ng-click="toggleShow('target', true)"><span class="glyphicon glyphicon-remove"></span></a>
71 <a href="" ng-click="toggleSort('target')">Target</a>
7272 </th>
7373 <th ng-if="columns.status">
74 <a href="" ng-click="toggleSort('status')">Status</a>
7475 <a href="" ng-click="toggleShow('status', true)"><span class="glyphicon glyphicon-remove"></span></a>
75 <a href="" ng-click="toggleSort('status')">Status</a>
7676 </th>
7777 <th ng-if="columns.severity">
78 <a href="" ng-click="toggleSort('severity')">Severity</a>
7879 <a href="" ng-click="toggleShow('severity', true)"><span class="glyphicon glyphicon-remove"></span></a>
79 <a href="" ng-click="toggleSort('severity')">Severity</a>
8080 </th>
8181 <th ng-if="columns.name">
82 <a href="" ng-click="toggleSort('name')">Name</a>
8283 <a href="" ng-click="toggleShow('name', true)"><span class="glyphicon glyphicon-remove"></span></a>
83 <a href="" ng-click="toggleSort('name')">Name</a>
8484 </th>
8585 <th ng-if="columns.desc">
86 <a href="" ng-click="toggleSort('desc')">Desc</a>
8687 <a href="" ng-click="toggleShow('desc', true)"><span class="glyphicon glyphicon-remove"></span></a>
87 <a href="" ng-click="toggleSort('desc')">Desc</a>
8888 </th>
8989 <th ng-if="columns.data">
90 <a href="" ng-click="toggleSort('data')">Data</a>
9091 <a href="" ng-click="toggleShow('data', true)"><span class="glyphicon glyphicon-remove"></span></a>
91 <a href="" ng-click="toggleSort('data')">Data</a>
9292 </th>
9393 <th ng-if="columns.method">
94 <a href="" ng-click="toggleSort('method')">Method</a>
9495 <a href="" ng-click="toggleShow('method', true)"><span class="glyphicon glyphicon-remove"></span></a>
95 <a href="" ng-click="toggleSort('method')">Method</a>
9696 </th>
9797 <th ng-if="columns.path">
98 <a href="" ng-click="toggleSort('path')">Path</a>
9899 <a href="" ng-click="toggleShow('path', true)"><span class="glyphicon glyphicon-remove"></span></a>
99 <a href="" ng-click="toggleSort('path')">Path</a>
100100 </th>
101101 <th ng-if="columns.pname">
102 <a href="" ng-click="toggleSort('pname')">Param Name</a>
102103 <a href="" ng-click="toggleShow('pname', true)"><span class="glyphicon glyphicon-remove"></span></a>
103 <a href="" ng-click="toggleSort('pname')">Param Name</a>
104104 </th>
105105 <th ng-if="columns.params">
106 <a href="" ng-click="toggleSort('params')">Params</a>
106107 <a href="" ng-click="toggleShow('params', true)"><span class="glyphicon glyphicon-remove"></span></a>
107 <a href="" ng-click="toggleSort('params')">Params</a>
108108 </th>
109109 <th ng-if="columns.query">
110 <a href="" ng-click="toggleSort('query')">Query</a>
110111 <a href="" ng-click="toggleShow('query', true)"><span class="glyphicon glyphicon-remove"></span></a>
111 <a href="" ng-click="toggleSort('query')">Query</a>
112112 </th>
113113 <th ng-if="columns.request">
114 <a href="" ng-click="toggleSort('request')">Request</a>
114115 <a href="" ng-click="toggleShow('request', true)"><span class="glyphicon glyphicon-remove"></span></a>
115 <a href="" ng-click="toggleSort('request')">Request</a>
116116 </th>
117117 <th ng-if="columns.response">
118 <a href="" ng-click="toggleSort('response')">Response</a>
118119 <a href="" ng-click="toggleShow('response', true)"><span class="glyphicon glyphicon-remove"></span></a>
119 <a href="" ng-click="toggleSort('response')">Response</a>
120 </th>
121 <th ng-if="columns.resolution">
122 <a href="" ng-click="toggleSort('resolution')">Resolution</a>
123 <a href="" ng-click="toggleShow('resolution', true)"><span class="glyphicon glyphicon-remove"></span></a>
120124 </th>
121125 <th ng-if="columns.web">
126 <a href="" ng-click="toggleSort('web')">Web</a>
122127 <a href="" ng-click="toggleShow('web', true)"><span class="glyphicon glyphicon-remove"></span></a>
123 <a href="" ng-click="toggleSort('web')">Web</a>
124128 </th>
125129 <th ng-if="columns.website">
130 <a href="" ng-click="toggleSort('website')">Website</a>
126131 <a href="" ng-click="toggleShow('website', true)"><span class="glyphicon glyphicon-remove"></span></a>
127 <a href="" ng-click="toggleSort('website')">Website</a>
128 </th>
129 <th><input type="checkbox" ng-model="selectall" ng-click="checkAll()"/></th>
132 </th>
133 <th ng-if="columns.refs">
134 <a href="" ng-click="toggleSort('refs')">References</a>
135 <a href="" ng-click="toggleShow('refs', true)"><span class="glyphicon glyphicon-remove"></span></a>
136 <th ng-if="columns.evidence">
137 <a href="" ng-click="toggleSort('attachments')">Evidence</a>
138 <a href="" ng-click="toggleShow('evidence', true)"><span class="glyphicon glyphicon-remove"></span></a>
139 </th>
140 <th ng-if="columns.impact">
141 <a href="" ng-click="toggleSort('impact')">Impact</a>
142 <a href="" ng-click="toggleShow('impact', true)"><span class="glyphicon glyphicon-remove"></span></a>
143 </th>
144 <th ng-if="columns.easeofresolution">
145 <a href="" ng-click="toggleSort('easeofresolution')">Ease of Resolution</a>
146 <a href="" ng-click="toggleShow('easeofresolution', true)"><span class="glyphicon glyphicon-remove"></span></a>
147 </th>
130148 </tr>
131149 </thead>
132150 <tbody>
133 <tr ng-repeat="v in vulns | filter:query | orderBy:sortField:reverse"
134 selection-model selection-model-type="checkbox"
151 <tr ng-repeat="v in vulns | filter:query | orderObjectBy:sortField:reverse | startFrom:currentPage*pageSize | limitTo:pageSize"
152 selection-model selection-model-type="checkbox"
135153 selection-model-mode="multiple-additive"
136154 selection-model-selected-class="multi-selected">
137 <td ng-if="columns.date">{{v.date}}</td>
155 <td><input type="checkbox" name="{{v.id}}"/></td>
156 <td ng-if="columns.date">{{v.date | date:'MM/dd/yyyy'}}</td>
138157 <td ng-if="columns.target">{{v.target}}</td>
139158 <td ng-if="columns.status">Vulnerable</td>
140 <td ng-if="columns.severity" class="fondo-{{v.severity}}">{{v.severity}}</td>
159 <td ng-if="columns.severity"><span class="label vuln fondo-{{v.severity}}">{{v.severity}}</span></td>
141160 <td ng-if="columns.name">{{v.name}}</td>
142161 <td ng-if="columns.desc" text-collapse text-collapse-max-length="150" text-collapse-text="{{v.desc}}"></td>
143162 <td ng-if="columns.data" text-collapse text-collapse-max-length="150" text-collapse-text="{{v.data}}"></td>
148167 <td ng-if="columns.query">{{v.query}}</td>
149168 <td ng-if="columns.request" text-collapse text-collapse-max-length="100" text-collapse-text="{{v.request}}"></td>
150169 <td ng-if="columns.response" text-collapse text-collapse-max-length="100" text-collapse-text="{{v.response}}"></td>
170 <td ng-if="columns.resolution">{{v.resolution}}</td>
151171 <td ng-if="columns.web">
152172 <span class="glyphicon glyphicon-ok" ng-show="v.web"></span>
153173 <span class="glyphicon glyphicon-remove" ng-show="!v.web"></span>
154174 </td>
155175 <td ng-if="columns.website">{{v.website}}</td>
156 <td><input type="checkbox" name="{{v.id}}"/></td>
176 <td ng-if="columns.refs"><p ng-repeat="refs in v.refs">{{refs}}</p></td>
177 <td ng-if="columns.evidence">
178 <div ng-repeat="e in v.attachments track by $index">
179 <a href="{{baseurl + workspace}}/{{ v.id}}/{{e}}" target="_blank">{{e}}</a>
180 </div>
181 </td>
182 <td ng-if="columns.impact">
183 <div ng-repeat="(impact, rating) in v.impact">
184 <p ng-if="rating">{{impact}}</p>
185 </div>
186 </td>
187 <td ng-if="columns.easeofresolution">{{v.easeofresolution}}</td>
157188 </tr>
158189 </tbody>
159190 </table><!-- #hosts -->
191 <div class="showPagination" ng-show="showPagination">
192 <div class="form-group">
193 <ul class="pagination">
194 <li><a ng-hide="currentPage == 0" ng-click="currentPage=currentPage-1"><span aria-hidden="true">&laquo;</span><span class="sr-only">Previous</span></a></li>
195 <li><a>{{currentPage}}/{{numberOfPages()}}</a></li>
196 <li><a ng-hide="currentPage >= numberOfPages()" ng-click="currentPage=currentPage+1"><span aria-hidden="true">&raquo;</span><span class="sr-only">Next</span></a></li>
197 </ul>
198 <form name="goToPage" id="goToPageStatus">
199 <div class="col-md-2">
200 <input type="number" min="0" max="{{numberOfPages()}}" class="form-control" ng-model="go_page" placeholder="Go to page"/>
201 </div>
202 <button class="btn btn-default" ng-click="go()">GO</button>
203 <input type="number" min="0" class="form-control vuln_per_page" ng-model="pagination" placeholder="Numbre page" />
204 </form>
205 </div>
206 </div>
160207 </div><!-- .reports -->
161208 </div><!-- #reports-main --></div><!-- .right-main -->
162209 </section><!-- #main -->
0 <section id="main" class="seccion clearfix">
1 <aside class="left-nav">
2 <nav>
3 <ul>
4 <li>
5 <a href="../././reports/index.html#{{workspace}}" class="ws-dashboard" style="color: #ffffff !important" title="WS Dashboard">
6 <img class="ws-dashboard" src="images/ico-graph.png" alt="WS Dashboard"/>
7 </a>
8 </li>
9 <li>
10 <a href="../././reports/faraday.html#/status/ws/{{workspace}}" class="status-report" style="color: #ffffff !important" title="Status Report">
11 <h2><span class="glyphicon glyphicon-list" title="Status Report"></span></h2>
12 </a>
13 </li>
14 </ul>
15 </nav>
16 </aside>
17
18 <div class="right-main"><div id="reports-main" class="fila clearfix">
19 <h2 class="ws-label">
20 <span id="ws-name" class="label label-default"
21 title="Current workspace">All available sections</span><!-- WS name -->
22 </h2><!-- .ws-label -->
23 <div class="reports">
24 <div class="ws-list">
25 <a href="#/status/ws/{{ws}}" class="ws-link" ng-repeat="ws in wss"><p class="label label-success ws-name">{{ws}}</p></a>
26 </div><!-- .ws-list -->
27 </div><!-- .reports -->
28 </div><!-- #reports-main --></div><!-- .right-main -->
29 </section>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3 <section id="main" class="seccion clearfix">
4 <div class="right-main"><div id="reports-main" class="fila clearfix">
5 <div class="jumbotron">
6 <h1><b>Welcome!</b></h1>
7 <p>These are your available workspaces</p>
8 </div><!-- .jumbotron -->
9 <div class="reports normal-size">
10 <table class="status-report table-striped table-responsive table-hover">
11 <thead>
12 <tr>
13 <th>Name</th>
14 <th>Vulns</th>
15 <th>Hosts</th>
16 <th>Services</th>
17 </tr>
18 </thead>
19 <tbody>
20 <tr ng-repeat="ws in wss">
21 <td><a href="#/{{hash}}/ws/{{ws}}"><span ng-class-even="'label label-unclassified'" ng-class-odd="'label label-high'">{{ws}}</span></a></td>
22 <td ng-bind="objects[ws]['total vulns']"></td>
23 <td ng-bind="objects[ws]['hosts']"></td>
24 <td ng-bind="objects[ws]['services']"></td>
25 </tr>
26 </tbody>
27 </table>
28 </div><!-- .reports -->
29 </div><!-- #reports-main --></div><!-- .right-main -->
30 </section>
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .controller('statusReportCtrl',
2 ['$scope', '$filter', '$route', '$routeParams', '$modal', '$log', 'statusReportFact',
3 function($scope, $filter, $route, $routeParams, $modal, $log, statusReportFact) {
4 $scope.$log = $log;
6 ['$scope', '$filter', '$route', '$routeParams', '$modal', 'BASEURL', 'SEVERITIES', 'EASEOFRESOLUTION', 'statusReportFact',
7 function($scope, $filter, $route, $routeParams, $modal, BASEURL, SEVERITIES, EASEOFRESOLUTION, statusReportFact) {
8 $scope.baseurl = BASEURL;
9 $scope.severities = SEVERITIES;
10 $scope.easeofresolution = EASEOFRESOLUTION;
11
512 $scope.sortField = 'date';
613 $scope.reverse = true;
14 $scope.showPagination = 1;
15 $scope.currentPage = 0;
16 $scope.pageSize = 10;
17 $scope.pagination = 10;
18
719 // load all workspaces
8 statusReportFact.getWorkspaces(function(wss) {
20 statusReportFact.getWorkspaces().then(function(wss) {
921 $scope.workspaces = wss;
1022 });
23
1124 // current workspace
1225 $scope.workspace = $routeParams.wsId;
26
1327 // load all vulnerabilities
1428 $scope.vulns = statusReportFact.getVulns($scope.workspace);
29
1530 // toggles column show property
1631 $scope.toggleShow = function(column, show) {
1732 $scope.columns[column] = !show;
3550
3651 // set columns to show and hide by default
3752 $scope.columns = {
38 "data": true,
39 "date": true,
40 "desc": true,
41 "method": false,
42 "name": true,
43 "params": false,
44 "path": false,
45 "pname": false,
46 "query": false,
47 "request": false,
48 "response": false,
49 "severity": true,
50 "status": false,
51 "target": true,
52 "web": false,
53 "website": false
54 };
55
56 $scope.severities = [
57 "critical",
58 "high",
59 "med",
60 "low",
61 "info",
62 "unclassified",
63
64 ];
53 "data": true,
54 "date": true,
55 "desc": true,
56 "easeofresolution": false,
57 "evidence": false,
58 "impact": false,
59 "method": false,
60 "name": true,
61 "params": false,
62 "path": false,
63 "pname": false,
64 "query": false,
65 "refs": true,
66 "request": false,
67 "response": false,
68 "resolution": false,
69 "severity": true,
70 "status": false,
71 "target": true,
72 "web": false,
73 "website": false
74 };
6575
6676 // returns scope vulns as CSV obj
6777 // toggles column sort field
6878 $scope.cleanCSV = function(field) {
69 return field.replace(/\n[ ]*\n/g, "").replace(/\"/g, "'").replace(/[\n\r]/g, "%20").replace(/[,]/g, "%2c");;
70 };
79 return field.replace(/\n[ ]*\n/g, "").replace(/\"/g, "'").replace(/[\n\r]/g, "%0A").replace(/[,]/g, "%2c");
80 };
81 $scope.ToString = function(array){
82 return array.toString();
83 };
84
7185 $scope.toCSV = function() {
72 var method = "";
73 var website = "";
74 var desc = "";
75 var text = "";
76 var path = "";
77 var pname = "";
78 var params = "";
79 var query = "";
80 var request = "";
81 var response = "";
82
83 var content = "\"Date\", \"Web\", \"Status\", \"Severity\", "+
86 var method = "",
87 website = "",
88 desc = "",
89 easeofres = "",
90 impact = "",
91 text = "",
92 path = "",
93 pname = "",
94 params = "",
95 query = "",
96 refs = "",
97 request = "",
98 response = "",
99 resolution = "",
100 content = "\"Date\", \"Web\", \"Status\", \"Severity\", "+
84101 "\"Name\", \"Target\", \"Description\", "+
85102 "\"Data\", \"Method\", \"Path\", \"Param Name\", \"Params\", "+
86 "\"Query\", \"Request\", \"Response\", \"Website\" \n";
103 "\"Query\", \"References\", \"Request\", \"Response\", \"Resolution\",\"Website\", "+
104 "\"Ease of Resolution\", \"Impact\"\n";
87105
88106 $scope.vulns.forEach(function(v) {
89107 method = "";
90108 website = "";
91109 desc = "";
110 easeofres = "",
111 impact = JSON.stringify(v.impact),
92112 text = "";
93113 path = "";
94114 pname = "";
95115 params = "";
96116 query = "";
117 refs = "";
97118 request = "";
98119 response = "";
99
100 if(typeof(v.desc) != "undefined") desc = $scope.cleanCSV(v.desc);
101 if(typeof(v.data) != "undefined") text = $scope.cleanCSV(v.data);
120 resolution = "";
121 refs = $scope.ToString(v.refs);
122
123 if(typeof(v.desc) != "undefined" && v.desc != null) desc = $scope.cleanCSV(v.desc);
124 if(typeof(v.data) != "undefined" && v.data != null) text = $scope.cleanCSV(v.data);
125 if(typeof(v.resolution) != "undefined" && v.resolution != null) resolution = $scope.cleanCSV(v.resolution);
126 if(typeof(refs) != "undefined" && refs != null){
127 refs = $scope.cleanCSV(refs);
128 refs = refs.replace(/%2c/g,"%0A");
129 }
130 if(typeof(impact) != "undefined" && impact != null){
131 impact = $scope.cleanCSV(impact);
132 impact = impact.replace(/%2c/g,"%0A");
133 }
102134 if(v.type === "VulnerabilityWeb") {
103 if(typeof(v.method) != "undefined") method = $scope.cleanCSV(v.method);
104 if(typeof(v.website) != "undefined") website = $scope.cleanCSV(v.website);
105 if(typeof(v.path) != "undefined") path = $scope.cleanCSV(v.path);
106 if(typeof(v.pname) != "undefined") pname = $scope.cleanCSV(v.pname);
107 if(typeof(v.params) != "undefined") params = $scope.cleanCSV(v.params);
108 if(typeof(v.query) != "undefined") query = $scope.cleanCSV(v.query);
109 if(typeof(v.request) != "undefined") request = $scope.cleanCSV(v.request);
110 if(typeof(v.response) != "undefined") response = $scope.cleanCSV(v.response);
135 if(typeof(v.method) != "undefined" && v.method != null) method = $scope.cleanCSV(v.method);
136 if(typeof(v.website) != "undefined" && v.website != null) website = $scope.cleanCSV(v.website);
137 if(typeof(v.path) != "undefined" && v.path != null) path = $scope.cleanCSV(v.path);
138 if(typeof(v.pname) != "undefined" && v.pname != null) pname = $scope.cleanCSV(v.pname);
139 if(typeof(v.params) != "undefined" && v.params != null) params = $scope.cleanCSV(v.params);
140 if(typeof(v.query) != "undefined" && v.query != null) query = $scope.cleanCSV(v.query);
141 if(typeof(refs) != "undefined" && refs != null){
142 refs = $scope.cleanCSV(refs);
143 refs = refs.replace(/%2c/g,"%0A");
144 }
145 if(typeof(v.request) != "undefined" && v.request != null) request = $scope.cleanCSV(v.request);
146 if(typeof(v.response) != "undefined" && v.response != null) response = $scope.cleanCSV(v.response);
147 if(typeof(v.resolution) != "undefined" && v.resolution != null) resolution = $scope.cleanCSV(v.resolution);
111148 }
112149
113150 content += "\""+v.date+"\","+
123160 " \""+pname+"\","+
124161 " \""+params+"\","+
125162 " \""+query+"\","+
163 " \""+refs+"\","+
126164 " \""+request+"\","+
127165 " \""+response+"\","+
128 " \""+website+"\""+
166 " \""+resolution+"\","+
167 " \""+website+"\","+
168 " \""+impact+"\","+
169 " \""+easeofres+"\""+
129170 "\n";
130171 });
131172
156197 // updates all vulns with selected == true
157198 $scope.update = function(data) {
158199 $scope.vulns = [];
159
200
160201 data.vulns.forEach(function(v) {
161202 if(v.selected) {
162203 if(typeof(data.severity) == "string") v.severity = data.severity;
204 if(typeof(data.easeofresolution) == "string") v.easeofresolution = data.easeofresolution;
163205 if(typeof(data.name) != "undefined") v.name = data.name;
164206 if(typeof(data.desc) != "undefined") v.desc = data.desc;
165207 if(typeof(data.data) != "undefined") v.data = data.data;
208 if(typeof(data.refs) != "undefined") v.refs = data.refs;
209 if(typeof(data.impact) != "undefined") v.impact = data.impact;
210 if(typeof(data.resolution) != "undefined") v.resolution = data.resolution;
211 v.evidence = data.evidence;
166212 if(v.web) {
167213 if(typeof(data.method) != "undefined") v.method = data.method;
168214 if(typeof(data.params) != "undefined") v.params = data.params;
169215 if(typeof(data.path) != "undefined") v.path = data.path;
170216 if(typeof(data.pname) != "undefined") v.pname = data.pname;
171217 if(typeof(data.query) != "undefined") v.query = data.query;
218 if(typeof(data.refs) != "undefined") v.refs = data.refs;
172219 if(typeof(data.request) != "undefined") v.request = data.request;
173220 if(typeof(data.response) != "undefined") v.response = data.response;
221 if(typeof(data.resolution) != "undefined") v.resolution = data.resolution;
174222 if(typeof(data.website) != "undefined") v.website = data.website;
175223 }
176224
177 statusReportFact.putVulns($scope.workspace, v, function(rev) {
225 statusReportFact.putVulns($scope.workspace, v, function(rev, evidence) {
178226 v.rev = rev;
227 v.attachments = evidence;
179228 });
180229 v.selected = false;
181230 }
263312 };
264313
265314 $scope.insert = function(vuln){
266 statusReportFact.putVulns($scope.workspace, vuln, function(rev) {
315 statusReportFact.putVulns($scope.workspace, vuln, function(rev, evidence) {
267316 vuln.rev = rev;
317 vuln.attachments = evidence;
268318 });
269319 //formating the date
270320 var d = new Date(0);
305355 v.selected = $scope.selectall;
306356 });
307357 };
358
359 $scope.numberOfPages = function() {
360 $scope.filteredData = $filter('filter')($scope.vulns,$scope.query);
361 if ($scope.filteredData.length <= 10){
362 $scope.showPagination = 0;
363 } else {
364 $scope.showPagination = 1;
365 };
366 return parseInt($scope.filteredData.length/$scope.pageSize);
367 }
368
369 $scope.go = function(){
370 if($scope.go_page < $scope.numberOfPages()+1 && $scope.go_page > -1){
371 $scope.currentPage = $scope.go_page;
372 }
373 $scope.pageSize = $scope.pagination;
374 if($scope.go_page > $scope.numberOfPages()){
375 $scope.currentPage = 0;
376 }
377 }
308378 }]);
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .directive('textCollapse', ['$compile', 'commons', function($compile, commons) {
5 .directive('textCollapse', ['$compile', 'commonsFact', function($compile, commons) {
26 return {
37 restrict: 'A',
48 replace: true,
+0
-182
views/reports/_attachments/scripts/statusReport/services/commons.js less more
0 angular.module('faradayApp')
1 .factory('commons', function() {
2 var commons = {};
3
4 commons.htmlentities = function(string, quote_style, charset, double_encode) {
5 var hash_map = commons.translationtable('HTML_ENTITIES', quote_style), symbol = '';
6 string = string == null ? '' : string + '';
7
8 if (!hash_map) {
9 return false;
10 }
11
12 if (quote_style && quote_style === 'ENT_QUOTES') {
13 hash_map["'"] = '&#039;';
14 }
15
16 if ( !! double_encode || double_encode == null) {
17 for (symbol in hash_map) {
18 if (hash_map.hasOwnProperty(symbol)) {
19 string = string.split(symbol)
20 .join(hash_map[symbol]);
21 }
22 }
23 } else {
24 string = string.replace(/([\s\S]*?)(&(?:#\d+|#x[\da-f]+|[a-zA-Z][\da-z]*);|$)/g, function (ignore, text, entity) {
25 for (symbol in hash_map) {
26 if (hash_map.hasOwnProperty(symbol)) {
27 text = text.split(symbol)
28 .join(hash_map[symbol]);
29 }
30 }
31 return text + entity;
32 });
33 }
34 return string;
35 };
36
37 commons.translationtable = function(table, quote_style) {
38 var entities = {},
39 hash_map = {},
40 decimal;
41 var constMappingTable = {},
42 constMappingQuoteStyle = {};
43 var useTable = {},
44 useQuoteStyle = {};
45
46 // Translate arguments
47 constMappingTable[0] = 'HTML_SPECIALCHARS';
48 constMappingTable[1] = 'HTML_ENTITIES';
49 constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
50 constMappingQuoteStyle[2] = 'ENT_COMPAT';
51 constMappingQuoteStyle[3] = 'ENT_QUOTES';
52
53 useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
54 useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() :
55 'ENT_COMPAT';
56
57 if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
58 throw new Error('Table: ' + useTable + ' not supported');
59 }
60
61 entities['38'] = '&amp;';
62 if (useTable === 'HTML_ENTITIES') {
63 entities['160'] = '&nbsp;';
64 entities['161'] = '&iexcl;';
65 entities['162'] = '&cent;';
66 entities['163'] = '&pound;';
67 entities['164'] = '&curren;';
68 entities['165'] = '&yen;';
69 entities['166'] = '&brvbar;';
70 entities['167'] = '&sect;';
71 entities['168'] = '&uml;';
72 entities['169'] = '&copy;';
73 entities['170'] = '&ordf;';
74 entities['171'] = '&laquo;';
75 entities['172'] = '&not;';
76 entities['173'] = '&shy;';
77 entities['174'] = '&reg;';
78 entities['175'] = '&macr;';
79 entities['176'] = '&deg;';
80 entities['177'] = '&plusmn;';
81 entities['178'] = '&sup2;';
82 entities['179'] = '&sup3;';
83 entities['180'] = '&acute;';
84 entities['181'] = '&micro;';
85 entities['182'] = '&para;';
86 entities['183'] = '&middot;';
87 entities['184'] = '&cedil;';
88 entities['185'] = '&sup1;';
89 entities['186'] = '&ordm;';
90 entities['187'] = '&raquo;';
91 entities['188'] = '&frac14;';
92 entities['189'] = '&frac12;';
93 entities['190'] = '&frac34;';
94 entities['191'] = '&iquest;';
95 entities['192'] = '&Agrave;';
96 entities['193'] = '&Aacute;';
97 entities['194'] = '&Acirc;';
98 entities['195'] = '&Atilde;';
99 entities['196'] = '&Auml;';
100 entities['197'] = '&Aring;';
101 entities['198'] = '&AElig;';
102 entities['199'] = '&Ccedil;';
103 entities['200'] = '&Egrave;';
104 entities['201'] = '&Eacute;';
105 entities['202'] = '&Ecirc;';
106 entities['203'] = '&Euml;';
107 entities['204'] = '&Igrave;';
108 entities['205'] = '&Iacute;';
109 entities['206'] = '&Icirc;';
110 entities['207'] = '&Iuml;';
111 entities['208'] = '&ETH;';
112 entities['209'] = '&Ntilde;';
113 entities['210'] = '&Ograve;';
114 entities['211'] = '&Oacute;';
115 entities['212'] = '&Ocirc;';
116 entities['213'] = '&Otilde;';
117 entities['214'] = '&Ouml;';
118 entities['215'] = '&times;';
119 entities['216'] = '&Oslash;';
120 entities['217'] = '&Ugrave;';
121 entities['218'] = '&Uacute;';
122 entities['219'] = '&Ucirc;';
123 entities['220'] = '&Uuml;';
124 entities['221'] = '&Yacute;';
125 entities['222'] = '&THORN;';
126 entities['223'] = '&szlig;';
127 entities['224'] = '&agrave;';
128 entities['225'] = '&aacute;';
129 entities['226'] = '&acirc;';
130 entities['227'] = '&atilde;';
131 entities['228'] = '&auml;';
132 entities['229'] = '&aring;';
133 entities['230'] = '&aelig;';
134 entities['231'] = '&ccedil;';
135 entities['232'] = '&egrave;';
136 entities['233'] = '&eacute;';
137 entities['234'] = '&ecirc;';
138 entities['235'] = '&euml;';
139 entities['236'] = '&igrave;';
140 entities['237'] = '&iacute;';
141 entities['238'] = '&icirc;';
142 entities['239'] = '&iuml;';
143 entities['240'] = '&eth;';
144 entities['241'] = '&ntilde;';
145 entities['242'] = '&ograve;';
146 entities['243'] = '&oacute;';
147 entities['244'] = '&ocirc;';
148 entities['245'] = '&otilde;';
149 entities['246'] = '&ouml;';
150 entities['247'] = '&divide;';
151 entities['248'] = '&oslash;';
152 entities['249'] = '&ugrave;';
153 entities['250'] = '&uacute;';
154 entities['251'] = '&ucirc;';
155 entities['252'] = '&uuml;';
156 entities['253'] = '&yacute;';
157 entities['254'] = '&thorn;';
158 entities['255'] = '&yuml;';
159 }
160
161 if (useQuoteStyle !== 'ENT_NOQUOTES') {
162 entities['34'] = '&quot;';
163 }
164 if (useQuoteStyle === 'ENT_QUOTES') {
165 entities['39'] = '&#39;';
166 }
167 entities['60'] = '&lt;';
168 entities['62'] = '&gt;';
169
170 // ascii decimals to real symbols
171 for (decimal in entities) {
172 if (entities.hasOwnProperty(decimal)) {
173 hash_map[String.fromCharCode(decimal)] = entities[decimal];
174 }
175 }
176
177 return hash_map;
178 }
179
180 return commons;
181 });
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .factory('statusReportFact', ['vulnsFact', 'vulnsWebFact', 'hostsFact', 'workspacesFact', function(vulnsFact, vulnsWebFact, hostsFact, wsFact) {
5 .factory('statusReportFact', ['vulnsFact', 'vulnsWebFact', 'hostsFact', 'workspacesFact', function(vulnsFact, vulnsWebFact, hostsFact, workspacesFact) {
26 var statusReportFact = {};
37
48 statusReportFact.getVulns = function(ws) {
610 var vulnsWeb = vulnsWebFact.get(ws);
711 var hosts = hostsFact.get(ws);
812 vulns.forEach(function(element, index, array) {
9 element.target = hosts[element.parent].name;
13 if (element.parent in hosts) {
14 element.target = hosts[element.parent].name;
15 }
1016 });
1117 vulnsWeb.forEach(function(element, index, array) {
12 element.target = hosts[element.parent].name;
18 if (element.parent in hosts) {
19 element.target = hosts[element.parent].name;
20 }
1321 });
1422 return vulnsWeb.concat(vulns);
1523 };
2634 vulnsFact.remove(ws, vuln);
2735 };
2836
29 statusReportFact.getWorkspaces = function(callback) {
30 wsFact.get(callback);
37 statusReportFact.getWorkspaces = function() {
38 return workspacesFact.list();
3139 };
3240
3341 return statusReportFact;
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
15 .factory('targetFact', ['BASEURL', '$http', function(BASEURL, $http) {
26 var targetFact = {};
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .factory('vulnsFact', ['BASEURL', '$http', function(BASEURL, $http) {
5 .factory('vulnsFact', ['BASEURL', '$http', '$q', 'attachmentsFact', function(BASEURL, $http, $q, attachmentsFact) {
26 var vulnsFact = {};
37
48 vulnsFact.get = function(ws) {
711 // gets vulns json from couch
812 $.getJSON(vulns_url, function(data) {
913 $.each(data.rows, function(n, obj){
10 var d = new Date(0);
11 d.setUTCSeconds(obj.value.date);
12 d = d.getDate() + "/" + (d.getMonth() + 1) + "/" + d.getFullYear();
14 var evidence = [],
15 date = obj.value.date * 1000;
16 if(typeof(obj.value.attachments) != undefined && obj.value.attachments != undefined) {
17 for(var attachment in obj.value.attachments) {
18 evidence.push(attachment);
19 }
20 }
1321 var v = {
14 "id": obj.id,
15 "rev": obj.value.rev,
16 "couch_parent": obj.value.parent,
17 "data": obj.value.data,
18 "date": d,
19 "delete": false,
20 "desc": obj.value.desc,
21 "meta": obj.value.meta,
22 "name": obj.value.name,
23 "oid": obj.value.oid,
24 "owned": obj.value.owned,
25 "owner": obj.value.owner,
26 "parent": obj.key.substring(0, obj.key.indexOf('.')),
27 "refs": obj.value.refs,
28 "selected": false,
29 "severity": obj.value.severity,
30 "type": obj.value.type,
31 "web": false
22 "id": obj.id,
23 "rev": obj.value.rev,
24 "attachments": evidence,
25 "couch_parent": obj.value.parent,
26 "data": obj.value.data,
27 "date": date,
28 "delete": false,
29 "desc": obj.value.desc,
30 "easeofresolution": obj.value.easeofresolution,
31 "impact": obj.value.impact,
32 "meta": obj.value.meta,
33 "name": obj.value.name,
34 "oid": obj.value.oid,
35 "owned": obj.value.owned,
36 "owner": obj.value.owner,
37 "parent": obj.key.substring(0, obj.key.indexOf('.')),
38 "refs": obj.value.refs,
39 "resolution": obj.value.resolution,
40 "selected": false,
41 "severity": obj.value.severity,
42 "type": obj.value.type,
43 "web": false
3244 };
3345 vulns.push(v);
3446 });
3749 }
3850
3951 vulnsFact.put = function(ws, vuln, callback) {
40 var url = BASEURL + ws + "/" + vuln.id;
41 var v = {
42 "_rev": vuln.rev,
43 "data": vuln.data,
44 "desc": vuln.desc,
45 "metadata": vuln.meta,
46 "name": vuln.name,
47 "obj_id": vuln.oid,
48 "owned": vuln.owned,
49 "owner": vuln.owner,
50 "parent": vuln.couch_parent,
51 "refs": vuln.refs,
52 "severity": vuln.severity,
53 "type": vuln.type
52 var url = BASEURL + ws + "/" + vuln.id,
53 v = {
54 "_rev": vuln.rev,
55 "data": vuln.data,
56 "desc": vuln.desc,
57 "easeofresolution": vuln.easeofresolution,
58 "impact": vuln.impact,
59 "metadata": vuln.meta,
60 "name": vuln.name,
61 "obj_id": vuln.oid,
62 "owned": vuln.owned,
63 "owner": vuln.owner,
64 "parent": vuln.couch_parent,
65 "refs": vuln.refs,
66 "resolution": vuln.resolution,
67 "severity": vuln.severity,
68 "type": vuln.type
5469 };
55 $http.put(url, v).success(function(d, s, h, c) {
56 callback(d.rev);
57 });
70 if(typeof(vuln.evidence) != undefined && vuln.evidence != undefined) {
71 // the list of evidence may have mixed objects, some of them already in CouchDB, some of them new
72 // new attachments are of File type and need to be processed by attachmentsFact.loadAttachments
73 // old attachments are of type String (file name) and need to be processed by attachmentsFact.getStubs
74 var stubs = [],
75 files = [],
76 names = [],
77 promises = [];
78 v._attachments = {};
79
80 for(var name in vuln.evidence) {
81 if(vuln.evidence[name] instanceof File) {
82 files.push(vuln.evidence[name]);
83 } else {
84 stubs.push(name);
85 }
86 }
87
88 if(stubs.length > 0) promises.push(attachmentsFact.getStubs(ws, vuln.id, stubs));
89 if(files.length > 0) promises.push(attachmentsFact.loadAttachments(files));
90
91 $q.all(promises).then(function(result) {
92 result.forEach(function(atts) {
93 for(var name in atts) {
94 v._attachments[name] = atts[name];
95 names.push(name);
96 }
97 });
98 $http.put(url, v).success(function(d, s, h, c) {
99 callback(d.rev, names);
100 });
101 });
102 } else {
103 $http.put(url, v).success(function(d, s, h, c) {
104 callback(d.rev, []);
105 });
106 }
58107 };
59108
60109 vulnsFact.remove = function(ws, vuln) {
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .factory('vulnsWebFact', ['BASEURL', '$http', function(BASEURL, $http) {
5 .factory('vulnsWebFact', ['BASEURL', '$http', '$q', 'attachmentsFact', function(BASEURL, $http, $q, attachmentsFact) {
26 var vulnsWebFact = {};
37
48 vulnsWebFact.get = function(ws) {
711 // gets vulns json from couch
812 $.getJSON(vulns_url, function(data) {
913 $.each(data.rows, function(n, obj){
10 var d = new Date(0);
11 d.setUTCSeconds(obj.value.date);
12 d = d.getDate() + "/" + (d.getMonth() + 1) + "/" + d.getFullYear();
14 var evidence = [],
15 date = obj.value.date * 1000;
16 if(typeof(obj.value.attachments) != undefined && obj.value.attachments != undefined) {
17 for(var attachment in obj.value.attachments) {
18 evidence.push(attachment);
19 }
20 }
1321 var v = {
14 "id": obj.id,
15 "rev": obj.value.rev,
16 "couch_parent": obj.value.parent,
17 "data": obj.value.data,
18 "date": d,
19 "delete": false,
20 "desc": obj.value.desc,
21 "meta": obj.value.meta,
22 "name": obj.value.name,
23 "oid": obj.value.oid,
24 "owned": obj.value.owned,
25 "owner": obj.value.owner,
26 "parent": obj.key.substring(0, obj.key.indexOf('.')),
27 "refs": obj.value.refs,
28 "selected": false,
29 "severity": obj.value.severity,
30 "type": obj.value.type,
31 "web": true,
22 "id": obj.id,
23 "rev": obj.value.rev,
24 "attachments": evidence,
25 "couch_parent": obj.value.parent,
26 "data": obj.value.data,
27 "date": date,
28 "delete": false,
29 "desc": obj.value.desc,
30 "easeofresolution": obj.value.easeofresolution,
31 "impact": obj.value.impact,
32 "meta": obj.value.meta,
33 "name": obj.value.name,
34 "oid": obj.value.oid,
35 "owned": obj.value.owned,
36 "owner": obj.value.owner,
37 "parent": obj.key.substring(0, obj.key.indexOf('.')),
38 "refs": obj.value.refs,
39 "resolution": obj.value.resolution,
40 "selected": false,
41 "severity": obj.value.severity,
42 "type": obj.value.type,
43 "web": true,
3244 /*** specific fields of web vulns ***/
33 "method": obj.value.method,
34 "params": obj.value.params,
35 "path": obj.value.path,
36 "pname": obj.value.pname,
37 "query": obj.value.query,
38 "request": obj.value.request,
39 "response": obj.value.response,
40 "website": obj.value.website
45 "method": obj.value.method,
46 "params": obj.value.params,
47 "path": obj.value.path,
48 "pname": obj.value.pname,
49 "query": obj.value.query,
50 "request": obj.value.request,
51 "response": obj.value.response,
52 "website": obj.value.website
4153 };
4254 vulns.push(v);
4355 });
4860 vulnsWebFact.put = function(ws, vuln, callback) {
4961 var url = BASEURL + ws + "/" + vuln.id;
5062 var v = {
51 "_rev": vuln.rev,
52 "data": vuln.data,
53 "desc": vuln.desc,
54 "metadata": vuln.meta,
55 "name": vuln.name,
56 "obj_id": vuln.oid,
57 "owned": vuln.owned,
58 "owner": vuln.owner,
59 "parent": vuln.couch_parent,
60 "refs": vuln.refs,
61 "severity": vuln.severity,
62 "type": vuln.type,
63 "_rev": vuln.rev,
64 "data": vuln.data,
65 "desc": vuln.desc,
66 "easeofresolution": vuln.easeofresolution,
67 "impact": vuln.impact,
68 "metadata": vuln.meta,
69 "name": vuln.name,
70 "obj_id": vuln.oid,
71 "owned": vuln.owned,
72 "owner": vuln.owner,
73 "parent": vuln.couch_parent,
74 "refs": vuln.refs,
75 "resolution": vuln.resolution,
76 "severity": vuln.severity,
77 "type": vuln.type,
6378 /*** specific fields of web vulns ***/
64 "method": vuln.method,
65 "params": vuln.params,
66 "path": vuln.path,
67 "pname": vuln.pname,
68 "query": vuln.query,
69 "request": vuln.request,
70 "response": vuln.response,
71 "website": vuln.website
79 "method": vuln.method,
80 "params": vuln.params,
81 "path": vuln.path,
82 "pname": vuln.pname,
83 "query": vuln.query,
84 "request": vuln.request,
85 "response": vuln.response,
86 "website": vuln.website
7287 };
73 $http.put(url, v).success(function(d, s, h, c) {
74 callback(d.rev);
75 });
88 if(typeof(vuln.evidence) != undefined && vuln.evidence != undefined) {
89 // the list of evidence may have mixed objects, some of them already in CouchDB, some of them new
90 // new attachments are of File type and need to be processed by attachmentsFact.loadAttachments
91 // old attachments are of type String (file name) and need to be processed by attachmentsFact.getStubs
92 var stubs = [],
93 files = [],
94 names = [],
95 promises = [];
96 v._attachments = {};
97
98 for(var name in vuln.evidence) {
99 if(vuln.evidence[name] instanceof File) {
100 files.push(vuln.evidence[name]);
101 } else {
102 stubs.push(name);
103 }
104 }
105
106 if(stubs.length > 0) promises.push(attachmentsFact.getStubs(ws, vuln.id, stubs));
107 if(files.length > 0) promises.push(attachmentsFact.loadAttachments(files));
108
109 $q.all(promises).then(function(result) {
110 result.forEach(function(atts) {
111 for(var name in atts) {
112 v._attachments[name] = atts[name];
113 names.push(name);
114 }
115 });
116 $http.put(url, v).success(function(d, s, h, c) {
117 callback(d.rev, names);
118 });
119 });
120 } else {
121 $http.put(url, v).success(function(d, s, h, c) {
122 callback(d.rev, []);
123 });
124 }
76125 };
77126
78127 vulnsWebFact.remove = function(ws, vuln) {
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .controller('workspacesCtrl', ['$scope', 'workspacesFact', function($scope, workspacesFact) {
2 workspacesFact.get(function(wss) {
5 .controller('workspacesCtrl', ['$modal', '$scope', '$q', 'workspacesFact', 'dashboardSrv',
6 function($modal, $scope, $q, workspacesFact, dashboardSrv) {
7 $scope.workspaces = [];
8 $scope.wss = [];
9 $scope.objects = {};
10 // $scope.newworkspace = {};
11
12 $scope.onSuccessGet = function(workspace){
13 if(workspace.sdate.toString().indexOf(".") != -1) workspace.sdate = workspace.sdate * 1000;
14 $scope.workspaces.push(workspace);
15 };
16
17 $scope.onSuccessInsert = function(workspace){
18 workspace.sdate = workspace.sdate;
19 $scope.wss.push(workspace.name);
20 $scope.workspaces.push(workspace);
21 };
22
23 $scope.onFailInsert = function(error){
24 var modal = $modal.open({
25 templateUrl: 'scripts/partials/modal-ko.html',
26 controller: 'modalKoCtrl',
27 resolve: {
28 msg: function() {
29 return error;
30 }
31 }
32 });
33 };
34
35 $scope.onSuccessEdit = function(workspace){
36 for(var i = 0; i < $scope.workspaces.length; i++) {
37 if($scope.workspaces[i].name == workspace.name){
38 $scope.workspaces[i].description = workspace.description;
39 break;
40 }
41 };
42 };
43
44 $scope.onSuccessDelete = function(workspace_name){
45 remove = function(arr, item) {
46 for(var i = arr.length; i--;) {
47 if(arr[i] === item) {
48 arr.splice(i, 1);
49 }
50 }
51 return arr;
52 };
53
54 $scope.wss = remove($scope.wss, workspace_name);
55 for(var i = 0; i < $scope.workspaces.length; i++) {
56 if($scope.workspaces[i].name == workspace_name){
57 $scope.workspaces.splice(i, 1);
58 break;
59 }
60 };
61 };
62
63 // todo: refactor the following code
64 workspacesFact.list().then(function(wss) {
365 $scope.wss = wss;
66 var objects = {};
67 $scope.wss.forEach(function(ws){
68 workspacesFact.get(ws, $scope.onSuccessGet);
69 objects[ws] = dashboardSrv.getObjectsCount(ws);
70 });
71 $q.all(objects).then(function(os) {
72 for(var workspace in os) {
73 if(os.hasOwnProperty(workspace)) {
74 $scope.objects[workspace] = {
75 "total vulns": "-",
76 "hosts": "-",
77 "services": "-"
78 };
79 os[workspace].forEach(function(o) {
80 $scope.objects[workspace][o.key] = o.value;
81 });
82 }
83 }
84 });
485 });
86
87 var hash_tmp = window.location.hash.split("/")[1];
88 switch (hash_tmp){
89 case "status":
90 $scope.hash = "status";
91 break;
92 case "dashboard":
93 $scope.hash = "dashboard";
94 break;
95 default:
96 $scope.hash = "";
97 }
98
99
100 $scope.insert = function(workspace){
101 delete workspace.selected;
102 workspacesFact.put(workspace).then(function(resp){
103 $scope.onSuccessInsert(workspace)
104 },
105 $scope.onFailInsert);
106 };
107
108 $scope.update = function(workspace){
109 workspacesFact.update(workspace, $scope.onSuccessEdit);
110 };
111
112 $scope.remove = function(workspace_name){
113 workspacesFact.delete(workspace_name, $scope.onSuccessDelete);
114 };
115
116 // Modals methods
117 $scope.new = function(){
118
119 $scope.modal = $modal.open({
120 templateUrl: 'scripts/workspaces/partials/modal-new.html',
121 controller: 'workspacesCtrl',
122 scope: $scope,
123 size: 'lg'
124 });
125
126 $scope.modal.result.then(function(workspace) {
127 workspace = $scope.create(workspace.name, workspace.description);
128 $scope.insert(workspace);
129 });
130
131 };
132
133 $scope.okNew = function(){
134 $scope.modal.close($scope.newworkspace);
135 };
136
137 $scope.edit = function(){
138 var selected = false;
139 $scope.workspaces.forEach(function(w) {
140 if(w.selected) {
141 selected = true;
142 return;
143 }
144 });
145
146 if(selected){
147 $scope.workspaces.forEach(function(w){
148 if(w.selected){
149 $scope.newworkspace = w;
150 }
151 });
152 $scope.modal = $modal.open({
153 templateUrl: 'scripts/workspaces/partials/modal-edit.html',
154 controller: 'workspacesCtrl',
155 scope: $scope,
156 size: 'lg'
157 });
158
159 $scope.modal.result.then(function(workspace) {
160 $scope.update(workspace);
161 });
162 } else {
163 var modal = $modal.open({
164 templateUrl: 'scripts/partials/modal-ko.html',
165 controller: 'modalKoCtrl',
166 resolve: {
167 msg: function() {
168 return 'No workspaces were selected to edit';
169 }
170 }
171 });
172 }
173
174 };
175
176 $scope.okEdit = function(){
177 $scope.modal.close($scope.newworkspace);
178 };
179
180
181 $scope.cancel = function(){
182 $scope.modal.close();
183 };
184
185 $scope.delete = function(){
186 var selected = false;
187
188 $scope.workspaces.forEach(function(w) {
189 if(w.selected) {
190 selected = true;
191 return;
192 }
193 });
194
195 if(selected){
196 $scope.modal = $modal.open({
197 templateUrl: 'scripts/workspaces/partials/modal-delete.html',
198 controller: 'workspacesCtrl',
199 scope: $scope,
200 size: 'lg'
201 });
202
203 $scope.modal.result.then(function() {
204 $scope.workspaces.forEach(function(w){
205 if(w.selected == true)
206 $scope.remove(w.name);
207 });
208 });
209 } else {
210 var modal = $modal.open({
211 templateUrl: 'scripts/partials/modal-ko.html',
212 controller: 'modalKoCtrl',
213 resolve: {
214 msg: function() {
215 return 'No workspaces were selected to delete';
216 }
217 }
218 });
219 }
220 };
221 // This is in the modal context only
222 $scope.okDelete = function(){
223 $scope.modal.close();
224 };
225 // end of modal context
226
227 $scope.create = function(wname, wdesc){
228 workspace = {
229 "_id": wname,
230 "_rev": "2-bd88abf79cf2b7e8b419cd4387c64bef",
231 "customer": "",
232 "sdate": (new Date).getTime(),
233 "name": wname,
234 "fdate": undefined,
235 "type": "Workspace",
236 "children": [
237 ],
238 "description": wdesc
239 };
240 return(workspace);
241
242 };
5243 }]);
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <form novalidate>
5 <section id="main" class="seccion clearfix">
6 <div class="right-main"><div id="reports-main" class="fila clearfix">
7 <h2 class="ws-label">
8 <span id="ws-name" class="label label-default"
9 title="Workspaces">Workspaces</span><!-- WS name -->
10 <button id="delete" type="button" class="btn btn-default" title="Delete selected Workspaces" ng-click="delete()">
11 <span class="glyphicon glyphicon-trash"></span>
12 Delete
13 </button>
14 <button id="merge" type="button" class="btn btn-default" title="Edit selected Workspaces" ng-click="edit()">
15 <span class="glyphicon glyphicon-pencil"></span>
16 Edit
17 </button>
18 <button id="merge" type="button" class="btn btn-success" title="New Workspace" ng-click="new()">
19 <span class="glyphicon glyphicon-plus-sign"></span>
20 New
21 </button>
22 </h2><!-- .ws-label -->
23 <div class="reports">
24 <table class="status-report table table-responsive">
25 <thead>
26 <tr>
27 <th>Name</th>
28 <th>Vulns</th>
29 <th>Hosts</th>
30 <th>Services</th>
31 </tr>
32 </thead>
33 <tbody>
34 <tr ng-repeat="ws in workspaces | filter:query | orderBy:sortField:reverse"
35 selection-model selection-model-selected-class="multi-selected">
36 <td><span ng-class-even="'label label-unclassified'" ng-class-odd="'label label-high'">{{ws.name}}</span></td>
37 <td ng-bind="objects[ws.name]['total vulns']"></td>
38 <td ng-bind="objects[ws.name]['hosts']"></td>
39 <td ng-bind="objects[ws.name]['services']"></td>
40 </tr>
41 </tbody>
42 </table><!-- #hosts -->
43 </div><!-- .reports -->
44 </div><!-- #reports-main --></div><!-- .right-main -->
45 </section><!-- #main -->
46 </form>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <h3 class="modal-title">Workspace Delete</h3>
6 </div>
7 <div class="modal-body">
8 <h5>You are about to remove {{workspacesCtrl.selectedItems.length}} Workspaces. Proceed?</h5>
9 </div><!-- .modal-body -->
10 <div class="modal-footer">
11 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
12 <button class="btn btn-success" ng-click="okDelete()">OK</button>
13 </div>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <div class="modal-button">
6 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
7 <button class="btn btn-success" ng-click="okEdit()">OK</button>
8 </div>
9 <h3 class="modal-title">Edit Workspace: {{newworkspace.name}}</h3>
10 </div>
11 <div class="modal-body">
12 <div class="form-horizontal">
13 <div class="form-group">
14 <div class="col-md-12">
15 <label class="sr-only" for="vuln-desc">Workspace Description</label>
16 <textarea class="form-control" id="vuln-desc"
17 placeholder="Description" value={{newworkspace.description}}
18 ng-model="newworkspace.description" required></textarea>
19 </div>
20 </div><!-- .form-group -->
21 </div><!-- .form-horizontal -->
22 </div><!-- .modal-body -->
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <form name="form" novalidate>
5 <div class="modal-header">
6 <div class="modal-button">
7 <button class="btn btn-danger" ng-click="cancel()">Cancel</button>
8 <button class="btn btn-success" ng-disabled="form.$invalid" ng-click="okNew()">Save</button>
9 </div>
10 <h3 class="modal-title">New Workspace</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 <label class="sr-only" for="wsp-name">Workspace Name</label>
17 <input type="text" class="form-control"
18 ng-pattern=/^[a-z][a-z0-9\_\$\(\)\+\-\/]*$/ id="vuln-name" placeholder="Workspace Name"
19 ng-model="newworkspace.name" required/>
20 <div ng-if="form.$invalid">
21 <div class="alert alert-danger target_not_selected" role="alert" ng-hide="">
22 <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
23 <span class="sr-only">Error:</span>
24 <button type="button" class="close" data-dismiss="alert"><span area-hidden="true">&times;</span><span class="sr-only">Close</span></button>
25 Workspace name should follow pattern [a-z][a-z0-9_$()+-/]*
26 </div>
27 </div>
28 </div>
29 <div class="col-md-12">
30 <label class="sr-only" for="vuln-desc">Workspace Description</label>
31 <textarea class="form-control" id="vuln-desc"
32 placeholder="Description" ng-model="newworkspace.description"
33 >
34 </textarea>
35 </div>
36 </div><!-- .form-group -->
37 </div><!-- .form-horizontal -->
38 </div><!-- .modal-body -->
39 </form>
0 <!-- Faraday Penetration Test IDE -->
1 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
2 <!-- See the file 'doc/LICENSE' for the license information -->
3
4 <div class="modal-header">
5 <h3 class="modal-title">Oops!</h3>
6 </div>
7 <div class="modal-body">
8 <h5>{{ msg }}</h5>
9 </div><!-- .modal-body -->
10 <div class="modal-footer">
11 <button class="btn btn-success" ng-click="ok()">OK</button>
12 </div>
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
04 angular.module('faradayApp')
1 .factory('workspacesFact', ['BASEURL', '$http', function(BASEURL, $http) {
5 .factory('workspacesFact', ['BASEURL', '$http', '$q', function(BASEURL, $http, $q) {
26 var workspacesFact = {};
37
4 workspacesFact.get = function(callback) {
8 workspacesFact.list = function() {
9 var url = BASEURL + "_all_dbs",
10 deferred = $q.defer();
11 deferred.resolve(
12 $http.get(url).
13 then(filterReservedWorkspaces, errorHandler).
14 then(filterInaccesibleWorkspaces, errorHandler)
15 );
16 return deferred.promise;
17 };
518
6 var url = BASEURL + "_all_dbs";
7 $http.get(url).success(function(d, s, h, c) {
8 var wss = d.filter(function(ws) {
9 return ws.search(/^_/) < 0 && ws.search("reports") < 0;
10 });
11 callback(wss);
19 filterReservedWorkspaces = function(wss) {
20 var deferred = $q.defer();
21 deferred.resolve(wss.data.filter(function(ws) {
22 return ws.search(/^_/) < 0 && ws.search("cwe") < 0 && ws.search("reports") < 0;
23 }));
24 return deferred.promise;
25 };
26
27 filterInaccesibleWorkspaces = function(wss) {
28 var workspaces = [],
29 deferred = $q.defer();
30 wss.forEach(function(ws) {
31 workspaces.push($http.get(BASEURL + ws).then(returnStatus, returnStatus));
32 });
33 $q.all(workspaces).then(function(resp) {
34 deferred.resolve(wss.filter(function(ws, index) {
35 return resp[index] == 200;
36 }));
37 });
38 return deferred.promise;
39 };
40
41 returnStatus = function(data) {
42 return $q.when(data.status);
43 };
44
45 workspacesFact.get = function(workspace_name, onSuccess) {
46 return $http.get(BASEURL + workspace_name + '/' + workspace_name).
47 success(function(data, status, headers, config) {
48 onSuccess(data);
1249 });
1350 };
1451
52 workspacesFact.exists = function(workspace_name) {
53 var request = {
54 method: 'HEAD',
55 url: BASEURL + workspace_name
56 };
57 var exists_workspace = false;
58 return $http(request).success(function(data) {
59 exists_workspace = true;
60 });
61 };
62
63 errorHandler = function(response) {
64 return $q.reject(response.data.reason.replace("file", "workspace"));
65 };
66
67 workspacesFact.put = function(workspace) {
68 return createDatabase(workspace).
69 then(function(resp) { createWorkspaceDoc(resp, workspace); }, errorHandler).
70 then(function(resp) { uploadDocs(workspace.name); }, errorHandler);
71 };
72
73 createDatabase = function(workspace){
74 return $http.put(BASEURL + workspace.name, workspace);
75 };
76
77 createWorkspaceDoc = function(response, workspace){
78 $http.put(BASEURL + workspace.name + '/' + workspace.name, workspace).
79 success(function(data){
80 workspace._rev = response.data.rev;
81 }).
82 error(function(data) {
83 errorHandler;
84 });
85 };
86
87 uploadDocs = function(workspace) {
88 var files = {},
89 reports = BASEURL + 'reports/_design/reports';
90 $http.get(reports).
91 success(function(data) {
92 var attachments = data._attachments;
93 if(Object.keys(attachments).length > 0) {
94 for(var prop in attachments) {
95 if(attachments.hasOwnProperty(prop)) {
96 if(prop.indexOf("views/") > -1) {
97 files[prop] = $http.get(reports + "/" + prop);
98 }
99 }
100 }
101 }
102 $q.all(files).then(function(resp) {
103 var bulk = {docs:[]};
104 for(var file in files) {
105 if(files.hasOwnProperty(file)) {
106 var views = [],
107 parts = file.split("/"),
108 component = parts[1],
109 type = parts[2],
110 name = parts[3],
111 filename = parts[4].split(".")[0],
112 docIndex = indexOfDocument(bulk.docs, "_design/"+component);
113
114 if(docIndex == -1) {
115 bulk.docs.push({
116 _id: "_design/"+component,
117 language: "javascript",
118 views: {}
119 });
120 docIndex = bulk.docs.length - 1;
121 }
122
123 if(!bulk["docs"][docIndex]["views"].hasOwnProperty(name)) {
124 bulk["docs"][docIndex]["views"][name] = {};
125 }
126
127 bulk["docs"][docIndex]["views"][name][filename] = resp[file]["data"];
128 }
129 }
130 $http.post(BASEURL + workspace + "/_bulk_docs", JSON.stringify(bulk));
131 }, errorHandler);
132 }).
133 error(function(data) {
134 errorHandler;
135 });
136 };
137
138 indexOfDocument = function(list, name) {
139 var ret = -1;
140 list.forEach(function(item, index) {
141 if(item._id == name) {
142 ret = index;
143 }
144 });
145 return ret;
146 };
147
148 workspacesFact.update = function(workspace, onSuccess) {
149 document_url = BASEURL + workspace.name + '/' + workspace.name + '?rev=' + workspace._rev;
150 return $http.put(document_url, workspace).success(function(data){
151 workspace._rev = data.rev;
152 onSuccess(workspace);
153 });
154 };
155
156 workspacesFact.delete = function(workspace_name, onSuccess) {
157 var request = {
158 method: 'DELETE',
159 url: BASEURL + workspace_name
160 };
161 return $http(request).success(function(data) {
162 onSuccess(workspace_name);
163 });
164 };
15165 return workspacesFact;
16166 }]);
0 /* Faraday Penetration Test IDE */
1 /* Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) */
2 /* See the file 'doc/LICENSE' for the license information */
3
04 body {
15 font-family: 'Open Sans', sans-serif;
26 font-size: 12px;
0 <!-- Faraday Penetration Test IDE &#45; Community Version -->
0 <!-- Faraday Penetration Test IDE -->
11 <!-- Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/) -->
22 <!-- See the file 'doc/LICENSE' for the license information -->
33 <!DOCTYPE html>
171171 });
172172 $(document).on("click", "a.status-report", function(e) {
173173 e.preventDefault();
174 var url = "../././reports/faraday.html#/status/ws/" + workspace;
174 var url = "../././reports/index.html#/status/ws/" + workspace;
175175 window.location.href = url;
176176 });
177177
0 // Faraday Penetration Test IDE
1 // // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="CommandRunInformation"){
5 key = doc.command + " " + doc.params;
6 emit(key, {"startdate": doc.itime, "duration": doc.duration, "hostname": doc.hostname, "user": doc.user, "ip": doc.ip});
7 }
8 }
0 cuenta cantidad de interfaces por host, devuelve idHost, cant
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Interface"){
5 if(doc.parent != 'null') {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, 1);
8 }
9 }
10 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
0 cuenta cantidad de servicios por host, devuelve idHost, cant
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 if(doc.type=="Service" & (doc.status =='open' | doc.status =='running')){
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, 1);
8 }
9 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4 return values.reduce(function(previousValue, currentValue, index, array){
5 return previousValue + currentValue;
6 });
7 }
0 cuenta cantidad de servicios totales, devuelve nombreServicio, cant
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null' & (doc.status =='open' | doc.status =='running')) {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(doc.name, 1);
8 }
9 }
10 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
0 cuenta hosts totales, devuelve idHost, nombreHost
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Host"){
5 emit(doc._id, {"name": doc.name, "os": doc.os, "owned": doc.owned});
6 }
7 }
0 cuenta cantidad de items totales, nombreItem, cant para Services, Serv owned, Hosts, Hosts owned, Interfaces, Notes, Total Vulnerabilities, Web Vulns, Common Vulns
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service") {
5 emit("services", 1);
6 } else if(doc.type=="Service" && doc.owned == "True") {
7 emit("services owned", 1);
8 } else if(doc.type=="Host") {
9 emit("hosts", 1);
10 } else if(doc.type=="Host" && doc.owned == "True") {
11 emit("hosts owned", 1);
12 } else if(doc.type=="Interface") {
13 emit("interfaces", 1);
14 } else if(doc.type=="Note") {
15 emit("notes", 1);
16 } else if(doc.type=="VulnerabilityWeb" || doc.type=="Vulnerability") {
17 if(doc.type=="VulnerabilityWeb") {
18 emit("web vulns", 1);
19 } else {
20 emit("vulns", 1);
21 }
22 emit("total vulns", 1);
23 }
24 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function (key, values) {
4
5 return values.reduce(function(previousValue, currentValue, index, array){
6 return previousValue + currentValue;
7 });
8
9 }
0 cuenta vulnerabilidades por prioridad, devuelve idPrioridad, cant donde idPrioridad esta entre 0 y 4 (info, low, medium, high, critical y 5 unclassified)
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 if(doc.type=="Vulnerability" || doc.type=="VulnerabilityWeb") {
6 emit(doc.severity, 1);
7 }
8 }
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 function (key, values) {
6
7 return values.reduce(function(previousValue, currentValue, index, array){
8 return previousValue + currentValue;
9 });
10
11 }
0 Get the documents grouped by parent.
1
2 The mapper needs to get the documents owned by some parent
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 parent = doc.parent
6 emit(parent, {'_id': doc._id, 'type': doc.type});
7 }
0 Get the documents grouped by parent and type.
1
2 The mapper needs to get the documents owned by some parent, and of some kind (type)
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc) {
5 var parent = "None"
6 if (doc.parent) {
7 parent = doc.parent
8 }
9 emit([parent, doc.type], doc._id);
10 }
0 trae todos los servicios que tienen padre y usa como key el ID del host padre
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null') {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(hid, {"name": doc.name,
8 "description": doc.description,
9 "protocol": doc.protocol,
10 "ports": doc.ports,
11 "status": doc.status,
12 "owned": doc.owned,
13 "hid": hid});
14 }
15 }
16 }
0 trae todos los servicios que tienen padre y usa como key el nombre del servicio
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type=="Service"){
5 if(doc.parent != 'null' & (doc.status =='open' | doc.status =='running')) {
6 var hid = doc._id.substring(0, doc._id.indexOf('.'));
7 emit(doc.name, {"name": doc.name,
8 "description": doc.description,
9 "protocol": doc.protocol,
10 "ports": doc.ports,
11 "status": doc.status,
12 "owned": doc.owned,
13 "hid": hid});
14 }
15 }
16 }
0 retrieve all docs except design docs
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 function(doc){
5 emit(doc._id, doc);
6 }
0 gets all vulns from workspace, regardless of their type (regular/web).
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "Vulnerability" || doc.type == "VulnerabilityWeb"){
5 var easeofresolution = "trivial",
6 impact = {
7 "accountability": 0,
8 "availability": 0,
9 "confidentiality": 0,
10 "integrity": 0
11 },
12 resolution = "";
13 if(doc.easeofresolution != "undefined" && typeof(doc.easeofresolution) != "undefined") {
14 easeofresolution = doc.easeofresolution;
15 }
16 if(doc.impact != "undefined" && typeof(doc.impact) != "undefined") {
17 impact = doc.impact;
18 }
19 if(doc.resolution != "undefined" && typeof(doc.resolution) != "undefined") {
20 resolution = doc.resolution;
21 }
22
23 var obj = {
24 "rev": doc._rev,
25 "attachments": doc._attachments,
26 "data": doc.data,
27 "date": doc.metadata.create_time,
28 "desc": doc.desc,
29 "easeofresolution": easeofresolution,
30 "impact": impact,
31 "meta": doc.metadata,
32 "name": doc.name,
33 "oid": doc.obj_id,
34 "owned": doc.owned,
35 "owner": doc.owner,
36 "path": doc.path,
37 "parent": doc.parent,
38 "refs": doc.refs,
39 "resolution": resolution,
40 "severity": doc.severity,
41 "status": doc.type,
42 "website": doc.website
43 };
44 emit(doc._id, obj);
45 }
46 }
0 gets all vulnerabilities from workspace, except web ones.
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "Vulnerability"){
5 var easeofresolution = "trivial",
6 impact = {
7 "accountability": 0,
8 "availability": 0,
9 "confidentiality": 0,
10 "integrity": 0
11 },
12 resolution = "";
13 if(doc.easeofresolution != "undefined" && typeof(doc.easeofresolution) != "undefined") {
14 easeofresolution = doc.easeofresolution;
15 }
16 if(doc.impact != "undefined" && typeof(doc.impact) != "undefined") {
17 impact = doc.impact;
18 }
19 if(doc.resolution != "undefined" && typeof(doc.resolution) != "undefined") {
20 resolution = doc.resolution;
21 }
22
23 var obj = {
24 "rev": doc._rev,
25 "attachments": doc._attachments,
26 "data": doc.data,
27 "date": doc.metadata.create_time,
28 "desc": doc.desc,
29 "easeofresolution": easeofresolution,
30 "impact": impact,
31 "meta": doc.metadata,
32 "name": doc.name,
33 "oid": doc.obj_id,
34 "owned": doc.owned,
35 "owner": doc.owner,
36 "parent": doc.parent,
37 "refs": doc.refs,
38 "resolution": resolution,
39 "severity": doc.severity,
40 "type": doc.type
41 };
42 emit(doc._id, obj);
43 }
44 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3 function(doc) {
4 if(doc.type == "VulnerabilityWeb"){
5 var easeofresolution = "trivial",
6 impact = {
7 "accountability": 0,
8 "availability": 0,
9 "confidentiality": 0,
10 "integrity": 0
11 },
12 resolution = "";
13 if(doc.easeofresolution != "undefined" && typeof(doc.easeofresolution) != "undefined") {
14 easeofresolution = doc.easeofresolution;
15 }
16 if(doc.impact != "undefined" && typeof(doc.impact) != "undefined") {
17 impact = doc.impact;
18 }
19 if(doc.resolution != "undefined" && typeof(doc.resolution) != "undefined") {
20 resolution = doc.resolution;
21 }
22
23 var obj = {
24 "rev": doc._rev,
25 "attachments": doc._attachments,
26 "data": doc.data,
27 "date": doc.metadata.create_time,
28 "desc": doc.desc,
29 "easeofresolution": easeofresolution,
30 "impact": impact,
31 "meta": doc.metadata,
32 "name": doc.name,
33 "oid": doc.obj_id,
34 "owned": doc.owned,
35 "owner": doc.owner,
36 "parent": doc.parent,
37 "refs": doc.refs,
38 "resolution": resolution,
39 "severity": doc.severity,
40 "type": doc.type,
41 /*** specific fields of web vulns ***/
42 "method": doc.method,
43 "params": doc.params,
44 "path": doc.path,
45 "pname": doc.pname,
46 "query": doc.query,
47 "request": doc.request,
48 "response": doc.response,
49 "website": doc.website
50 };
51 emit(doc._id, obj);
52 }
53 }
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 describe('workspacesCtrl', function() {
5 var $controller,
6 $scope;
7
8 var $workspacesFact,
9 workspacesFactMock;
10
11 var spyOnPutFactory;
12
13 spyOnPutFactory = jasmine.createSpy('Put Workspace Factory Spy');
14 spyOnDeleteFactory = jasmine.createSpy('Delete Workspace Factory Spy');
15 spyOnExistsFactory = jasmine.createSpy('Delete Workspace Factory Spy');
16 spyOnExistsFactory('test_workspace', function(){
17 return false;
18 });
19
20
21
22 beforeEach(function () {
23 workspacesFactMock = {
24 list: function(callback) {
25 callback(['ws1', 'ws2']);
26 },
27 get: function(workspace_name, onSuccess){
28 workspace = {
29 "_id": workspace_name,
30 "_rev": "2-bd88abf79cf2b7e8b419cd4387c64bef",
31 "customer": "",
32 "sdate": 1410832741.48194,
33 "name": workspace_name,
34 "fdate": 1410832741.48194,
35 "type": "Workspace",
36 "children": [
37 ],
38 "description": ""
39 };
40 onSuccess(workspace);
41 },
42 put: spyOnPutFactory,
43 delete: function(workspace, onSuccess) {
44 onSuccess(workspace);
45 },
46 exists: function(workspace_name){
47 return false;
48 }
49
50 };
51 module('faradayApp');
52 module(function($provide){
53 $provide.value('workspacesFact', workspacesFactMock);
54 });
55
56 inject(function(_$rootScope_, _$controller_, _workspacesFact_){
57 // The injector unwraps the underscores (_) from around the parameter names when matching
58 $scope = _$rootScope_.$new();
59 $controller = _$controller_('workspacesCtrl',
60 { $scope: $scope, workspacesFact: _workspacesFact_});
61 });
62 });
63
64
65 describe('Workspaces load in $scope.wss', function() {
66 it('tests if wss is loaded properly', function() {
67 expect($scope.wss).toEqual(['ws1', 'ws2']);
68 expect($scope.workspaces.length).toEqual(2);
69 });
70 });
71
72 describe('Workspaces inserts in $scope.wss', function() {
73 it('tests if duplicated inserts are avoided', function() {
74 // Replace the mock exists function
75 // to return that the workspace 'tuvieja' exists
76 workspacesFactMock.exists = function(workspace_name){ return true;};
77 workspace_name = 'tuvieja';
78 workspace = {
79 "_id": workspace_name,
80 "_rev": "2-bd88abf79cf2b7e8b419cd4387c64bef",
81 "customer": "",
82 "sdate": 1410832741.48194,
83 "name": workspace_name,
84 "fdate": 1410832741.48194,
85 "type": "Workspace",
86 "children": [
87 ],
88 "description": ""
89 };
90 $scope.insert(workspace);
91
92 expect($scope.wss).not.toContain(workspace_name);
93 expect($scope.wss.length).toEqual(2);
94 expect(spyOnPutFactory).not.toHaveBeenCalledWith(workspace);
95 });
96 it('tests if wss is updated properly', function() {
97 workspace_name = 'test_workspace';
98 workspace = {
99 "_id": workspace_name,
100 "_rev": "2-bd88abf79cf2b7e8b419cd4387c64bef",
101 "customer": "",
102 "sdate": 1410832741.48194,
103 "name": workspace_name,
104 "fdate": 1410832741.48194,
105 "type": "Workspace",
106 "children": [
107 ],
108 "description": ""
109 };
110 $scope.insert(workspace);
111
112 // http://jasmine.github.io/1.3/introduction.html#section-Matchers
113 expect(spyOnPutFactory).toHaveBeenCalledWith(workspace, $scope.onSuccessInsert);
114 });
115 });
116 describe('Workspaces removal in $scope.wss', function() {
117 it('tests if workspaces in scope.wss are removed ', function() {
118
119 $scope.remove('ws1');
120 expect($scope.wss).not.toContain('ws1');
121 expect($scope.workspaces['ws1']).not.toBeDefined();
122 });
123 });
124
125 describe('Workspaces object creation ', function() {
126 it('tests if workspaces create object is consistent', function() {
127 workspace = $scope.create('wname','wdesc');
128 workspace_properties = Object.keys(workspace);
129 expect(workspace_properties).toContain('_id');
130 expect(workspace_properties).toContain('name');
131 expect(workspace_properties).toContain('description');
132 expect(workspace_properties).toContain('customer');
133 expect(workspace_properties).toContain('sdate');
134 expect(workspace_properties).toContain('fdate');
135 expect(workspace_properties).toContain('type');
136 expect(workspace_properties).toContain('children');
137
138 expect(workspace.name).toEqual('wname');
139 expect(workspace._id).toEqual('wname');
140 expect(workspace.description).toEqual('wdesc');
141 });
142 });
143 });
144
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 describe('workspacesFact', function() {
5 var $httpBackend, createFactory;
6
7 // Set up the module
8 beforeEach(module('faradayApp'));
9
10 beforeEach(inject(function($injector) {
11 // Set up the mock http service responses
12 $httpBackend = $injector.get('$httpBackend');
13 var $workspacesFact = $injector.get('workspacesFact');
14
15 createFactory = function() {
16 return $injector.get('workspacesFact', {'BASEURL' : 'http://localhost:9876/',
17 '$http': $httpBackend});
18 };
19 }));
20
21
22 afterEach(function() {
23 $httpBackend.verifyNoOutstandingExpectation();
24 $httpBackend.verifyNoOutstandingRequest();
25 });
26
27 describe('Workspaces Service CRUD', function() {
28 it('Tests if factory is well created', function() {
29 fact = createFactory();
30 });
31
32 it('Tests if existence is well asked', function() {
33 $httpBackend.when('HEAD', 'http://localhost:9876/tuvieja')
34 .respond(200, '');
35
36 $httpBackend.expectHEAD('http://localhost:9876/tuvieja');
37 fact = createFactory();
38 workspace_exists = fact.exists('tuvieja');
39 expect(workspace_exists).toBe(true);
40 $httpBackend.flush();
41 });
42
43 it('Tests if OK Inserts are well done', function() {
44 var workspace = {
45 "_id": "test_workspace",
46 "customer": "",
47 "sdate": 1415901244.040532,
48 "name": "test_workspace",
49 "fdate": 1415901244.040532,
50 "type": "Workspace",
51 "children": [
52 ],
53 "description": ""
54 };
55
56 $httpBackend.expectPUT('http://localhost:9876/test_workspace',
57 workspace).respond(200, {"ok": true});
58
59 $httpBackend.expectPUT('http://localhost:9876/test_workspace/test_workspace',
60 workspace).respond(200, {"ok": true});
61
62 fact = createFactory();
63 var workspace_exists = false;
64 onSuccess = function(){ workspace_exists = true;};
65
66 fact.put(workspace, onSuccess);
67 $httpBackend.flush();
68 expect(workspace_exists).toBe(true);
69 });
70
71 it('Tests if OK Delete are well done', function() {
72 $httpBackend.expectDELETE('http://localhost:9876/test_workspace').
73 respond(200, {"ok": true});
74
75 fact = createFactory();
76 var workspace_exists = true;
77 onSuccess = function(){ workspace_exists = false;};
78
79 workspace_exists = fact.delete('test_workspace', onSuccess);
80 $httpBackend.flush();
81 expect(workspace_exists).toBe(false);
82 });
83 });
84
85 });
0 // Faraday Penetration Test IDE
1 // Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
2 // See the file 'doc/LICENSE' for the license information
3
4 module.exports = function(config){
5 config.set({
6
7 basePath : './',
8
9 files : [
10 '../_attachments/script/jquery-1.11.2.js',
11 '../_attachments/script/angular.js',
12 // '../_attachments/script/angular-mocks.js',
13 '../_attachments/script/angular-route.js',
14 '../_attachments/script/angular-selection-model.js',
15 '../_attachments/script/*bootstrap*.js',
16 '../_attachments/scripts/app.js',
17 '../_attachments/scripts/**/*.js',
18 '../tests/faradayApp/components/**/*.js',
19 '../_attachments/script/angular-file-upload-shim.js',
20 '../_attachments/script/angular-file-upload.js'
21
22 ],
23
24 autoWatch : true,
25
26 frameworks: ['jasmine'],
27
28 browsers : ['Chrome'],
29
30 plugins : [
31 'karma-chrome-launcher',
32 'karma-firefox-launcher',
33 'karma-jasmine',
34 'karma-junit-reporter'
35 ],
36
37 junitReporter : {
38 outputFile: 'test_out/unit.xml',
39 suite: 'unit'
40 }
41
42 });
43 };
0 {
1 "name": "angular-seed",
2 "private": true,
3 "version": "0.0.0",
4 "description": "A starter project for AngularJS",
5 "repository": "https://github.com/angular/angular-seed",
6 "license": "MIT",
7 "devDependencies": {
8 "angular-mocks": "^1.3.0",
9 "http-server": "^0.6.1",
10 "jasmine-core": "^2.1.2",
11 "karma": "^0.12.28",
12 "karma-chrome-launcher": "^0.1.5",
13 "karma-jasmine": "^0.3.2",
14 "karma-junit-reporter": "^0.2.2",
15 "protractor": "^1.1.1",
16 "shelljs": "^0.2.6"
17 },
18 "scripts": {
19 "prestart": "npm install",
20 "start": "http-server -a localhost -p 8000 -c-1",
21 "pretest": "npm install",
22 "test": "node_modules/karma/bin/karma start karma.conf.js",
23 "test-single-run": "node_modules/karma/bin/karma start karma.conf.js --single-run",
24 "preupdate-webdriver": "npm install",
25 "update-webdriver": "webdriver-manager update",
26 "preprotractor": "npm run update-webdriver",
27 "protractor": "protractor e2e-tests/protractor.conf.js"
28 }
29 }
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 '''
00 #'''
1 #Faraday Penetration Test IDE - Community Version
1 #Faraday Penetration Test IDE
22 #Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
33 #See the file 'doc/LICENSE' for the license information
44 #
55 #'''
66
7
8 WORKSPACE=`cat $HOME/.faraday/config/user.xml | grep '<last_workspace' | cut -d '>' -f 2 | cut -d '<' -f 1`
9 STATUS=`curl -s 127.0.0.1:9977/status/check | sed "s/[^0-9]//g" | grep -v '^[[:space:]]*$'`
10 PS1="%{${fg_bold[red]}%}[faraday]($WORKSPACE)%{${reset_color}%} $PS1"
11
712 echo ">>> WELCOME TO FARADAY"
8 WORKSPACE=`cat $HOME/.faraday/config/user.xml | grep '<last_workspace' | cut -d '>' -f 2 | cut -d '<' -f 1`
9 PS1="%{${fg_bold[red]}%}[faraday]($WORKSPACE)%{${reset_color}%} $PS1"
13 echo "[+] Current Workspace: $WORKSPACE"
14 if [[ -z $STATUS ]]; then
15 echo "[-] API: Warning API unreachable"
16
17 elif [[ $STATUS == "200" ]]; then
18 echo "[+] API: OK"
19 else
20 echo "[!] API: $STATUS"
21
22 fi
1023
1124 setopt multios
1225 setopt histignorespace
00 #!/usr/bin/env python
11 '''
2 Faraday Penetration Test IDE - Community Version
2 Faraday Penetration Test IDE
33 Copyright (C) 2013 Infobyte LLC (http://www.infobytesec.com/)
44 See the file 'doc/LICENSE' for the license information
55